用c语言以带头结点的循环链表表示队列,并且只设一个指针指向队尾元素结点(不设头指针)。试编写相应的置空队列、判断队列是否为空、入队和出队 等算法。
时间: 2023-05-27 17:06:22 浏览: 237
```
#include<stdio.h>
#include<stdlib.h>
typedef struct node{
int data;
struct node *next;
}LinkNode;
typedef struct {
LinkNode *rear; // 指向队尾结点
}Queue;
void initQueue(Queue *q) { // 置空队列
LinkNode *p = (LinkNode *)malloc(sizeof(LinkNode));
p->next = p; // 指向自己
q->rear = p;
}
int isEmpty(Queue *q) { // 判断队列是否为空
return q->rear->next == q->rear;
}
void enQueue(Queue *q, int x) { // 入队
LinkNode *p = (LinkNode *)malloc(sizeof(LinkNode));
p->data = x;
p->next = q->rear->next; // 将新结点插入到队尾结点之后
q->rear->next = p;
q->rear = p; // 修改队尾指针
}
int deQueue(Queue *q) { // 出队
if (isEmpty(q)) {
printf("Queue is empty!\n");
exit(1);
}
LinkNode *p = q->rear->next->next; // 指向队头结点
int x = p->data;
if (q->rear->next == q->rear) { // 如果只有一个结点
q->rear = q->rear->next; // 修改队尾指针
}
q->rear->next->next = p->next; // 删除队头结点
free(p);
return x;
}
int main() {
Queue q;
initQueue(&q);
printf("Is queue empty? %d\n", isEmpty(&q));
enQueue(&q, 1);
enQueue(&q, 2);
enQueue(&q, 3);
printf("Is queue empty? %d\n", isEmpty(&q));
printf("Dequeue: %d\n", deQueue(&q));
printf("Dequeue: %d\n", deQueue(&q));
printf("Dequeue: %d\n", deQueue(&q));
printf("Is queue empty? %d\n", isEmpty(&q));
return 0;
}
```
阅读全文