假设以带头结点的循环链表示队列,并且只帮我用C语言写一段程序,设置一个指针指向指向队尾元素(注意:不设置头指针),试编写相应的设置队空,判断队列是否为空、入队和出队算法
时间: 2024-12-16 09:16:20 浏览: 9
在C语言中,我们可以使用结构体和循环链表来表示队列。这里是一个简单的示例,包含队尾指针的概念,实现了队空、判断队列是否为空、入队和出队的操作:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义队列节点结构
typedef struct Node {
int data;
struct Node* next;
} Node;
// 队列结构体
typedef struct Queue {
Node* tail; // 指向队尾的指针
} Queue;
// 初始化队列
void initQueue(Queue* queue) {
queue->tail = NULL;
}
// 判断队列是否为空
int isEmpty(Queue* queue) {
return queue->tail == NULL;
}
// 设置队空
void setQueueEmpty(Queue* queue) {
queue->tail = NULL;
}
// 入队操作 (在队尾添加元素)
void enqueue(Queue* queue, int value) {
Node* newNode = (Node*)malloc(sizeof(Node));
if (newNode == NULL) {
printf("Memory allocation failed.\n");
return;
}
newNode->data = value;
newNode->next = queue->tail;
if (queue->tail != NULL) {
queue->tail->next = newNode; // 如果不是第一个元素,则连接到当前尾部
} else {
queue->tail = newNode; // 如果是第一个元素,直接指向新节点
}
}
// 出队操作 (删除并返回队首元素)
int dequeue(Queue* queue) {
if (isEmpty(queue)) {
printf("Queue is empty.\n");
return -1; // 返回错误代码
}
int value = queue->tail->data;
Node* temp = queue->tail;
queue->tail = queue->tail->next; // 移除最后一个元素
free(temp); // 释放内存
return value; // 返回出队的值
}
int main() {
Queue myQueue;
initQueue(&myQueue);
// 测试操作
if (!isEmpty(&myQueue)) {
printf("Error: Queue should be empty before testing operations.\n");
} else {
enqueue(&myQueue, 10);
enqueue(&myQueue, 20);
enqueue(&myQueue, 30);
if (!isEmpty(&myQueue)) {
printf("Enqueue successful.\n");
} else {
printf("Error: Enqueue did not add elements correctly.\n");
}
int removedValue = dequeue(&myQueue);
if (removedValue == -1) {
printf("Error: Dequeue failed.\n");
} else {
printf("Dequeue returned: %d\n", removedValue);
}
}
return 0;
}
```
这个程序展示了如何使用循环链表作为队列的数据结构,包括初始化、检查空闲、清空、入队和出队操作。记得在实际应用中处理可能出现的内存分配失败的情况。运行上述`main()`函数可以测试以上功能。
阅读全文