首先,我们需要了解链队列的定义和基本操作。
链队列是一种基于链表结构实现的队列,与普通队列相比,其主要不同点是使用链表来存储队列元素,所以不会存在队列溢出的情况。
链队列的基本操作包括:
- 初始化:创建一个空队列。
- 入队:在队列末尾插入一个元素。
- 出队:删除队首元素,并返回其值。
- 队列长度:返回队列中元素的个数。
- 遍历:依次访问队列中的每个元素。
下面是C语言实现链队列的代码及注释:
#include <stdio.h>
#include <stdlib.h>
// 定义链队列结构体
typedef struct Node {
int data; // 数据域
struct Node *next; // 指针域
} Node, *QueuePtr;
typedef struct {
QueuePtr front; // 队首指针
QueuePtr rear; // 队尾指针
} LinkQueue;
// 初始化链队列
void initQueue(LinkQueue *Q) {
Q->front = Q->rear = (QueuePtr)malloc(sizeof(Node));
Q->front->next = NULL;
}
// 入队操作
void enQueue(LinkQueue *Q, int data) {
QueuePtr p = (QueuePtr)malloc(sizeof(Node));
p->data = data;
p->next = NULL;
Q->rear->next = p;
Q->rear = p;
}
// 出队操作
int deQueue(LinkQueue *Q) {
if(Q->front == Q->rear) {
printf("Queue is empty.\n");
exit(0); // 直接退出程序
}
QueuePtr p = Q->front->next;
int data = p->data;
Q->front->next = p->next;
if(Q->rear == p) Q->rear = Q->front; // 如果出队的是队尾元素,则需要更新rear指针
free(p);
return data;
}
// 输出链队列
void printQueue(LinkQueue *Q) {
QueuePtr p = Q->front->next;
while(p != NULL) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
// 测试样例
int main() {
LinkQueue Q;
initQueue(&Q); // 初始化队列,注意一定要传地址
enQueue(&Q, 1); // 入队
enQueue(&Q, 2);
enQueue(&Q, 3);
printQueue(&Q); // 输出队列元素
printf("Dequeue: %d\n", deQueue(&Q)); // 出队
printf("Dequeue: %d\n", deQueue(&Q));
printQueue(&Q);
return 0;
}
以上代码实现了链队列的初始化、入队、出队和遍历操作。我们可以通过调用main
函数中的initQueue
、enQueue
、deQueue
和printQueue
方法来测试链队列的基本操作。
下面给出两个示例说明:
示例1:在上述代码的基础上,在main
函数中添加以下代码,可以输出链队列中元素的个数:
printf("Queue length: %d\n", Q.rear - Q.front);
示例2:修改上述代码中的enQueue
方法,让其在添加元素时,插入到队首而不是队尾:
void enQueue(LinkQueue *Q, int data) {
QueuePtr p = (QueuePtr)malloc(sizeof(Node));
p->data = data;
p->next = NULL;
Q->front->next = p;
Q->front = p;
}
这样修改后,在调用enQueue
方法添加元素时,每次添加的元素都会插入到队首,而不是队尾。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言实现链队列代码 - Python技术站