用c语言 以带头结点的循环链表表示队列,并且只设一个指针指向队尾元素结点(不设头指针)。试编写相应的置空队列、判断队列是否为空、入队和出队 等算法
时间: 2023-05-27 18:07:16 浏览: 102
```c
#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
typedef struct Node {
ElemType data;
struct Node *next;
} Node, *QueuePtr;
typedef struct {
QueuePtr rear;
} LinkQueue;
// 初始化队列
void InitQueue(LinkQueue *Q) {
Q->rear = NULL;
}
// 判断队列是否为空
int QueueEmpty(LinkQueue *Q) {
return Q->rear == NULL;
}
// 入队
void EnQueue(LinkQueue *Q, ElemType e) {
QueuePtr p = (QueuePtr) malloc(sizeof(Node));
p->data = e;
if (Q->rear == NULL) { // 队列为空
Q->rear = p;
p->next = p;
} else { // 队列不为空
p->next = Q->rear->next;
Q->rear->next = p;
Q->rear = p;
}
}
// 出队
int DeQueue(LinkQueue *Q, ElemType *e) {
if (QueueEmpty(Q)) {
return 0;
}
QueuePtr p = Q->rear->next;
*e = p->data;
if (p == Q->rear) { // 队列只有一个元素
Q->rear = NULL;
} else { // 队列有多个元素
Q->rear->next = p->next;
}
free(p);
return 1;
}
// 测试
int main() {
LinkQueue Q;
ElemType e;
InitQueue(&Q);
printf("队列是否为空:%d\n", QueueEmpty(&Q));
EnQueue(&Q, 1);
EnQueue(&Q, 2);
EnQueue(&Q, 3);
printf("队列是否为空:%d\n", QueueEmpty(&Q));
while (DeQueue(&Q, &e)) {
printf("出队元素:%d\n", e);
}
printf("队列是否为空:%d\n", QueueEmpty(&Q));
return 0;
}
```
阅读全文