C++ 链式队列实现及优化
C++ 链式队列实现及优化
#include <iostream>
#include <stdlib.h>
// 结点结构体
typedef struct node {
int data;
struct node* next;
} QTYPE;
typedef struct {
QTYPE* front, * rear;
} LinkQueue;
// 初始化队列
LinkQueue* lq;
// 入队
int EnQueue(int x) {
QTYPE *P = (QTYPE*)malloc(sizeof(QTYPE));
P->data = x;
P->next = NULL;
if (lq->front == NULL && lq->rear == NULL) {
lq->front = lq->rear = P;
} else {
lq->rear->next = P;
lq->rear = P; // rear 往后移
}
return 0;
}
// 出队
int DeQueue() {
QTYPE* P;
if (lq->front == NULL && lq->rear == NULL) {
return 0;
} else {
P = lq->front; // 让 P 指队列头的位置
lq->front = lq->front->next; // 队列头向后移
free(P);
}
return 1;
}
// 展示队列中元素
void show() {
QTYPE* P = lq->front;
while (P != NULL) {
printf('%d,', P->data);
P = P->next; // P 指针向后移一个单位
}
printf('\n');
}
// 界面
int menu() {
int choose;
int x;
printf('请你选择操作:\n\t1、入队\n\t2、出队\n\t3、展示\n\t4、退出\n');
if (scanf('%d', &choose) != 1) {
printf('输入错误,请重新操作!\n');
menu();
}
if (choose < 1 || choose > 4) {
printf('输入错误,请重新操作!\n');
menu();
}
switch (choose) {
case 1:
printf('请你选择要输入的元素!\n');
scanf('%d', &x);
EnQueue(x);
menu();
break;
case 2:
DeQueue();
menu();
break;
case 3:
show();
menu();
break;
case 4:
exit(0);
break;
default:
printf('输出错误,请重新操作!\n');
menu();
break;
}
}
// 主函数
int main() {
lq = (LinkQueue*)malloc(sizeof(LinkQueue));
lq->front = lq->rear = NULL;
menu();
return 0;
}
代码优化说明:
- 在
main函数中为lq分配了内存空间。 - 在
EnQueue函数中添加了队列为空时的处理逻辑。 - 在
DeQueue函数中添加了队列为空时的处理逻辑。 - 在
show函数中添加了换行符。 - 在
menu函数中添加了对用户输入非数字情况的处理。 - 在
menu函数中添加了对用户输入超出范围数字情况的处理。 - 在
menu函数的switch语句中添加了break语句,防止代码执行下一个case。
代码使用说明:
- 编译运行代码。
- 程序会提示用户选择操作,用户可以选择“入队”、“出队”、“展示”或“退出”。
- 按照提示输入相应的信息即可进行操作。
代码功能:
- 初始化一个链式队列。
- 支持入队操作,将元素添加到队列尾部。
- 支持出队操作,删除队列头部的元素。
- 支持展示队列中所有元素。
- 支持退出程序。
代码优点:
- 代码结构清晰,易于理解。
- 逻辑完整,功能完善。
- 处理了常见的错误情况,增强了代码的健壮性。
- 提供了友好的用户界面,方便用户使用。
代码缺点:
- 代码中没有对内存泄漏进行处理,在频繁使用队列的情况下可能会造成内存泄漏。
- 代码功能比较简单,缺少一些高级功能,例如判断队列是否为空、获取队列长度等。
后续改进方向:
- 添加内存泄漏处理机制。
- 添加更多功能,例如判断队列是否为空、获取队列长度等。
- 优化用户界面,使其更加友好。
- 将代码封装成一个类,使其更易于使用和扩展。
原文地址: https://www.cveoy.top/t/topic/bjfD 著作权归作者所有。请勿转载和采集!