動態佇列,鏈式佇列 + 示意圖
阿新 • • 發佈:2019-01-04
#include <stdio.h> #include <malloc.h> //動態佇列,鏈式佇列 typedef struct Node{ int data; struct Node * pNext; }NODE,*PNODE; typedef struct Queue{ PNODE front;//佇列的出隊處 PNODE rear;//佇列的入隊處 }QUEUE,*PQUEUE; void init(PQUEUE);//佇列的初始化 void in(PQUEUE);//入隊 void out(PQUEUE,int *);//出隊,以及返回出隊的元素 int getSize(PQUEUE);//得到佇列的長度 void printQueue(PQUEUE);//列印佇列 bool is_empty(PQUEUE); int main(void){ QUEUE Q; int val; init(&Q); in(&Q); in(&Q); in(&Q); in(&Q); in(&Q); printQueue(&Q); out(&Q,&val); printf("出隊的元素是:%d\n",val); printQueue(&Q); out(&Q,&val); printf("出隊的元素是:%d\n",val); printQueue(&Q); return 0; } //佇列的初始化 void init(PQUEUE pQ){ pQ->front = (PNODE)malloc( sizeof(NODE) ); if(NULL == pQ->front){ printf("記憶體分配失敗,初始化失敗\n"); exit(-1); } pQ->rear = pQ->front; pQ->front->pNext = NULL; } //入隊 void in(PQUEUE pQ){ printf("請輸入你要入隊的元素值:"); int val; scanf("%d",&val); PNODE pNew = (PNODE)malloc( sizeof(NODE) ); pNew->data = val;//因為是先進先出,故指標的方向是從font指向到real pNew->pNext = NULL; pQ->rear->pNext = pNew; pQ->rear = pNew; } //出隊 void out(PQUEUE pQ,int * pVal){ if(is_empty(pQ) ){ printf("當前佇列為空,不能出隊"); return; } PNODE p = pQ->front->pNext; //因為在初始化的時候pQ->front是為NULL的,所以要用pQ->front->pNext *pVal = p->data; pQ->front->pNext = p->pNext; //一般情況下刪除佇列頭元素時僅需修改頭結點中的指標,但當佇列中最後一個元素被刪後,佇列尾指標 //也丟失了,因此需對尾指標重新賦值(指向頭結點) if(pQ->rear == p) pQ->rear = pQ->front; free(p); } //是否為空 bool is_empty(PQUEUE pQ){ if(pQ->rear == pQ->front){ return true; } return false; } //得到佇列長度 int getSize(PQUEUE pQ){ if(is_empty(pQ) ){ return 0; } PNODE p = pQ->front; int count=0; while(p != pQ->rear){ p = p->pNext; count++; } return count; } //列印佇列 void printQueue(PQUEUE pQ){ if(is_empty(pQ) ){ printf("當前佇列為空,不能列印"); return ; } PNODE p = pQ->front; int size = getSize(pQ); printf("該佇列的%d個元素如下:",size); while(p != pQ->rear){ p = p->pNext; printf("%d ",p->data); } printf("\n"); }
上面的指標也可這麼指向操作:front始終指向第一個元素的空間,rear指向最後一個元素的pNext記憶體空間NULL