本章写的是基于链表的队列,通过链表来实现队列的操作
一个基于链表的队列(Queue)数据结构,先进先出
结构体定义
typedef struct Node {
int data;
struct Node* next;
struct Node* pre;
} Node;
定义一个节点(Node
)结构体,包含数据(data
)、指向下一个节点的指针(next
)和指向前一个节点的指针(pre
)。
初始化队列:
Node* initQueue() {
Node* Q = (Node*)malloc(sizeof(Node));
Q->data = 0;
Q->pre = Q;
Q->next = Q;
return Q;
}
initQueue
函数用于创建一个空的循环链表队列,头节点指向自身,数据计数初始化为0。
入队操作
void enQueue(Node* Q, int data) {
Node* node = (Node*)malloc(sizeof(Node));
if (node == NULL) {
fprintf(stderr, "内存分配失败\n");
return; // 处理分配失败
}
node->data = data;
node->next = Q;
node->pre = Q->pre;
Q->pre->next = node;
Q->pre = node;
Q->data++;
}
enQueue
函数用于将新节点插入到队列的尾部,同时更新数据计数。
检查队列是否为空:
int isEmpty(Node* Q) {
return Q->data == 0; // 判断队列是否为空
}
isEmpty
函数判断队列是否为空。
出队操作:
int deQueue(Node* Q) {
if (isEmpty(Q)) {
printf("队列为空,无法出队\n");
return -1; // 特殊返回值表示出队失败
} else {
Node* node = Q->next;
Q->next = Q->next->next;
Q->next->pre = Q;
int data = node->data; // 保存数据
free(node); // 释放节点内存
Q->data--; // 更新队列中的数据计数
return data; // 返回数据
}
}
deQueue
函数从队列头部移除一个节点,并返回其数据。如果队列为空,则返回-1表示出队失败。
萌新我希望我的学习分享能够对大家有所帮助。如果我的内容对您有益,烦请点一下关注,感谢大家的支持与鼓励!
完整代码
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node* next;
struct Node* pre;
} Node;
Node* initQueue() {
Node* Q = (Node*)malloc(sizeof(Node));
Q->data = 0;
Q->pre = Q;
Q->next = Q;
return Q;
}
void enQueue(Node* Q, int data) {
Node* node = (Node*)malloc(sizeof(Node));
if (node == NULL) {
fprintf(stderr, "内存分配失败\n");
return; // 处理分配失败
}
node->data = data;
node->next = Q;
node->pre = Q->pre;
Q->pre->next = node;
Q->pre = node;
Q->data++;
}
int isEmpty(Node* Q) {
return Q->data == 0; // 判断队列是否为空
}
int deQueue(Node* Q) {
if (isEmpty(Q)) {
printf("队列为空,无法出队\n");
return -1; // 特殊返回值表示出队失败
}
else {
Node* node = Q->next;
Q->next = Q->next->next;
Q->next->pre = Q;
int data = node->data; // 保存数据
free(node); // 释放节点内存
Q->data--; // 更新队列中的数据计数
return data; // 返回数据
}
}
void printQueue(Node* Q) {
Node* node = Q->next;
while (node != Q) {
printf("%d -> ", node->data);
node = node->next;
}
printf("NULL\n");
}
int main() {
Node* Q = initQueue();
enQueue(Q, 1);
enQueue(Q, 2);
enQueue(Q, 3);
enQueue(Q, 4);
printQueue(Q);
printf("dequeue = %d\n", deQueue(Q));
printf("dequeue = %d\n", deQueue(Q));
printQueue(Q);
return 0;
}
标签:Node,node,pre,队列,C语言,next,数据结构,data
From: https://blog.csdn.net/weixin_64867865/article/details/144042490