数据结构之队列的链式表示
(一)队列的链式表示
若用户无法估计所用队列的长度,则宜采用链队列,仍然两个指针:一个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域

浙公网安备 33010602011771号