![数据结构(C语言实现)](https://wfqqreader-1252317822.image.myqcloud.com/cover/699/43806699/b_43806699.jpg)
上QQ阅读APP看书,第一时间看更新
3.4.6 链式队列
顺序队列插入和删除操作需要大量移动元素,这样就会严重影响算法的效率,为了避免以上问题,可以采用链式存储结构表示队列。采用链式存储的队列被称为链式队列或链队列。
1.链式队列
一个链式队列通常用链表实现。同时,使用两个指针分别指示链表中存放的第一个元素和最后一个元素的位置。其中指向第一个元素的指针被称为队头指针front,指向最后一个元素的指针被称为队尾指针rear。链式队列的表示如图3.33所示。
有时,为了操作上的方便,在链式队列的第一个结点之前添加一个头结点,并让队头指针指向头结点。其中,头结点的数据域可以存放队列元素的个数信息,指针域指向链式队列的第一个结点。带头结点的链式队列如图3.34所示。
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/98_01.jpg?sign=1739465185-F4Sgzx2yJ1R1iaCRmKkdHbBah6EkLNiT-0-bbe38bfe0ad2c352710e67ff45512ebc)
图3.33 不带头结点的链式队列
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/98_02.jpg?sign=1739465185-Dp2GnYXkg347LFCE4HXzdcDDsjkozXwq-0-dffc0b67f025e8236dd5f90e2745d94a)
图3.34 带头结点的链式队列
在带头结点的链式队列中,当队列为空时,队头指针front和队尾指针rear都指向头结点。如图3.35所示。
在链式队列中,最基本的操作是插入和删除操作。链式队列的插入和删除操作只需要移动队头指针和队尾指针,图3.36表示在队列中插入元素a的情况,图3.37表示队列中插入了元素a,b,c之后的情况,图3.38表示元素a出队的情况。
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/98_03.jpg?sign=1739465185-hnR7XDJndm2Ycwsnn0zPWPDQRk05XwNY-0-69c98de9d58f74762c2a0012e22f844b)
图3.35 带头结点的链式队列为空时的情况
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/98_04.jpg?sign=1739465185-sR0FcF1i5pRKWDdvRoI3WPPqHT2GmELX-0-7fe3d3855900065eb22171eeef55f62b)
图3.36 插入一个元素a的情况
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/98_05.jpg?sign=1739465185-XtofWTikeHY52f5hD3F55iR1ySff8k2D-0-442deb5b12f242c0d1a951b6a3a2d646)
图3.37 插入元素a,b,c的情况
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/98_06.jpg?sign=1739465185-dxlhGmTSFCpSWYhh9jMTw3VUMe1ZQDfn-0-c8121aafe74e05d3d78bc3d3d61d6a10)
图3.38 删除一个元素a的情况
链式队列的类型描述如下:
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/98_07.jpg?sign=1739465185-6MIiGxWmRYBOjyz2PsO737unKsXacGwc-0-9a5d3e54bd17ab4212c80eabf4699822)
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/99_01.jpg?sign=1739465185-058LnBanl2BpUtxslJSCArm5JreSVDmL-0-273eeab8f9214993296ad5cf7ae4ae5b)
2.链式循环队列
链式队列也可以构成循环队列,如图3.39所示。在这种链式循环队列中,可以只设置队尾指针,在这种情况下,队列LQ为空的判断条件为LQ.rear->next==LQ.rear,队空情况如图3.40所示。
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/99_02.jpg?sign=1739465185-YxpgGPvaUXORT2r03MGaP4PyjmcWD0yj-0-8ac5078797c71affd1bd5b39e84ce0df)
图3.39 链式循环队列
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/99_03.jpg?sign=1739465185-8Ryw5CsirCWl0mNzgI7zsLDUDs7AcuMO-0-ba5858acf9223090ce80a37ef11bc574)
图3.40 链式循环队列为空时的情况