第3章 操作を伴うデータ構造

 

1.スタック

 

// Stack (LIFO: Last In First Out)

#include "stdafx.h"

#include "ctype.h"

#include "string.h"

#define MAXSTACK 500

char Stack[MAXSTACK][80];

char dt[80];    int StackPointer;

void charLower(char a[],char b[])

{       int i;

        for(i=0;a[i] !='\0';i++){

                if(islower(a[i])) b[i]=a[i];

                else b[i]=tolower(a[i]);

        }

        b[i]=0;

}

char *pop()

{       dt[0]='\0';

        if(StackPointer<=0)     printf("  **スタックが空です**\n");

        else                    strcpy(dt,Stack[--StackPointer]) ;

        return dt;

}

void push(char dt[])

{       if(StackPointer>=MAXSTACK) printf("  **スタックが満杯です**\n");

        else                       strcpy(Stack[StackPointer++],dt) ;

}

void dsp()

{       int i;printf("\n");

        for(i=StackPointer-1;i>=0;i--)

                printf("  Pt= %4d  String=%s\n",i,Stack[i]);

}

int main(int argc, char* argv[])

{   char inCmd[80],lowerCmd[80]; char *strDT;

        StackPointer=0;

        while( true)

        {       printf("\n  ** Input Operation ** push / pop / dsp / end : ");

                scanf("%s",inCmd);charLower(inCmd,lowerCmd);

                if     (strcmp(lowerCmd,"end")==0) break;

                else if(strcmp(lowerCmd,"dsp")==0) dsp();

                else if(strcmp(lowerCmd,"pop")==0) {

                        strDT=pop();printf("  **Pop Data : %s\n",strDT);

                }

                else if(strcmp(lowerCmd,"push")==0)     {

                        printf("  ** Input Push Data ** : ");

                        scanf("%s",inCmd);push(inCmd);

                }

                else printf("  **コマンド誤り**\n");

        }

return 0;

}

 


[実行イメージ]


2.待ち行列

 

// 単純なQue  [FIFO : First In First Out]

#include "stdafx.h"

#include "ctype.h"

#include "string.h"

efine MAXQUE 10

char Que[MAXQUE][80]; char dt[80]; int QuePointer;

void charLower(char a[],char b[])

{       int i;

        for(i=0;a[i] !='\0';i++){

                if(islower(a[i])) b[i]=a[i];

                else b[i]=tolower(a[i]);

        }

        b[i]=0;

}

char *deque()

{       dt[0]='\0';

        if(QuePointer<=0)       printf("  **キューが空です**\n");

        else{   strcpy(dt,Que[0]) ;     QuePointer--;

                        for(int i=0;i<QuePointer;i++) strcpy(Que[i],Que[i+1]);

                                                // すべての要素をずらす

        }

        return dt;

}

void enque(char dt[])

{       if(QuePointer>=MAXQUE)  printf("  **キューが満杯です**\n");

        else                    strcpy(Que[QuePointer++],dt) ;

}

void dsp()

{       int i;printf("\n");

        for(i=0; i<QuePointer;i++)

                printf("  Pt= %4d  String=%s\n",i,Que[i]);

}

int main(int argc, char* argv[])

{   char inCmd[80],lowerCmd[80]; char *strDT;

        QuePointer=0;

        while( true)

        {       printf("\n  ** Input Operation ** enque / deque / dsp / end : ");

                scanf("%s",inCmd);charLower(inCmd,lowerCmd);

                if     (strcmp(lowerCmd,"end")==0) break;

                else if(strcmp(lowerCmd,"dsp")==0) dsp();

                else if(strcmp(lowerCmd,"deque")==0) {

                        strDT=deque();printf("  *DeQue Data : %s\n",strDT);

                }

                else if(strcmp(lowerCmd,"enque")==0)    {

                        printf("  ** Input EnQue Data ** : ");

                        scanf("%s",inCmd);enque(inCmd);

                }

                else printf("  **コマンド誤り**\n");

        }

return 0;

}


[実行イメージ]

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 



[改良]サイクリックな待ち行列

 

#include "stdafx.h"

#include "ctype.h"

#include "string.h"

#define MAXQUE 10

char Que[MAXQUE][80];

char dt[80];int StartPointer,EndPointer;

void charLower(char a[],char b[])

{       int i;

        for(i=0;a[i] !='\0';i++){

 if(islower(a[i])) b[i]=a[i];

          else b[i]=tolower(a[i]);

}

        b[i]=0;

}

int CountP(int P){ P++; if(P>=MAXQUE) P= 0; return P;}

char *deque()

{       dt[0]='\0';

if(StartPointer==EndPointer) printf("  **キューが空です**\n");

        else{   strcpy(dt,Que[StartPointer]);

                StartPointer=CountP(StartPointer);}

return dt;

}

void enque(char dt[])

{       int P = CountP(EndPointer);

        if(P==StartPointer)printf("  **キューが満杯です**\n");

        else{   strcpy(Que[EndPointer],dt); EndPointer=P;}

}

void dsp()

{       int i;printf("\n");

        if(EndPointer==StartPointer)

                for(i=0;i<MAXQUE;i++) printf("  Pt= %4d  String=%s\n",i,"----");

        else if(EndPointer<StartPointer)

        {       for(i=0;i<EndPointer;i++)printf("  Pt= %4d  String=%s\n",i,Que[i]);

                for(i=EndPointer;i<StartPointer;i++)printf("  Pt= %4d  String=%s\n",i,"----");

                for(i=StartPointer;i<MAXQUE;i++)printf("  Pt= %4d  String=%s\n",i,Que[i]);

        }

        else

   {    for(i=0;i<StartPointer;i++)printf("  Pt= %4d  String=%s\n",i,"----");

                for(i=StartPointer;i<EndPointer;i++)printf("  Pt= %4d  String=%s\n",i,Que[i]);

                for(i=EndPointer;i<MAXQUE;i++)  printf("  Pt= %4d  String=%s\n",i,"----");

        }

}

int main(int argc, char* argv[])

{   char inCmd[80],lowerCmd[80]; char *strDT;

        StartPointer=0; EndPointer=0;

        while( true)

        {       printf("\n  ** Input Operation ** enque / deque / dsp / end : ");

                scanf("%s",inCmd);charLower(inCmd,lowerCmd);

                if     (strcmp(lowerCmd,"end")==0) break;

                else if(strcmp(lowerCmd,"dsp")==0) dsp();

                else if(strcmp(lowerCmd,"deque")==0) {

                        strDT=deque();printf("  *DeQue Data : %s\n",strDT);

                }

                else if(strcmp(lowerCmd,"enque")==0)    {

                        printf("  ** Input EnQue Data ** : ");

                        scanf("%s",inCmd);enque(inCmd);

                }

                else printf("  **コマンド誤り**\n");

        }

return 0;

}

[実行イメージ]

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 



3.動的な領域管理

(1)最も基本的な処理

 

#include "stdafx.h"

#include "ctype.h"

#include "string.h"

#define MAXAREA 5

struct ElementSet // 今のところこのようにしておく

{       long    Next;

};

struct ElementSet DataArea[500];

long ErasedP;   // 未使用領域の先頭領域

long DataP;             // 格納しているデータの先頭

void charLower(char a[],char b[])

{       int i;

        for(i=0;a[i] !='\0';i++){

                if(islower(a[i])) b[i]=a[i];

                else b[i]=tolower(a[i]);

        }

        b[i]=0;

}

void Init()

{       for(int i=0;i<MAXAREA-1;i++) DataArea[i].Next=i+1;

                DataArea[MAXAREA-1].Next=-1;

        ErasedP=0;

}

void dsp()

{       int i;printf("\n  Erased Pointer= %d\n",ErasedP);

        for(i=0;i<MAXAREA;i++)printf("  Pt= %4d  Next =%4d\n",i, DataArea[i].Next);

}

long GetArea()

{     long R = ErasedP;

         if(R>=0) ErasedP = DataArea[ErasedP].Next;

         else printf("  ** 領域オーバ**");

     return R;

}

void FreeArea(long P)

{    if(P<0) return;

        DataArea[P].Next=ErasedP; ErasedP = P;

}

int main(int argc, char* argv[])

{   char inCmd[80],lowerCmd[80]; long P;Init();

        while( true)

        {       printf("\n  ** Input Operation ** getarea / freearea / dsp / end : ");

                scanf("%s",inCmd);charLower(inCmd,lowerCmd);

                if     (strcmp(lowerCmd,"end")==0) break;

                else if(strcmp(lowerCmd,"dsp")==0) dsp();

                else if(strcmp(lowerCmd,"getarea")==0) {

                        P=GetArea();printf("  *Get Area Pointer = %d\n",P);

                }

                else if(strcmp(lowerCmd,"freearea")==0) {

                        printf("  ** Input Free Area Pointer = ");

                        scanf("%d",&P);FreeArea(P);dsp();

                }

                else printf("  **コマンド誤り**\n");

        }

return 0;

}

[実行イメージ]

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


(2)デバッグ時に返却ポインタをチェックする方法

 

void FreeArea(long P)

{ if(P<0) return;

    // ***以下,チェック用***

   long PP = ErasedP;

    while(PP>=0)

    {   if(PP==P)

        { printf("領域 %dはフリーエリアです",P);

          return;

        }

        PP=next(PP);   

    }

    // ****チェックここまで***

    DataArea[P].Next=ErasedP;

    ErasedP = P;

}

 

(3)データを入れる領域を用意する

例えば,以下のように構造体を定義する。

 

struct ElementData

{       long    No;

        char    Name[80];

        int             Point;

};

struct ElementSet

{       struct  ElementData Element;

        long    Next;

};

 

データの中身を表示するために,関数dspを変更する。

 

void dsp()

{       int i;printf("\n  Erased Pointer= %d\n",ErasedP);

        for(i=0;i<MAXAREA;i++)

                printf("  Pt= %4d  Next =%4d  No.=%4d  Name = %20s  Points  %4d\n",

                                i, DataArea[i].Next,DataArea[i].Element.No,

                                DataArea[i].Element.Name,DataArea[i].Element.Point);

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

4.線形リスト

(1)基本的な操作

 

#include "stdafx.h"

#include "ctype.h"

#include "string.h"

#define MAXAREA 100

struct ElementData

{       long    No;

        char    Name[80];

        int             Point;

};

struct ElementSet

{       struct  ElementData Element;

        long    Next;

};

struct ElementSet DataArea[MAXAREA];

long ErasedP;   // 未使用領域の先頭領域

long DataP;             // 格納しているデータの先頭

void charLower(char a[],char b[])

{       int i;

        for(i=0;a[i] !='\0';i++){

                if(islower(a[i])) b[i]=a[i];

                else b[i]=tolower(a[i]);

        }

        b[i]=0;

}

void Init()

{

        for(int i=0;i<MAXAREA-1;i++) DataArea[i].Next=i+1;

                DataArea[MAXAREA-1].Next=-1;

        ErasedP=0;

}

long GetArea()

{

     long R = ErasedP;

         if(R>=0) ErasedP = DataArea[ErasedP].Next;

         else printf("  ** 領域オーバ**");

     return R;

}

void FreeArea(long P)

{

    if(P<0) return;

        DataArea[P].Next=ErasedP;

    ErasedP = P;

}

 

long cons(ElementData Element, long Next)

{

   long P=GetArea();

   if(P<0) {    printf("  ** consで領域オーバしました.\n");

                                return -1;

   }

   DataArea[P].Element = Element;

   DataArea[P].Next    = Next;

   return P;

}

struct ElementData getElement(long P)

{       return DataArea[P].Element;}

long next(long P)

{   return DataArea[P].Next;}

void replaceNext(long PB, long PN)

{       DataArea[PB].Next=PN;}

void replaceElement(long P, ElementData E)

{       DataArea[P].Element=E;}

long last(long P)

{

        long PB = -1; long PP  =P;

        while(P>=0){ PB=P;P=next(P); }

        return PB;

}

void dsp(long P)

{       long i;printf("\n  Pointer= %d\n",P);

        i=P;

        while (i>=0)

        {       printf("  No.=%4d  Name = %20s  Points  %4d\n",

                                DataArea[i].Element.No,

                                DataArea[i].Element.Name,DataArea[i].Element.Point);

                i=next(i);

        }

}

int main(int argc, char* argv[])

{   char inCmd[80],lowerCmd[80]; struct ElementData E;long P,PN;

        Init();

        while( true)

        {       printf("\n  ** Input Operation ** ");

                printf("\n  cons /getelement /next /rnext ");

                printf("/relm /last /dsp / end : ");

                scanf("%s",inCmd);charLower(inCmd,lowerCmd);

                if     (strcmp(lowerCmd,"end")==0) break;

                else if(strcmp(lowerCmd,"dsp")==0)

                {

                        printf("  ** Input Start Pointer = ");

                        scanf("%d",&P); dsp(P);

                }

                else if(strcmp(lowerCmd,"getelement")==0) {

                        scanf("%d",&P); P = cons(E,P);

                        E=getElement(P);

                        printf("  No.=%4d  Name = %20s  Points  %4d\n",E.No, E.Name,E.Point);

                }

                else if(strcmp(lowerCmd,"cons")==0)     {

                        printf("  ** Input Element Data\n");

                        printf("    No.  : ");  scanf("%d",&E.No);

                        printf("    Name : ");  scanf("%s",&E.Name);

                        printf("    Point: ");  scanf("%d",&E.Point);

                        printf("  ** Input Connected Pointer = ");

                        scanf("%d",&P); P = cons(E,P);

                        printf("  ** New Pointer = %d\n",P);

                }

                else if(strcmp(lowerCmd,"next")==0)     {

                        printf("  ** Input Pointer = ");

                        scanf("%d",&P); P = next(P);

                        printf("  ** Next Pointer = %d\n",P);

                }

                else if(strcmp(lowerCmd,"rnext")==0)    {

                        printf("  ** Input Pointer = ");

                        scanf("%d",&P);

                    printf("  ** Replace Next Pointer = ");

                        scanf("%d",&PN);replaceNext(P,PN);

                        printf("  ** Replace Pointer = %d\n",P);

                }

                else if(strcmp(lowerCmd,"relm")==0)     {

                        printf("  ** Input Element Data\n");

                        printf("    No.  : ");  scanf("%d",&E.No);

                        printf("    Name : ");  scanf("%s",&E.Name);

                        printf("    Point: ");  scanf("%d",&E.Point);

                        printf("  ** Input Connected Pointer = ");

                        scanf("%d",&P); replaceElement(P,E);

                        printf("  ** New Pointer = %d\n",P);

                }

                else if(strcmp(lowerCmd,"last")==0)     {

                        printf("  ** Input Pointer = ");

                        scanf("%d",&P); P = last(P);

                        printf("  ** Last Pointer = %d\n",P);

                }

                else printf("  **コマンド誤り**\n");

        }

return 0;

}

 

[実行イメージ]

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


(2)リストによるソート

#include "stdafx.h"

#include "ctype.h"

#include "string.h"

#define MAXAREA 100

struct ElementData

{       long    No;

        char    Name[80];

        int             Point;

};

struct ElementSet

{       struct  ElementData Element;

        long    Next;

};

struct ElementSet DataArea[MAXAREA];

long ErasedP;   // 未使用領域の先頭領域

long DataP;             // 格納しているデータの先頭

void charLower(char a[],char b[])

{       int i;

        for(i=0;a[i] !='\0';i++){

                if(islower(a[i])) b[i]=a[i];

                else b[i]=tolower(a[i]);

        }

        b[i]=0;

}

void Init()

{

        for(int i=0;i<MAXAREA-1;i++) DataArea[i].Next=i+1;

                DataArea[MAXAREA-1].Next=-1;

        ErasedP=0;

}

long GetArea()

{

     long R = ErasedP;

         if(R>=0) ErasedP = DataArea[ErasedP].Next;

         else printf("  ** 領域オーバ**");

     return R;

}

void FreeArea(long P)

{

    if(P<0) return;

        DataArea[P].Next=ErasedP;

    ErasedP = P;

}

 

long cons(ElementData Element, long Next)

{

   long P=GetArea();

   if(P<0) {    printf("  ** consで領域オーバしました.\n");

                                return -1;

   }

   DataArea[P].Element = Element;

   DataArea[P].Next    = Next;

   return P;

}

struct ElementData getElement(long P)

{       return DataArea[P].Element;}

long next(long P)

{   return DataArea[P].Next;}

void replaceNext(long PB, long PN)

{       DataArea[PB].Next=PN;}

void replaceElement(long P, ElementData E)

{       DataArea[P].Element=E;}

long last(long P)

{

        long PB = -1; long PP  =P;

        while(P>=0){ PB=P;P=next(P); }

        return PB;

}

void dsp(long P)

{       long i;printf("\n  Pointer= %d\n",P);

        i=P;

        while (i>=0)

        {       printf("  No.=%4d  Name = %20s  Points  %4d\n",

                                DataArea[i].Element.No,

                                DataArea[i].Element.Name,DataArea[i].Element.Point);

                i=next(i);

        }

}

[80],lowerCmd[80]; struct ElementData E;long P;

        Init();DataP=-1;

        registData(1,"福田赳夫", 40);

        registData(2,"佐藤栄作", 20);

        registData(3,"倖田美咲", 50);

        registData(4,"山下祐介", 90);

        registData(5,"相馬賢一", 30);

       

        while( true)

        {       printf("\n  ** Input Operation ** ");

                printf("\n regist / sort / dsp / end : ");

                scanf("%s",inCmd);charLower(inCmd,lowerCmd);

                if     (strcmp(lowerCmd,"end")==0) break;

                else if(strcmp(lowerCmd,"dsp")==0) dsp(DataP);

                else if(strcmp(lowerCmd,"sort")==0)     {

                        sortList();     dsp(DataP);

                }

                else if(strcmp(lowerCmd,"regist")==0)   {

                        printf("  ** Input Element Data\n");

                        printf("    No.  : ");  scanf("%d",&E.No);

                        printf("    Name : ");  scanf("%s",&E.Name);

                        printf("    Point: ");  scanf("%d",&E.Point);

                        registElm(E);dsp(DataP);

                }

 

                else printf("  **コマンド誤り**\n");

        }

return 0;

}

 

 

[実行イメージ]

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

(3)循環リスト

 

#include "stdafx.h"

#include "ctype.h"

#include "string.h"

#define MAXAREA 100

struct ElementData

{       long    No;

        char    Name[80];

        int             Point;

};

struct ElementSet

{       struct  ElementData Element;

        long    Next;

};

struct ElementSet DataArea[MAXAREA];

long ErasedP;   // 未使用領域の先頭領域

long DataP;             // 格納しているデータの先頭

void charLower(char a[],char b[])

{       int i;

        for(i=0;a[i] !='\0';i++){

                if(islower(a[i])) b[i]=a[i];

                else b[i]=tolower(a[i]);

        }

        b[i]=0;

}

void Init()

{

        for(int i=0;i<MAXAREA-1;i++) DataArea[i].Next=i+1;

                DataArea[MAXAREA-1].Next=-1;

        ErasedP=0;

}

long GetArea()

{

     long R = ErasedP;

         if(R>=0) ErasedP = DataArea[ErasedP].Next;

         else printf("  ** 領域オーバ**");

     return R;

}

void FreeArea(long P)

{

    if(P<0) return;

        DataArea[P].Next=ErasedP;

    ErasedP = P;

}

 

long cons(ElementData Element, long Next)

{

   long P=GetArea();

   if(P<0) {    printf("  ** consで領域オーバしました.\n");

                                return -1;

   }

   DataArea[P].Element = Element;

   DataArea[P].Next    = Next;

   return P;

}


struct ElementData getElement(long P)

{       return DataArea[P].Element;}

long next(long P)

{   return DataArea[P].Next;}

void replaceNext(long PB, long PN)

{       DataArea[PB].Next=PN;}

void replaceElement(long P, ElementData E)

{       DataArea[P].Element=E;}

long last(long P)

{

        long PB = -1; long PP  =P;

        while(P>=0){ PB=P;P=next(P); }

        return PB;

}

void dsp()

{       ElementData Element;

        long P=DataP;printf("\n  Pointer= %d\n",P);

        do

        {       Element = getElement(P);

                printf("  No.=%4d  Name = %20s  Points  %4d  Next Pointer= %4d\n",

                                Element.No, Element.Name, Element.Point,

                                DataArea[P].Next);

                P=next(P);

        }while (P !=DataP);

}

void Regist(long No, char Name[], int Point)

{       ElementData Element;

        Element.No=No; strcpy(Element.Name,Name);Element.Point=Point;

        DataP=cons(Element,DataP);

}

void ListInit()

{

        Init(); DataP=-1;                      

        Regist(1,"福 田 武 夫",40);

        Regist(2,"佐 藤 栄 二",20);

        Regist(3,"中曽根 幹 雄",60);

        Regist(4,"山 崎 恵 子",50);

        Regist(5,"相 馬 剛 司",90);

        Regist(6,"金 子 祐次郎",40);

        Regist(7,"幸 田 美 咲",70);

        Regist(8,"澤 田 幸 一",30);

        DataArea[last(DataP)].Next=DataP;

}

int main(int argc, char* argv[])

{  

        char inCmd[80],lowerCmd[80]; struct ElementData E;

        ListInit();dsp();

        while( true)

        {       printf("\n  ** Input Operation ** ");

                printf("\n  next /elem /dsp / end : ");

                scanf("%s",inCmd);charLower(inCmd,lowerCmd);

                if     (strcmp(lowerCmd,"end")==0) break;

                else if(strcmp(lowerCmd,"dsp")==0) dsp();

                else if(strcmp(lowerCmd,"elem")==0) {

                        E=getElement(DataP);

                        printf("  No.=%4d  Name = %20s  Points  %4d  Next Pointer %4d \n",

                                        E.No, E.Name,E.Point,DataArea[DataP].Next);

                }

                else if(strcmp(lowerCmd,"next")==0)     {

                        DataP=next(DataP);

                        E=getElement(DataP);

                        printf("  No.=%4d  Name = %20s  Points  %4d  Next Pointer %4d \n",

                                E.No, E.Name,E.Point,DataArea[DataP].Next);

                }

 

                else printf("  **コマンド誤り**\n");

        }

        return 0;

}

 

[実行イメージ]

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

(4)木構造

 

#include "stdafx.h"

#include "ctype.h"

#include "string.h"

#define MAXAREA 100

struct ElementData

{       long    No;

        char    Name[80];

        int             Point;

};

struct ElementSet

{       struct  ElementData Element;

        long    Left;

        long    Right;

};

struct ElementSet DataArea[MAXAREA];

long ErasedP;   // 未使用領域の先頭領域

long DataP;             // 格納しているデータの先頭

struct ElementData tempData[MAXAREA];

void charLower(char a[],char b[])

{       int i;

        for(i=0;a[i] !='\0';i++){

                if(islower(a[i])) b[i]=a[i];

                else b[i]=tolower(a[i]);

        }

        b[i]=0;

}

void Init()

{

        for(int i=0;i<MAXAREA-1;i++) DataArea[i].Right=i+1;

        DataArea[MAXAREA-1].Right=-1;

        ErasedP=0;

}

long GetArea()

{

     long R = ErasedP;

         if(R>=0) ErasedP = DataArea[ErasedP].Right;

         else printf("  ** 領域オーバ**");

     return R;

}

void FreeArea(long P)

{

    if(P<0) return;

        DataArea[P].Right=ErasedP;

    ErasedP = P;

}

 

struct ElementData element(long P){     return DataArea[P].Element;}

long right(long P){ return DataArea[P].Right;}

long left(long P) { return DataArea[P].Right;}

long count(long P)

{       if(P<0) return 0;

        return count(left(P))+count(right(P))+1;

}

void freeAll(long P)

{       if(P<0) return ;

        freeAll(left(P)); freeAll(right(P));

        FreeArea(P);

}

long moveToArray(long P, long ID)

{

        if(P<0) return ID;

        long ID1 = moveToArray(left(P), ID);

        tempData[ID1].No = DataArea[P].Element.No;

        strcpy(tempData[ID1].Name , DataArea[P].Element.Name);

        tempData[ID1].Point = DataArea[P].Element.Point;

        ID1++;

        long ID2 = moveToArray(right(P), ID1);

        return ID2;

}

long moveFromArray(long Left, long Right)

{

        if(Right < Left) return -1;

        long Center = (Left+Right)/2;

        long PL = moveFromArray(Left,Center-1);

        long PR = moveFromArray(Center+1,Right);

        long P  = GetArea();

        if(P < 0)       { freeAll(PL); freeAll(PR);}

        else

        {

                DataArea[P].Element.No = tempData[Center].No;

                strcpy(DataArea[P].Element.Name, tempData[Center].Name);

                DataArea[P].Element.Point = tempData[Center].Point;

                DataArea[P].Left=PL;

                DataArea[P].Right=PR;

        }

        return P;

}

long restructure(long P)

{

        long N = count(P);

        moveToArray(P, 0);

        freeAll(P);

        long X = moveFromArray(0, N - 1);

        return X;

}

long retNo(long P,long No)

{

        if(P < 0) return -1;

        ElementData E = element(P);

        if(No == E.No)     return P;

        else if(No < E.No) return retNo(left(P),No);

        else               return retNo(right(P),No);

}

long retName(long P,char Name[])

{

        if(P < 0) return -1;

        ElementData E = element(P);

        if(strcmp(Name,E.Name) == 0) return P;

        long PL = retName(left(P),Name);

        if( PL >= 0) return PL;

        return retName(right(P),Name);

}

void printNchar(char C,int N)

{       int i;

        for(i=0;i<N;i++)printf("%c",C);

}

void dspElement(long P,int N)

{  

        if(P<0) return;

        dspElement(DataArea[P].Left,N+2);

        printNchar(' ',N);

        struct ElementData E = DataArea[P].Element;

        printf(" 番号 %04d  %s  %d \n",E.No, E.Name, E.Point);

        dspElement(DataArea[P].Right,N+2);

}

void dsp()

{  

        char CH[500];

        CH[0]='\0';

        dspElement(DataP,0);

}

void dspErased()

{

        long P = ErasedP; long PP;

        printf("\n  ** Erased List **\n");

        while(P>=0){

                PP=right(P); printf("%d \t" + PP);P=PP;

        }

        printf("\n");

}

long regist(long P,long No, char Name[], int Point)

{

        if(P < 0){

        long PP = GetArea();if(PP < 0) return -1;

        DataArea[PP].Element.No = No;

        strcpy(DataArea[PP].Element.Name, Name);

        DataArea[PP].Element.Point = Point;

        DataArea[PP].Left = -1; DataArea[PP].Right = -1;

        return PP;

        }

        else if(No == DataArea[P].Element.No) {

                strcpy(DataArea[P].Element.Name, Name);

                DataArea[P].Element.Point = Point;

        }

        else if(No < DataArea[P].Element.No)

                DataArea[P].Left = regist(DataArea[P].Left ,No,Name,Point);

    else

                DataArea[P].Right =  regist(DataArea[P].Right,No,Name,Point);

        return P;

}

int main(int argc, char* argv[])

{   char inCmd[80],lowerCmd[80]; struct ElementData E;long P,PN;

        Init();DataP=-1;dsp();

        while( true)

        {       printf("\n  ** Input Operation ** ");

                printf("\n  regist /getelement /right /left ");

                printf("/dsp / end : ");

                scanf("%s",inCmd);charLower(inCmd,lowerCmd);

                if     (strcmp(lowerCmd,"end")==0) break;

                else if(strcmp(lowerCmd,"dsp")==0) dsp();

                else if(strcmp(lowerCmd,"getelement")==0) {

                        E=element(DataP);

                        printf("  No.=%4d  Name = %20s  Points  %4d\n",E.No, E.Name,E.Point);

                }

                else if(strcmp(lowerCmd,"regist")==0)   {

                        printf("  ** Input Element Data\n");

                        printf("    No.  : ");  scanf("%d",&E.No);

                        printf("    Name : ");  scanf("%s",&E.Name);

                        printf("    Point: ");  scanf("%d",&E.Point);

                        DataP = regist(DataP,E.No,E.Name,E.Point);

                        printf("  ** Start Pointer = %d\n",DataP);

                }

                else if(strcmp(lowerCmd,"right")==0)    {

                        printf("  ** Input Pointer = ");

                        scanf("%d",&P);

                        P = right(P);

                        printf("  ** Right Pointer = %d\n",P);

                }

                else if(strcmp(lowerCmd,"left")==0)     {

                        printf("  ** Input Pointer = ");

                        scanf("%d",&P);

                        P = right(P);

                        printf("  ** left Pointer = %d\n",P);

                }

                else printf("  **コマンド誤り**\n");

        }

return 0;

}

 [実行イメージ]