一个用单链表组成的循环队列,只设一个尾指针rear,不设头指针,请用c语言编写如下算法:(1) 向循环队列中插入一个元素为x的结点; (2) 从循环队列中删除一个结点。
时间: 2024-05-16 10:16:50 浏览: 130
数据结构算法-习题-答案-带头结点的循环链表表示队列,并且只设一个指针指向队尾元素结点注意不设头指针.docx
5星 · 资源好评率100%
下面是用C语言实现的循环队列插入和删除算法:
```c
#include <stdio.h>
#include <stdlib.h>
//定义循环队列结构体
typedef struct node {
int data;
struct node *next;
} Node, *Queue;
//初始化循环队列
void initQueue(Queue *rear) {
*rear = NULL;
}
//向循环队列中插入一个元素为x的结点
void insertQueue(Queue *rear, int x) {
Node *p = (Node*)malloc(sizeof(Node));
p->data = x;
if (*rear == NULL) { //队列为空时,新节点作为队列唯一元素
p->next = p;
*rear = p;
} else {
p->next = (*rear)->next; //新节点插入队尾
(*rear)->next = p;
*rear = p;
}
}
//从循环队列中删除一个结点
void deleteQueue(Queue *rear) {
if (*rear == NULL) { //队列为空时,无法删除
printf("Queue is empty.\n");
} else if ((*rear)->next == *rear) { //队列中只有一个元素时,删除该元素并将队列置为空
free(*rear);
*rear = NULL;
} else {
Node *p = (*rear)->next; //删除队头元素
(*rear)->next = p->next;
free(p);
}
}
int main() {
Queue rear;
initQueue(&rear);
insertQueue(&rear, 1);
insertQueue(&rear, 2);
insertQueue(&rear, 3);
deleteQueue(&rear);
deleteQueue(&rear);
deleteQueue(&rear);
deleteQueue(&rear);
return 0;
}
```
上述代码中,我们用一个指针rear表示循环队列的尾部,当rear为NULL时,表示队列为空。在插入元素时,如果队列为空,则新节点作为队列唯一元素;否则,将新节点插入队尾。在删除元素时,如果队列为空,则无法删除;如果队列中只有一个元素,则删除该元素并将rear置为NULL;否则,删除队头元素即可。
阅读全文