鏈佇列的基本操作及C語言實現
阿新 • • 發佈:2018-12-17
佇列,可以理解為遵循“先進先出”原則的線性表,即資料元素依次從表的一端進,從表的另一端出。
鏈佇列,即用鏈式的儲存結構(連結串列)實現的佇列,其實現思想是:用連結串列的表頭一端表示佇列的隊頭,另一端表示佇列的隊尾(實現程式碼更加簡單)。
反過來的話,當佇列增加元素時,要採用頭插法,在刪除資料元素的時候,需通過遍歷的方式摘除連結串列的最後一個結點。
需要注意的是,在實現鏈佇列時要合理地控制佇列兩端指標的指向,避免“野指標”的出現。例如,當鏈佇列中只剩有一個數據元素時,隊尾指標指向的就是這個資料元素,被刪除後,隊尾指標指向的記憶體空間被釋放,還有可能給別的程式使用。這時候,隊尾指標如果不進行重定義,就會變成“野指標”。
鏈佇列的實現程式碼如下:
執行結果:
1234佇列為空
鏈佇列,即用鏈式的儲存結構(連結串列)實現的佇列,其實現思想是:用連結串列的表頭一端表示佇列的隊頭,另一端表示佇列的隊尾(實現程式碼更加簡單)。
反過來的話,當佇列增加元素時,要採用頭插法,在刪除資料元素的時候,需通過遍歷的方式摘除連結串列的最後一個結點。
需要注意的是,在實現鏈佇列時要合理地控制佇列兩端指標的指向,避免“野指標”的出現。例如,當鏈佇列中只剩有一個數據元素時,隊尾指標指向的就是這個資料元素,被刪除後,隊尾指標指向的記憶體空間被釋放,還有可能給別的程式使用。這時候,隊尾指標如果不進行重定義,就會變成“野指標”。
鏈佇列的實現程式碼如下:
#include <stdio.h> #include <stdlib.h> typedef struct QNode{ int data; struct QNode * next; }QNode; QNode * initQueue(){ QNode * queue=(QNode*)malloc(sizeof(QNode)); queue->next=NULL; return queue; } QNode* enQueue(QNode * rear,int data){ QNode * enElem=(QNode*)malloc(sizeof(QNode)); enElem->data=data; enElem->next=NULL; //使用尾插法向鏈佇列中新增資料元素 rear->next=enElem; rear=enElem; return rear; } void DeQueue(QNode * front,QNode * rear){ if (front->next==NULL) { printf("佇列為空"); return ; } QNode * p=front->next; printf("%d",p->data); front->next=p->next; if (rear==p) { rear=front; } free(p); } int main() { QNode * queue,*front,*rear; queue=front=rear=initQueue();//建立頭結點 //向鏈佇列中新增結點,使用尾插法新增的同時,隊尾指標需要指向連結串列的最後一個元素 rear=enQueue(rear, 1); rear=enQueue(rear, 2); rear=enQueue(rear, 3); rear=enQueue(rear, 4); //入隊完成,所有資料元素開始出佇列 DeQueue(front, rear); DeQueue(front, rear); DeQueue(front, rear); DeQueue(front, rear); DeQueue(front, rear); return 0; }
1234佇列為空