c语言链队列,建立队列,入队,出队,遍历队列
时间: 2023-09-25 09:16:11 浏览: 104
下面是 C 语言实现链队列的代码,包括建立队列、入队、出队和遍历队列的操作。
```c
#include <stdio.h>
#include <stdlib.h>
// 队列结点的结构体
typedef struct Node {
int data;
struct Node *next;
} Node;
// 队列结构体
typedef struct Queue {
Node *front; // 队头指针
Node *rear; // 队尾指针
} Queue;
// 初始化队列
void initQueue(Queue *q) {
q->front = q->rear = NULL;
}
// 入队
void enQueue(Queue *q, int data) {
Node *newNode = (Node *)malloc(sizeof(Node));
newNode->data = data;
newNode->next = NULL;
if (q->rear == NULL) {
q->front = q->rear = newNode;
} else {
q->rear->next = newNode;
q->rear = newNode;
}
}
// 出队
int deQueue(Queue *q) {
if (q->front == NULL) {
printf("Queue is empty.\n");
return -1;
}
Node *p = q->front;
int data = p->data;
if (q->front == q->rear) {
q->front = q->rear = NULL;
} else {
q->front = q->front->next;
}
free(p);
return data;
}
// 遍历队列
void traverseQueue(Queue *q) {
if (q->front == NULL) {
printf("Queue is empty.\n");
return;
}
Node *p = q->front;
while (p != NULL) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
int main() {
Queue q;
initQueue(&q);
// 入队
enQueue(&q, 1);
enQueue(&q, 2);
enQueue(&q, 3);
enQueue(&q, 4);
// 遍历队列
traverseQueue(&q);
// 出队
printf("deQueue: %d\n", deQueue(&q));
printf("deQueue: %d\n", deQueue(&q));
// 遍历队列
traverseQueue(&q);
return 0;
}
```
以上代码中,我们定义了 `Node` 结构体表示队列的结点,其中包含一个整型数据成员和一个指向下一个结点的指针。我们还定义了 `Queue` 结构体表示队列,其中包含指向队头和队尾的指针。接下来,我们分别实现了初始化队列、入队、出队和遍历队列的操作。
在 `enQueue()` 函数中,我们先创建一个新的结点,然后判断队列是否为空。如果队列为空,将新结点同时设为队头和队尾;否则将新结点插入到队尾,并更新队尾指针。
在 `deQueue()` 函数中,我们先判断队列是否为空。如果队列为空,输出错误信息并返回 -1;否则从队头删除一个结点,并返回其数据值。如果队列中只有一个结点,同时更新队头和队尾指针;否则只更新队头指针。
在 `traverseQueue()` 函数中,我们先判断队列是否为空。如果队列为空,输出错误信息;否则从队头开始遍历整个队列,输出每个结点的数据值。
最后,在 `main()` 函数中,我们首先调用 `initQueue()` 函数初始化队列,然后调用 `enQueue()` 函数入队四个元素。接着调用 `traverseQueue()` 函数遍历队列,并分别调用 `deQueue()` 函数出队两个元素。最后再调用 `traverseQueue()` 函数遍历队列一次,以验证入队和出队操作的正确性。
阅读全文