鏈式佇列—連結串列實現
阿新 • • 發佈:2020-11-01
#include <stdio.h>
#include <stdlib.h>
/*****************************/
/****** 鏈佇列的操作 *******/
/*****************************/
typedef struct QNode //結點 { int data; struct QNode * pNext; }QNODE ,* PQNODE; typedef struct //佇列 { PQNODE front; //隊頭 PQNODE rear; //隊尾 }QUEUE; void init(QUEUE * ); //鏈式佇列初始化 bool en_queue(QUEUE * , int); //入隊 bool out_queue(QUEUE * , int * ); //出隊 void traverse_queue(QUEUE * ); //遍歷 bool empty_queue(QUEUE * ); //判斷佇列是否為空
int main() { QUEUE Q; int val; init(&Q); en_queue(&Q,6); en_queue(&Q,5); en_queue(&Q,3); en_queue(&Q,2); printf("入隊後:"); traverse_queue(&Q); //出隊操作時,就是頭結點的後繼結點出隊 if(out_queue(&Q, &val)) //val用來儲存出隊的值【傳地址】 { printf("\n\n出隊成功!出隊的值為: %d\n", val); } else { printf("\n\n出隊失敗!\n"); } printf("\n出隊後:"); traverse_queue(&Q); return 0; }
/*——————————————————————————————————————————————————————*/ void init(QUEUE * pQ) { pQ->front = pQ->rear = (PQNODE)malloc(sizeof(QNODE)); //建立一個頭結點【隊頭、隊尾同時指向】 if(NULL == pQ->front) { printf("分配失敗!\n"); exit(-1); } pQ->front->pNext = NULL; } /*——————————————————————————————————————————————————————*/ bool en_queue(QUEUE * pQ, int val) { PQNODE pNew = (PQNODE)malloc(sizeof(QNODE)); if(NULL == pNew) { printf("分配失敗!\n"); exit(-1); } pNew->data = val; pNew->pNext = NULL; //入隊演算法 pQ->rear->pNext = pNew; //第一步 pQ->rear = pNew; //第二步 } /*——————————————————————————————————————————————————————*/ void traverse_queue(QUEUE * pQ) { PQNODE p = pQ->front->pNext; //一定要找一個指標暫存, 跳過頭結點【不能改變頭指標】 while(p != NULL) { printf("%d ", p->data); p = p->pNext; } } /*——————————————————————————————————————————————————————*/ bool out_queue(QUEUE * pQ, int * pval) { if(empty_queue(pQ)) { return false; } else { //出隊演算法 PQNODE p = pQ->front->pNext; //儲存出隊的結點 *pval = p->data; //儲存出隊的值 pQ->front->pNext = p->pNext; if(pQ->rear == p) //當刪除最後一個有效結點時,頭結點之後沒有其它結點,此時重新使rear = front {pQ->rear = pQ->front;} free(p); return true; } } /*——————————————————————————————————————————————————————*/ bool empty_queue(QUEUE * pQ) { if(pQ->front == pQ->rear)//如果front與rear相等,則該佇列就一定為空 { return true; } else { return false; } }