上一篇簡單介紹了使用數組實現一個隊列的方法,本文使用鏈表來實現隊列:node
#include <stdio.h> #include <stdlib.h> typedef int ElementType; typedef struct ListNode { // 定義結點結構 ElementType data; struct ListNode *next; }node; typedef struct QueueRecord { // 定義結構體,用於存放隊列的頭指針和尾指針 node *Front; node *Rear; }Queue; typedef Queue *PtrToQueue; PtrToQueue InitQueue();void Enqueue(PtrToQueue Q, ElementType element); void Dequeue(PtrToQueue Q); void TraverseQueue(PtrToQueue Q); int main() { PtrToQueue LinkedQueue = InitQueue(); for (int i = 0; i < 10; i++) { Enqueue(LinkedQueue, i); } TraverseQueue(LinkedQueue); Dequeue(LinkedQueue); Dequeue(LinkedQueue); TraverseQueue(LinkedQueue); Enqueue(LinkedQueue, 50); TraverseQueue(LinkedQueue); DestoryQueue(LinkedQueue); TraverseQueue(LinkedQueue); } /* 隊列初始化 */ PtrToQueue InitQueue() { PtrToQueue queue = (PtrToQueue)malloc(sizeof(Queue)); // 建立一個隊列,並動態分配內存 if(queue == NULL) { perror("malloc failed!\n"); exit(EXIT_FAILURE); } queue->Front = queue->Rear = NULL; // 初始化頭指針和尾指針 return queue; } /* 入隊 */ void Enqueue(PtrToQueue Q,ElementType element) { node *newNode = (node *)malloc(sizeof(node)); // 新建一個鏈表結點,用於存放入隊元素的值 if (newNode == NULL) { perror("malloc failed!\n"); exit(EXIT_FAILURE); } newNode->next = NULL; newNode->data = element; if (Q->Rear == NULL) { Q->Front = newNode; Q->Rear = newNode; } else { Q->Rear->next = newNode; // 讓新結點做爲當前尾結點的下一個結點 Q->Rear = newNode; // 尾指針指向新結點 } } /* 出隊 */ void Dequeue(PtrToQueue Q) { node *delNode = Q->Front; if (Q->Front == NULL) { printf("隊列爲空,沒法執行出隊操做\n"); } if (Q->Front == Q->Rear) { Q->Front = NULL; Q->Rear = NULL; free(delNode); // 釋放結點內存 } else { Q->Front = Q->Front->next; free(delNode); // 釋放結點內存 } } /* 遍歷隊列 */ void TraverseQueue(PtrToQueue Q) { node *tmpNode = Q->Front; if (tmpNode == NULL) { printf("隊列爲空\n"); } while(tmpNode != NULL) { printf("%d ", tmpNode->data); tmpNode = tmpNode->next; } printf("\n"); }
程序運行結果以下:算法
參考資料:數組
《算法精解 C語言描述》spa