C:编程实现对循环链队列的入队和出队操作。 (1)实验要求 ① 根据输入的队列长度n和各元素值建立一个带头结点的循环链表表示的队列(循环链队列),并且只设一个尾指针来指向尾结点,然后输出队列中各元素值。 ② 将数据元素e入队,并输出入队后的队列中各元素值。 ③ 将循环链队列的队首元素出队,并输出出队元素的值和出队后队列中各元素值。
时间: 2024-02-09 17:09:42 浏览: 71
c语言实现队列的建立,入队,出队
5星 · 资源好评率100%
以下是 C 语言代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node *next;
} Node;
typedef struct {
Node *rear; // 尾指针
} Queue;
// 初始化队列
void initQueue(Queue *q) {
q->rear = NULL;
}
// 判断队列是否为空
int isQueueEmpty(Queue *q) {
return q->rear == NULL;
}
// 入队
void enQueue(Queue *q, int e) {
Node *newNode = (Node *)malloc(sizeof(Node));
newNode->data = e;
if (isQueueEmpty(q)) {
q->rear = newNode;
newNode->next = newNode;
} else {
newNode->next = q->rear->next;
q->rear->next = newNode;
q->rear = newNode;
}
}
// 出队
int deQueue(Queue *q) {
if (isQueueEmpty(q)) {
printf("队列为空,无法出队!\n");
return -1;
}
int ret;
if (q->rear->next == q->rear) { // 队列中只有一个元素
ret = q->rear->data;
free(q->rear);
q->rear = NULL;
} else {
Node *p = q->rear->next;
ret = p->data;
q->rear->next = p->next;
free(p);
}
return ret;
}
// 输出队列中各元素值
void printQueue(Queue *q) {
if (isQueueEmpty(q)) {
printf("队列为空!\n");
return;
}
Node *p = q->rear->next;
printf("队列中各元素值:");
do {
printf("%d ", p->data);
p = p->next;
} while (p != q->rear->next);
printf("\n");
}
int main() {
int n, e;
Queue q;
initQueue(&q);
printf("请输入队列长度n:");
scanf("%d", &n);
printf("请依次输入%d个元素值:", n);
for (int i = 0; i < n; i++) {
scanf("%d", &e);
enQueue(&q, e);
}
printQueue(&q);
printf("请输入要入队的元素值:");
scanf("%d", &e);
enQueue(&q, e);
printQueue(&q);
int deq = deQueue(&q);
if (deq != -1) {
printf("出队元素的值为:%d\n", deq);
printQueue(&q);
}
return 0;
}
```
其中,队列采用带头结点的循环链表表示,只设一个尾指针来指向尾结点。入队操作需要处理队列为空和队列非空两种情况,出队操作需要处理队列为空和队列中只有一个元素两种情况。在入队和出队操作后,需要输出队列中各元素值。
阅读全文