#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
// 定义链表结点结构体
typedef struct LNode {
int data;
struct LNode* next;
} LNode;
// 定义链式队列结构体
typedef struct {
LNode* front; // 队头
LNode* rear; // 队尾
int len; // 当前队列的成员数
} LinkQueue;
// 初始化队列(不带头结点)
bool Queue_Init(LinkQueue* Q) {
Q->front = Q->rear = NULL;
Q->len = 0;
return true;
}
// 判断队列是否为空
bool Queue_Empty(LinkQueue* Q) {
return Q->front == NULL;
}
// 获取队列有效数据节点个数
int Queue_Length(LinkQueue* Q) {
return Q->len;
}
// 创建队列
void Queue_Create(LinkQueue* Q) {
int x;
scanf("%d", &x);
while (x != 999) {
// 创建新结点
LNode* pTemp = (LNode*)malloc(sizeof(LNode));
pTemp->data = x;
pTemp->next = NULL;
// 链接结点到队列尾部
if (Q->rear == NULL) {
Q->front = Q->rear = pTemp;
} else {
Q->rear->next = pTemp;
Q->rear = pTemp;
}
Q->len += 1;
scanf("%d", &x);
}
}
// 新元素入队
bool Queue_En(LinkQueue* Q, int e) {
// 创建新结点
LNode* pTemp = (LNode*)malloc(sizeof(LNode));
pTemp->data = e;
pTemp->next = NULL;
// 链接结点到队列尾部
if (Q->front == NULL) {
Q->front = Q->rear = pTemp;
} else {
Q->rear->next = pTemp;
Q->rear = pTemp;
}
Q->len += 1;
return true;
}
// 出队
bool Queue_De(LinkQueue* Q, int* e) {
if (Q->front == NULL) return false;
// 记录队头结点,更新队头
LNode* p = Q->front;
Q->front = p->next;
// 获取出队元素的值,更新队列长度
*e = p->data;
Q->len -= 1;
// 如果队列为空,更新队尾
if (Q->front == NULL) {
Q->rear = NULL;
}
// 释放出队结点的内存
free(p);
return true;
}
// 打印队列所有值
void Queue_Show(LinkQueue* Q) {
LNode* node = Q->front;
printf("队列值:");
while (node != NULL) {
printf("%d、", node->data);
node = node->next;
}
printf("\n");
}
// 主函数
int main() {
int i = -1;
LinkQueue Q;
// 初始化队列
Queue_Init(&Q);
printf("队列判空:%s\n", Queue_Empty(&Q) ? "空" : "非空");
// 创建队列
Queue_Create(&Q);
Queue_Show(&Q);
printf("队列长度:%d\n\n", Queue_Length(&Q));
// 入队列
Queue_En(&Q, 10);
Queue_En(&Q, 20);
Queue_En(&Q, 30);
Queue_En(&Q, 40);
Queue_En(&Q, 50);
Queue_Show(&Q);
printf("队列长度:%d\n\n", Queue_Length(&Q));
// 出队列
Queue_De(&Q, &i);
printf("出队列值:%d\n", i);
Queue_Show(&Q);
printf("队列长度:%d\n\n", Queue_Length(&Q));
// 出队列
Queue_De(&Q, &i);
printf("出队列值:%d\n", i);
Queue_Show(&Q);
printf("队列长度:%d\n\n", Queue_Length(&Q));
printf("队列判空:%s\n", Queue_Empty(&Q) ? "空" : "非空");
return 0;
}
队列-链表-不带头结点
最新推荐文章于 2024-09-15 19:04:43 发布