假设以带头结点的单向循环链表表示队列,并且只设一个指针指向队尾元素结点(注意:不设头指针),试设计并验证相应的队列初始化、队列判空、入队列、出队列和遍历队列算法。并给出完整代码
时间: 2024-04-21 18:07:00 浏览: 70
好的,以下是基于带头结点的单向循环链表表示队列的相应算法及完整代码:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义单向循环链表的结点结构
typedef struct ListNode {
int data; // 数据域
struct ListNode* next; // 指针域
} ListNode;
// 定义队列结构
typedef struct Queue {
ListNode* rear; // 指向队尾结点的指针
} Queue;
// 初始化队列
void initQueue(Queue* queue) {
queue->rear = (ListNode*) malloc(sizeof(ListNode));
queue->rear->next = queue->rear; // 队尾指针指向自己,表示队列为空
}
// 判断队列是否为空
int isQueueEmpty(Queue* queue) {
return queue->rear->next == queue->rear;
}
// 入队列
void enqueue(Queue* queue, int data) {
ListNode* newNode = (ListNode*) malloc(sizeof(ListNode));
newNode->data = data;
newNode->next = queue->rear->next; // 新结点指向队首结点
queue->rear->next = newNode; // 队尾指向新结点
queue->rear = newNode; // 队尾指针指向新结点
}
// 出队列
int dequeue(Queue* queue) {
if (isQueueEmpty(queue)) {
printf("Error: queue is empty!\n");
exit(-1);
}
ListNode* firstNode = queue->rear->next->next; // 待删除的队首结点
int result = firstNode->data; // 保存队首结点的数据
queue->rear->next->next = firstNode->next; // 队尾指向队首结点的下一个结点
free(firstNode); // 释放队首结点的空间
return result;
}
// 遍历队列
void traverseQueue(Queue* queue) {
if (isQueueEmpty(queue)) {
printf("Empty queue.\n");
return;
}
ListNode* p = queue->rear->next->next; // 指向队首结点
while (p != queue->rear->next) { // 当遍历到队尾结点时停止
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
// 主函数
int main() {
Queue queue;
initQueue(&queue);
printf("Enqueue: 1, 2, 3, 4\n");
enqueue(&queue, 1);
enqueue(&queue, 2);
enqueue(&queue, 3);
enqueue(&queue, 4);
printf("Queue: ");
traverseQueue(&queue);
printf("Dequeue: %d\n", dequeue(&queue));
printf("Queue: ");
traverseQueue(&queue);
printf("Is queue empty? %d\n", isQueueEmpty(&queue));
printf("Dequeue: %d\n", dequeue(&queue));
printf("Dequeue: %d\n", dequeue(&queue));
printf("Queue: ");
traverseQueue(&queue);
printf("Dequeue: %d\n", dequeue(&queue));
printf("Is queue empty? %d\n", isQueueEmpty(&queue));
return 0;
}
```
运行结果如下:
```
Enqueue: 1, 2, 3, 4
Queue: 1 2 3 4
Dequeue: 1
Queue: 2 3 4
Is queue empty? 0
Dequeue: 2
Dequeue: 3
Queue: 4
Dequeue: 4
Is queue empty? 1
```
阅读全文