栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

链队的表示和实现

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

链队的表示和实现

顺序队列是用数组来存储元素,他的问题和顺序表,顺序栈是一样的:空间大小是固定的。

而链队,链表,链栈的好处是长度可以变化的非常大

链式队列是带头结点的,用front作为头指针指向头结点,然后用rear作为尾指针指向尾结点

 

所以首先定义结点类型,叫做Qnode,类比链表的结点Lnode,栈Snode,增加程序可读性

 结点有两个成员,一个是存储数据的data,另一个是存放指针的*next,指向两个成员的类型struct Qnode(嵌套定义),指向的结点仍然是这种结构类型的结点

另外,我们用这个类型声明typedef了两个类型,一个是结点本身的类型Qnode,另外一个是指向这个结点的指针类型*QuenePtr(front就是这个类型),

比如之前链表的指针类型是*linklist

 

队列比之前链表稍微麻烦一点,这里我们把头指针和尾指针放在一起,定义一个结构类型,

他们都是指向这种结点类型的指针,所以他们两个都是QuenePtr类型,我们包含两个指针的是什么呢?这个就是链式队列linkQuene,

注意这里没有*号,linkQuene不是指针类型,所以要访问front和rear时就要Q.

 

接下来看空队列:
只有一个头结点,头指针和尾指针都指向头结点

如果x出队,修改front的next域的值,指向下一元素

链队列的初始化:

在内存中找到头结点,首尾指针都指向它

c语言:分配这样一块空间malloc(sizeof(QNode)),

转换成这样一个指向空间的指针类型(QuenuPtr)强制类型转换,然后把这块空间的地址赋值给尾指针,

然后把整个表达式的值赋值给头指针

 我们一般不需要判断是否内存很小,但加上判断也可以

再把空结点的next域置空

链队列的销毁:把所有空间全部释放,内存中没有结点了

只要头指针不为空,就把他指的结点释放,所以while(Q.front)

这里有个指针变量p,我们指向下一结点:p=Q.front->next,也可以说是把这一个变量先存在p里

(要是直接把头指针释放,那他的结点的地址就找不到了),

存好后就可以删了 

然后p指针所指的就是头结点了:Q.front=p;将p的值赋值给Q.front,然后进行下一次循环,若不为空就p指向他的下一个,

 或者我们可以把p换成尾指针rear,反正他也留着没什么用,这是利用现成的指针,少用一个变量p

 

入队操作:只能入在对尾,即an的后头

有两个指针,一个指向尾元素,一个指向头结点

将p结点的data域的值设置为要插入的值,将next域的值设置为空,为Q.rear的next域赋值p

算法:

还是从内存中分配这样一块空间malloc,然后转换成指针类型QueuePtr赋值给p,然后p就指向这一块空间了

如果分配不成功,就退出

分配成功,就在data域存放要插入的元素的值,将next域的值设置为空

然后将新结点接在尾部--------修改尾指针next域的值为新结点:Q.rear->next=p

再修改尾指针:Q.rear=p,因为他接进来后就是新的最后一个元素了

出队操作:只能在队头出队,把头结点后头的元素删掉,

若知道一个结点的前驱,则修改前驱的指针域,使他指向他的后继就行了

要删除的结点要释放掉,用指针p指向它,为指针变量p赋值他的地址(在front的next域里):

p=Q.front->next

假如还需要知道删除的元素的值是多少,则通过变量e返回,将p指针所指的data域的值赋值给e

然后就可以修改指针了,将指针直接指向他的后继元素:将p的next域赋值给头结点的next域

怎么清掉这一块?c++用delete,c用free(p)

算法:

再加额外的判断:队列中如果是空,再出队就错,怎么判断队空?头指针和尾指针相等

还有一个特别的地方:

这里指针p是指向头结点的下一元素的,如果头结点的下一元素本身就是尾结点,那我们就不仅要修改头指针,还要修改尾指针。因为没有最后这个元素,最后一个元素已经被删除了,所以尾指针也指向这个结点

这里就是如果发现Q为头结点的下一结点:Q.front->next,又上面已经p=Q.front->next,这里Q。rear=p就是说p是指向头结点的下一结点,即头结点的下一结点就是尾结点,我们删除的就是尾结点,那么这时,尾指针应和头指针一样,都指向头结点:Q.rear=Q.front

求队头元素:就在头结点的下一位置放着

 

所以直接将头结点的下一位置Q.front->next的data域取出来,赋值给e

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/291147.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号