链队的表示和实现

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

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

链式队列是带头结点的,用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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值