版权声明:转载请注明出处。 https://blog.csdn.net/baidu_38304645/article/details/82944906
队列类似线性表和栈,也是定义在线性结构上的ADT,与线性表和栈的区别在于,元素的插入和删除分别在表的两端进行,类似生活中的排队,允许插入的一端为队尾,允许删除端称队头。
用链表表示的队列称为链队列。一个链队列显然需要两个分别指示对头和队尾的指针才能唯一确定。
首先是定义辅助宏:
#define ERROR 0
#define OK 1
#define FALSE 0
#define TRUE 1
#define OVERFLOW -1
typedef int Status;
typedef int QElemType;
链队列的存储结构定义:
//链队列的存储结构定义
typedef struct QNode {
QElemType data;
struct QNode *next;
}QNode,*QueuePtr;
typedef struct{
QueuePtr front;//队头指针
QueuePtr rear;//队尾指针
}LinkQueue;
构造一个空队列Q.
Status InitQueue(LinkQueue &Q){
//构造一个空队列Q
Q.front=(QNode *)malloc(sizeof(QNode));
if(!Q.front)
exit(OVERFLOW); //存储分配失败
Q.rear=Q.front;
Q.front->next=NULL;
return OK;
}
销毁队列.
Status DestroyQueue(LinkQueue &Q){
//销毁队列
while(Q.front){
Q.rear=Q.front->next;
free(Q.front);
Q.front=Q.rear;
}
Q.front=NULL;
Q.rear=NULL;
return OK;
}
向队列中插入一个元素e.
Status EnQueue(LinkQueue &Q,QElemType e){
//向队列中插入一个元素e
QueuePtr p;
p=(QueuePtr)malloc(sizeof(QNode));
if(!p) //存储分配失败
exit(OVERFLOW);
p->data=e;
p->next=NULL;
Q.rear->next=p; //修改尾指针
Q.rear=p;
return OK;
}
若队列不空,则删除Q的队头元素,用e返回其值,并返回OK 否则返回ERROR.
Status DeQueue(LinkQueue &Q,QElemType &e){
//若队列不空,则删除Q的队头元素,用e返回其值,并返回OK 否则返回ERROR
if(Q.front==Q.rear)
return ERROR;
QueuePtr p=Q.front->next;
e=p->data;
Q.front->next=p->next;
if(p==Q.rear) //只有一个结点时修改队尾指针
Q.rear=Q.front;
free(p);
p=NULL;
return OK;
}
清空队列.
Status ClearQueue(LinkQueue &Q){
//清空队列
QueuePtr p=Q.front->next,q;
while(p){
q=p->next;
free(p);
p=q;
}
Q.rear=Q.front;//修改队尾指针
return OK;
}
若队列为空队列返回TRUE 否则返回FALSE.
Status QueueEmpty(LinkQueue &Q){
//若队列为空队列返回TRUE 否则返回FALSE
if(Q.front==Q.rear)
return TRUE;
return FALSE;
}
返回队列的长度.
扫描二维码关注公众号,回复:
3429138 查看本文章
int QueueLength(LinkQueue &Q){
//返回队列的长度
int i=0;
QueuePtr p=Q.front->next,q;
while(p){
i++;
p=p->next;
}
return i;
}
若队列不空用e返回 队头元素,并返回OK 否则返回ERROR.
Status GetHead(LinkQueue &Q,QElemType &e){
//若队列不空用e返回 队头元素,并返回OK 否则返回ERROR
if(Q.front==Q.rear)
return ERROR;
e=Q.front->next->data;
return OK;
}
从队头到队尾依次对队列Q中的每个元素调用函数visit() 返回OK.一旦visit失败则操作失败。是空队列返回ERROR
Status QueueTraverse(LinkQueue &Q,Status (*visit)(QElemType &)){
//从队头到队尾依次对队列Q中的每个元素调用函数visit() 返回OK.一旦visit失败则操作失败。是空队列返回ERROR
if(Q.front==Q.rear)
return ERROR;
QueuePtr p=Q.front->next;
while(p){
visit(p->data);
p=p->next;
}
return OK;
}