假设以带头结点的循环链表表表示队列,并且只设一个指 针指向队尾元素结点(注意不设头指针),试编写相应的队列初 始化、入队列和出队列的算法。求数据结构代码
时间: 2024-11-10 22:14:20 浏览: 44
假设我们使用单链表作为队列的基础数据结构,由于需要维持队尾节点,我们可以这样做:
```c
// 定义链表节点
typedef struct Node {
int data; // 节点的数据部分
struct Node* next; // 指向下一个节点的指针
} QueueNode;
// 初始化空队列
void initQueue(QueueNode** tail) {
*tail = NULL;
}
// 入队操作 - 添加元素到队尾
void enqueue(QueueNode** tail, int value) {
if (*tail == NULL) { // 如果队列为空,创建新节点并设置为头尾
QueueNode* newNode = (QueueNode*)malloc(sizeof(QueueNode));
newNode->data = value;
newNode->next = newNode; // 创建循环链表
*tail = newNode;
} else {
QueueNode* newNode = (QueueNode*)malloc(sizeof(QueueNode));
newNode->data = value;
newNode->next = *tail; // 新节点的next指向当前尾部
*tail->next = newNode; // 尾部的next指向前一个新节点,形成循环
*tail = newNode; // 更新尾部指针
}
}
// 出队操作 - 返回并移除队首元素(循环链表特殊情况:如果队列只有一个元素,它会被移除)
int dequeue(QueueNode* head) {
if (head != NULL) {
int value = head->data;
QueueNode* temp = head->next;
free(head); // 释放头节点
if (temp == head) { // 如果只有一个元素,更新头尾
head = NULL;
} else {
head = temp;
}
return value;
} else {
printf("Queue is empty.\n");
return -1; // 队列为空,返回错误值
}
}
```
在这个实现中,`initQueue()`初始化一个空的队列,`enqueue()`用于添加元素到队尾,而`dequeue()`用于移除并返回队首元素(如果是循环链表,则会自动处理只有一个元素的情况)。
阅读全文