一个用单链表组成的循环队列,只设一一个尾指针rear,不设头指针,请用c语言编写如下算法:(1) 向循环队列中插入一个元素为x的结点; (2) 从循环队列中删除一个结点。
时间: 2024-05-12 11:14:43 浏览: 132
数据结构算法-习题-答案-带头结点的循环链表表示队列,并且只设一个指针指向队尾元素结点注意不设头指针.docx
5星 · 资源好评率100%
以下是C语言代码实现:
```
#include <stdio.h>
#include <stdlib.h>
// 定义循环队列结点
typedef struct node {
int data;
struct node *next;
} Node;
// 初始化队列
void initQueue(Node **rear) {
*rear = NULL;
}
// 判断队列是否为空
int isEmpty(Node *rear) {
return rear == NULL;
}
// 插入结点
void enqueue(Node **rear, int x) {
Node *newNode = (Node *) malloc(sizeof(Node));
newNode->data = x;
if (*rear == NULL) {
newNode->next = newNode;
*rear = newNode;
} else {
newNode->next = (*rear)->next;
(*rear)->next = newNode;
*rear = newNode;
}
}
// 删除结点
void dequeue(Node **rear) {
if (*rear == NULL) {
printf("队列为空,不能删除结点!\n");
return;
}
if ((*rear)->next == *rear) {
free(*rear);
*rear = NULL;
} else {
Node *temp = (*rear)->next;
(*rear)->next = temp->next;
free(temp);
}
}
// 输出队列元素
void printQueue(Node *rear) {
if (rear == NULL) {
printf("队列为空!\n");
return;
}
Node *temp = rear->next;
do {
printf("%d ", temp->data);
temp = temp->next;
} while (temp != rear->next);
printf("\n");
}
int main() {
Node *rear;
initQueue(&rear);
enqueue(&rear, 1);
enqueue(&rear, 2);
enqueue(&rear, 3);
printf("插入元素后,队列元素为:");
printQueue(rear);
dequeue(&rear);
printf("删除一个元素后,队列元素为:");
printQueue(rear);
return 0;
}
```
注:以上代码实现的是基本单链表循环队列,如果需要考虑线程安全、阻塞等问题,还需要进行相应的改进。
阅读全文