C語言描述隊列的實現及操作(鏈表實現)


//    隊列的單鏈表實現
//    頭節點:哨兵作用,不存放數據,用來初始化隊列時使隊頭隊尾指向的地方
//    首節點:頭節點后第一個節點,存放數據

#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
typedef int Elementype;        //    定義數據類型
//    定義節點結構
typedef struct Node {
    Elementype Element;        //    數據域
    struct Node * Next;
}NODE, *PNODE;

//    定義隊列結構體
typedef struct QNode {
    PNODE Front, Rear;        //    隊列頭,尾指針
} Queue, *PQueue;

//    聲明函數體
void InitQueue(PQueue);    //    創建隊列函數
bool IsEmptyQueue(PQueue);    //    判斷隊列是否為空函數
void InsertQueue(PQueue, int val);    //    入隊函數
void DeleteQueue(PQueue,int * val);    //    出隊函數
void DestroyQueue(PQueue);    //    摧毀隊列函數
void TraverseQueue(PQueue);    //    遍歷隊列函數
void ClearQueue(PQueue);    //    清空隊列函數
int LengthQueue(PQueue);    //    求隊列長度函數

//    主函數
int main() {
    int val = 0;    //    定義臨時變量
    Queue queue;    //    創建隊列變量
    InitQueue(&queue);    //    調用初始化隊列函數
    IsEmptyQueue(&queue);    //    調用判斷隊列是否為空函數
    InsertQueue(&queue, 100);    //調用入隊函數
    InsertQueue(&queue, 200);
    InsertQueue(&queue, 300);
    InsertQueue(&queue, 400);
    InsertQueue(&queue, 500);
    InsertQueue(&queue, 600);
    IsEmptyQueue(&queue);
    TraverseQueue(&queue);    //    調用隊列遍歷函數
    DeleteQueue(&queue, &val);    //    調用出隊函數
    TraverseQueue(&queue);
    ClearQueue(&queue);        //    調用清空隊列函數
    IsEmptyQueue(&queue);
    DestroyQueue(&queue);    //    調用摧毀隊列函數

    return 0;
}

//    定義隊列初始化函數
void InitQueue(PQueue queue) {
    queue->Front = queue->Rear = (PNODE)malloc(sizeof(NODE));    //    動態創建頭節點,使隊頭,隊尾指向該節點
    //頭節點相當於哨兵節點的作用,不存儲數據(區別於首節點)
    if (queue->Front == NULL) {        //    判斷內存是否分配成功
        printf("創建隊列,無法分配所需內存...");
        exit(-1);
    }
    queue->Front->Next = NULL;    //    初始隊列頭節點指針指向為空
    printf("創建隊列成功...\n");
}

//    定義判斷隊列是否為空函數
bool IsEmptyQueue(PQueue queue) {
    if (queue->Front == queue->Rear) {
        printf("隊列為空...\n");
        return true;
    }
    else {
        //printf("隊列不為空...\n");
        return false;
    }
        
}
//    定義入隊函數
//    從隊列尾部插入數據val
void InsertQueue(PQueue queue,int val) {
    PNODE P = (PNODE)malloc(sizeof(NODE));    //    創建一個新節點用於存放插入的元素
    if (P == NULL) {
        printf("內存分配失敗,無法插入數據%d...", val);
        exit(-1);
    }
    P->Element = val;    //    把要插入的數據放到節點數據域
    P->Next = NULL;        //    新節點指針指向為空
    queue->Rear->Next = P;    //    使上一個隊列尾部的節點指針指向新建的節點
    queue->Rear = P;    //    更新隊尾指針,使其指向隊列最后的節點
    printf("插入數據 %d 成功...\n", val);
}

//    定義出隊函數
//    從隊列的首節點開始出隊
//    若出隊成功,用val返回其值
void DeleteQueue(PQueue queue,int* val) {
    if (IsEmptyQueue(queue)) {
        printf("隊列已經空,無法出隊...\n");
        exit(-1);
    }
    PNODE  P= queue->Front->Next;    //    臨時指針
    *val = P->Element;    //    保存其值
    queue->Front->Next = P->Next;        //    更新頭節點
    if (queue->Rear==P)
        queue->Rear = queue->Front;
    free(P);    //    釋放頭隊列
    P = NULL;    //    防止產生野指針
    printf("出棧成功,出棧值為 %d\n", *val);
}
//    定義隊列遍歷函數
void TraverseQueue(PQueue queue) {
    
    if (IsEmptyQueue(queue)) {
        exit(-1);
    }        
    PNODE P = queue->Front->Next;    //從隊列首節點開始遍歷(非頭節點,注意區分)
    printf("遍歷隊列結果為:");
    while (P != NULL) {
        printf("%d ", P->Element);
        P = P->Next;
    }
    printf("\n");
}
//    定義隊列的摧毀函數
//    刪除整個隊列,包括頭節點
void DestroyQueue(PQueue queue) {
    //從頭節點開始刪除
    while (queue->Front != NULL) {
        queue->Rear = queue->Front->Next;
        free(queue->Front);
        queue->Front = queue->Rear;
    }
    printf("摧毀隊列成功...\n");
}
//    定義清空隊列函數
void ClearQueue(PQueue queue) {
    PNODE P = queue->Front->Next;    //    臨時指針
    PNODE Q = NULL;        //    臨時指針
    queue->Rear = queue->Front;        //    使隊尾指針指向頭節點
    queue->Front->Next = NULL;
    //    從首節點開始清空
    while (P != NULL) {
        Q = P;
        P = P->Next;
        free(Q);
    }
    printf("清空隊列成功...\n");

}

運行結果


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM