数据结构链队列.docx
《数据结构链队列.docx》由会员分享,可在线阅读,更多相关《数据结构链队列.docx(5页珍藏版)》请在冰豆网上搜索。
![数据结构链队列.docx](https://file1.bdocx.com/fileroot1/2022-11/16/065ebd97-4273-435d-a42e-6dbce0c3c8a8/065ebd97-4273-435d-a42e-6dbce0c3c8a81.gif)
数据结构链队列
链队列
1、链队列的定义
队列的链式存储结构简称为链队列。
它是限制仅在表头删除和表尾插入的单链表。
2、链队列的基本运算
(1)置空队
voidInitQueue(LinkQueue*Q)
{
Q->front=Q->rear=NULL;
}
(2)判队空
intQueueEmpty(LinkQueue*Q)
{
returnQ->front==NULL&&Q->rear==Null;
//实际上只须判断队头指针是否为空即可
}
(3)入队
voidEnQueue(LinkQueue*Q,DataTypex)
{//将元素x插入链队列尾部
QueueNode*p=(QueueNode*)malloc(sizeof(QueueNode));//申请新结点
p->data=x; p->next=NULL;
if(QueueEmpty(Q))
Q->front=Q->rear=p; //将x插入空队列
else{//x插入非空队列的尾
Q->rear->next=p; //*p链到原队尾结点后
Q->rear=p; //队尾指针指向新的尾
}
}
(4)出队
DataTypeDeQueue(LinkQueue*Q)
{
DataTypex;
QueueNode*p;
if(QueueEmpty(Q))
Error("Queueunderflow");//下溢
p=Q->front; //指向对头结点
x=p->data; //保存对头结点的数据
Q->front=p->next; //将对头结点从链上摘下
if(Q->rear==p)//原队中只有一个结点,删去后队列变空,此时队头指针已为空
Q->rear=NULL;
free(p); //释放被删队头结点
returnx; //返回原队头数据
}
(5)取队头元素
DataTypeQueueFront(LinkQueue*Q)
{
if(QueueEmpty(Q))
Error("Queueifempty.");
returnQ->front->data;
}
注意:
①和链栈类似,无须考虑判队满的运算及上溢。
②在出队算法中,一般只需修改队头指针。
但当原队中只有一个结点时,该结点既是队头也是队尾,故删去此结点时亦需修改尾指针,且删去此结点后队列变空。
③以上讨论的是无头结点链队列的基本运算。
和单链表类似,为了简化边界条件的处理,在队头结点前也可附加一个头结点,增加头结点的链队列的基本运算【参见练习】
假设数据元素为int型
大概的函数如下所示:
功能函数没怎么写注释,如果你不是很懂的话可以看下书,或者拿只笔出来画画,只是你对这个还没能够明白才不懂的,你把单链表的创建删除过程在纸上一画就会慢慢熟悉明白了的
#include
usingnamespacestd;
structNode
{
intdata;
Node*next;//链表节点的结构
};
structQueue
{
Node*front;
Node*rear;
};//队列的首尾指针
intSetnull(Queue&Q)
{
Q.front=Q.rear=newNode;//将队列置空也是初始化
if(!
Q.front)
return0;
Q.front->next=NULL;
return1;
}
intempty(QueueQ)
{
if(Q.front==Q.rear)
return1;
else
return0;
}
intgetfirst(Queue&Q)
{
if(empty(Q))
{
cout<<"thequeueisempty!
"<return0;
}
else
returnQ.front->next->data;
}
intenqueue(Queue&Q)
{
Node*p;
intelem;
cout<<"输入一个要进队列的数"<cin>>elem;
p=newNode;
if(!
p)
return0;
p->data=elem;
Q.rear->next=p;
Q.rear=p;
Q.rear->next=NULL;
return1;
}
intdel(Queue&Q)
{
if(empty(Q))
{
cout<<"Thequeueisempty!
"<return0;
}
else
{
Node*p;
p=Q.front->next;
Q.front->next=p->next;
if(Q.rear==p)
Q.rear=Q.front;
deletep;
return1;
}
return1;
}
voidtraverse(QueueQ)
{
Q.front=Q.front->next;
while(Q.front)
{
cout<data<<'';
Q.front=Q.front->next;
}
cout<}
voidshowTable(QueueQ)
{
system("cls");//清屏的作用
cout<<"======================================"<cout<<"1----入队"<cout<<"2----出队"<cout<<"3----将队列置空"<cout<<"4----队列第一个元素"<cout<<"5----退出"<cout<<"======================================"<if(empty(Q))
{
cout<<"目前队列内没有元素,为空,选择1向队列内输入元素"<}
else
{
cout<<"当前队列内的元素是:
";
traverse(Q);
}
cout<cout<<"请给出你的选择:
";
}
voidmain()
{
QueueQ;
Setnull(Q);
boolflag=true;
charch;
while(flag)
{
showTable(Q);
cin>>ch;
if(ch=='1')
{
enqueue(Q);
}
elseif(ch=='2')
{
del(Q);
}
elseif(ch=='3')
{
Setnull(Q);
cout<<"队列被置空"<}
elseif(ch=='4')
{
cout<<"队列的第一个元素是"<}
elseif(ch=='5')
{
flag=false;
cout<<"用户选择退出……"<}
else
{
cout<<"输入错误,请重新输入"<}
system("pause");
}
}