数据结构链队列.docx

上传人:b****3 文档编号:3000544 上传时间:2022-11-17 格式:DOCX 页数:5 大小:16.09KB
下载 相关 举报
数据结构链队列.docx_第1页
第1页 / 共5页
数据结构链队列.docx_第2页
第2页 / 共5页
数据结构链队列.docx_第3页
第3页 / 共5页
数据结构链队列.docx_第4页
第4页 / 共5页
数据结构链队列.docx_第5页
第5页 / 共5页
亲,该文档总共5页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

数据结构链队列.docx

《数据结构链队列.docx》由会员分享,可在线阅读,更多相关《数据结构链队列.docx(5页珍藏版)》请在冰豆网上搜索。

数据结构链队列.docx

数据结构链队列

链队列

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");

}

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 法律文书 > 调解书

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1