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; }