// 隊列的單鏈表實現 // 頭節點:哨兵作用,不存放數據,用來初始化隊列時使隊頭隊尾指向的地方 // 首節點:頭節點后第一個節點,存放數據 #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"); }
運行結果