1. 程式人生 > >鏈佇列的基本操作及C語言實現

鏈佇列的基本操作及C語言實現

佇列,可以理解為遵循“先進先出”原則的線性表,即資料元素依次從表的一端進,從表的另一端出。

鏈佇列,即用鏈式的儲存結構(連結串列)實現的佇列,其實現思想是:用連結串列的表頭一端表示佇列的隊頭,另一端表示佇列的隊尾(實現程式碼更加簡單)。

反過來的話,當佇列增加元素時,要採用頭插法,在刪除資料元素的時候,需通過遍歷的方式摘除連結串列的最後一個結點。

需要注意的是,在實現鏈佇列時要合理地控制佇列兩端指標的指向,避免“野指標”的出現。例如,當鏈佇列中只剩有一個數據元素時,隊尾指標指向的就是這個資料元素,被刪除後,隊尾指標指向的記憶體空間被釋放,還有可能給別的程式使用。這時候,隊尾指標如果不進行重定義,就會變成“野指標”。

鏈佇列的實現程式碼如下:
#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佇列為空