3.9 队列的链式表示和实现
3.5.3 队列的链式表示和实现
适用于用户无法估计所用队列的长度,则适宜采用该类型的队列
-
链式队列的结构图如下所示
-
链队列的类型定义
// 这里是定义是每个节点类型
typedef struct Qnode{
QElemType data;
struct Qnode next;
}QNode,QueuePtr;typedef struct{
QuenePtr front; // 队头指针
QuenePtr rear; // 队尾指针
}LinkQueue; -
链队列运算指针变化
- 空队列情况是:Q.front==Q.rear
- 元素x入队列:Q.rear=x
- y入队列:Q.rear=y;
链队列初始化
-
【算法描述】
Status InitQueue(LinkQueue &Q){
Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode));
if(!Q.front)
exit(OVERFLOW);
Q.front->next=NULL;
return OK;
}
销毁队列
-
【算法思想】从队头结点开始,依次释放所有结点
-
【算法描述】
Status DestroyQueue(LinkeQueue &Q){
QNode p;
while(Q.front){
p=Q.front->next;
free(Q.front);
Q.front=p;
}
return OK;
}
将元素e入队
-
【算法思想】在队尾插入新元素
-
【算法描述】
Status EnQueue(LinkQueue &Q,ElemType e){
//QNode p=new QNode();
QNode p=(QueuePtr)malloc(sizeof(QNode));
p->data=e;
p->next=NULL;
Q.rear->next=p;
Q.rear=p;
return OK;
}
链队列出队
-
【算法思想】在队头进行删除元素
-
【算法描述】
Status DeQueue(LinkQueue &Q,ElemType &e){
// 首先是判断队列是否为空
if(Q.front==Q.rear)
return ERROR;
QNode p=Q.front->next;
Q.front=p->next;
free(p);
return OK;
}
求链队列的队头元素
-
【算法思想】查询队头元素的值
-
【算法描述】
Status GetHead(LinkQueue Q,QElemType &e){
if(Q.front==Q.rear)// 判断队列是否为空
return ERROR;
e=Q.front->next->data;
}

浙公网安备 33010602011771号