第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;
}
[実行イメージ]
![]() |