/* * Queue サンプル * * 2004.12.08 * */ #include <stdio.h> #include <stdlib.h> typedef struct _LIST{ int data; struct _LIST *next; }LIST; LIST *NodeAlloc(void); void NodeFree(LIST *Node); void HeadInsert(LIST **Head, LIST *Node); void TailInsert(LIST **Head, LIST *Node); void DeleteNode(LIST **Head, int Position); int GetNodeTotal(LIST **Head); LIST *GetNode(LIST **Head, int n); int main(void) { LIST *p, *wp; LIST *head; int w, in, data; head = (LIST *)NULL; for(;;){ printf(" 1.キューに入れる "); printf(" 2.キューから取り出す "); printf(" 3.キューに連続で入れる -1で終了 "); printf(" 4.全データ表示 "); printf(" 5.要素の数 "); printf("-1.終了 "); printf(" "); printf("Input Number >> "); scanf("%d", &in); if(in == -1) break; switch(in){ case 1: printf("Data >> "); scanf("%d", &data); p = NodeAlloc(); p->data = data; TailInsert(&head, p); printf("入れました >> %d ", p->data); break; case 2: w=1; /* 先頭を指定 */ p=GetNode(&head, w); if(p!=(LIST *)NULL){ printf("取り出しました >> %d ", p->data); DeleteNode(&head, w); }else{ printf("取り出すデータはありません"); } printf(" "); break; case 3: for(;;){ printf("Data >> "); scanf("%d", &data); if(data==-1)break; p = NodeAlloc(); p->data = data; TailInsert(&head, p); } break; case 4: printf(" View All Data "); w=1; while((p=GetNode(&head, w))!=(LIST *)NULL){ printf("%2d >> %d ", w, p->data); w++; } printf(" "); break; case 5: printf(" 要素の数 >> %d個 ", GetNodeTotal(&head)); break; default: break; } printf(" "); } for(p=head; p!=(LIST *)NULL; p = wp){ wp = p->next; NodeFree(p); } return 0; } /* * リストの先頭にNodeを追加 */ void HeadInsert(LIST **Head, LIST *Node) { /* データを追加 */ Node->next = *Head; *Head = Node; } /* * リストの最後にNodeを追加 */ void TailInsert(LIST **Head, LIST *Node) { LIST *p; if(*Head == (LIST *)NULL){ /* リストにデータが無い場合、先頭に追加 */ HeadInsert(Head, Node); }else{ for(p=*Head; p->next!=(LIST *)NULL; p=p->next); /* リストの最後を検索 */ /* データを追加 */ p->next = Node; Node->next = NULL; } } /* * リスト内のNodeを削除 */ void DeleteNode(LIST **Head, int Position) { LIST *p, *Node; Position--; /* 削除位置の一つ前にする */ if(*Head != (LIST *)NULL){ /* LISTが存在しないなら終了 */ if(Position==0){ /* 削除位置が先頭なら解放 */ p=*Head; *Head = p->next; NodeFree(p); }else if(GetNodeTotal(Head)>Position && Position>0){ /* 削除位置がList内なら */ p=GetNode(Head, Position); /* 削除位置のNodeを取得 */ Node = p->next; /* Nodeを解放する */ p->next = Node->next; NodeFree(Node); } } } /* * Nodeを確保する */ LIST *NodeAlloc(void) { return (LIST *)malloc(sizeof(LIST)); } /* * Nodeを解放する */ void NodeFree(LIST *Node) { free(Node); } /* * Nodeの総数を取得 */ int GetNodeTotal(LIST **Head) { LIST *p; int n=0; for(p=*Head; p!=(LIST *)NULL; p=p->next) /* NULLが出るまで、ノードをカウント */ n++; return n; } /* * Nodeのデータを取得 */ LIST *GetNode(LIST **Head, int n) { int j=1; LIST *p; for(p=*Head; p!=(LIST *)NULL; p=p->next){ /* NULLが出るか、n番目のノードを取得するまでループ */ if(j==n)break; j++; } return p; }
http://www.daccho-it.com/program/algo/queue.c