数据结构之队列的链式表示
(一)队列的链式表示
若用户无法估计所用队列的长度,则宜采用链队列,仍然两个指针:一个front 头指针,一个rear尾指针
// 链队列的数据定义
#define MAXQIZE 100 //最大长度
typedef struct Qnode {
QElemType data;
stuct Qnode *next;
}QNode,*QuenePtr;
typedef struct {
QuenePtr front // 队头指针
QuenePtr rear // 队尾指针
}LinkQueue
1.链队列初始化
Status initQueue(LinkQueue &Q) {
Q.front = Q.rear = (QueuePtr) malloc(sizeof(QNode)) // 创建头尾指针
if(!Q.front) exit(OVERFLOW);
Q.front -> next = NULL // 将头结点的next置空
return OK
}
2.销毁链队列
// 从头结点开始,依次释放所有结点
Status Destroy Queue(LinkQueue &Q){
while(Q.front){
p = Q.front -> next;
free(Q.front)
Q.front = p
}
}
3.链队列入队
Status EnQueue(LinkQueue &Q,QElemType e) {
p = (QueuePtr)malloc(sizeof(QNode)) // 创建新结点
if(!p) exit (OVERFLOW)
p->data = e // 新结点的数据域 赋值 传入数据
p->next = NULL // 新结点的next域 赋值 为空
Q.rear ->next = p // 尾结点的next域 赋值 为新结点
Q.rear = p // 将尾指针后移到新结点
}
4.链队出队
Status DeQueue(LiinkQueue &Q,QElemType &e) {
if(Q.front == Q.rear) return ERROR // 判断出栈之前是否为空
p = Q.front -> next // 将头指针的next 域赋值给p
e = p->data // p的数据域赋值给e
Q.front -> next = p ->next // 移动头指针到下一个
if(Q.rear == p) Q.rear = Q.front
delete P // 删除结点p
return OK
}
5.链队列的头元素
e = Q.front -> next ->data // 取头指针的next域所指向的元素的data域
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本