標籤:結構 隊列的實現 分配 操作 node free 儲存 span src
// 隊列的單鏈表實現// 前端節點:哨兵作用,不存放資料,用來初始化隊列時使隊頭隊尾指向的地方// 首節點:前端節點後第一個節點,存放資料#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; } }// 定義入隊函數// 從隊列尾部插入資料valvoid 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");}
運行結果
隊列的實現及操作(C語言描述)