上一篇简单介绍了使用数组实现一个队列的方法,本文使用链表来实现队列:
#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! "); 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! "); 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("队列为空,无法执行出队操作 "); } 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("队列为空 "); } while(tmpNode != NULL) { printf("%d ", tmpNode->data); tmpNode = tmpNode->next; } printf(" "); }
程序运行结果如下:
参考资料:
《算法精解 C语言描述》