鏈佇列的儲存和入隊出隊操作

2022-03-18 03:52:32 字數 2193 閱讀 7605

今天看圖的廣度優先遍歷的時候,發現用到了佇列,補一下鏈佇列的知識,參考《大話資料結構》的p118~120,自己寫了乙個簡單的測試例子便於理解。

理解起來並不難,用的是單鏈表結構。front指向鍊錶的頭結點(是虛結點,它的next指向第乙個節點),rear指向鍊錶的尾節點。

下面舉個簡單的例子,實現鏈佇列的建立,入隊和出隊操作。

第乙個程式除錯了很久,編譯沒有問題,執行總是崩潰。是對記憶體分配沒有考慮全面,先把錯誤的程式放上來思考一下。

1 #include 2 #include 

3 #include 4

using

namespace

std;

5#define overflow 067

//鏈佇列的結點結構

8 typedef struct

qnode

9qnode;

1314

//佇列的鏈式儲存結構

15 typedef struct

16linkqueue;

1920

//入隊操作,在鍊錶尾部插入結點

21 linkqueue *enqueue(linkqueue *q,char

e)22

4142

//出隊操作,把頭結點的next指向的元素出隊,返回出隊的元素

43char dequeue(linkqueue *q)

4456

57int

main()

58

執行到第36行時候崩潰

通過思考,是因為沒有讓q指向的鏈結構linkqueue中的front和rear指標指向new出來的qnode。

修改後的程式可以正常執行,**和解釋如下(vs2012測試通過):

1 #include 2 #include 

3 #include 4

using

namespace

std;56

#define overflow 078

//鏈佇列的結點結構

9 typedef struct

qnode

10qnode;

1415

//佇列的鏈式儲存結構,可以看到只佔8個位元組(sizeof(linkqueue)==8)

16 typedef struct

17linkqueue;

2021

//鏈佇列的初始化,申請記憶體

22 linkqueue *initqueue(linkqueue *q)

2329

//為什麼new乙個頭結點,頭結點的next指向鏈佇列的第乙個節點,可以思考一下如果沒有頭結點會怎樣?

3031

//入隊操作,在鍊錶尾部插入結點

32void enqueue(linkqueue *q,char

e)33

4950

//出隊操作,把頭結點的next指向的元素出隊,返回出隊的元素

51char dequeue(linkqueue *q)

5260 s=q->front->next;//

把要刪除的結點的位址暫存給p

61 e=s->data;//

把要刪除的結點的data給e,需要返回該元素

62 q->front->next=s->next;//

63if(q->rear==s)

6467

delete s;//

或者free(s);

68 cout<<"ok"

<<"

"輸出出隊元素

69return e;//

返回出隊元素70}

7172

intmain()

73

執行結果:

補充:比較迴圈佇列和鏈佇列

時間上:

基本操作入隊和出隊等都是常數時間,o(1)。

同樣是o(1),也有細微差異。迴圈佇列事先申請好空間,使用期間不釋放。鏈佇列每次申請和釋放節點會存在時間開銷。

空間上:

迴圈佇列必須有乙個固定的長度,如果儲存的元素個數比長度小很多,造成空間浪費的問題。

鏈佇列只需要乙個指標域,**中有講到佔8個位元組(rear和front兩個指標變數分別佔4個位元組)。所以空間上鏈佇列更靈活。

總結:在可以確定佇列長度最大值的情況下,建議用迴圈佇列。如果無法預估佇列長度,用鏈佇列。

鏈佇列的入隊 出隊

test demo.cpp 定義控制台應用程式的入口點。include stdafx.h include stdio.h include windows.h define queuesize 100 假定預分配的佇列空間最多為100個元素 typedef char datatype 假定佇列元素的資...

佇列的入隊和出隊操作

讓我們跟著課程佇列的特點。好比我們生活中也會發生的排隊,先排隊的人先得到服務,先走出佇列,後面來的人後得到服務,所以它排在末尾 我們以順序隊列為式,也就是說佇列的元素存放的都是連續的單元也就是說看起來rear 指 針已經指向末端但是其實前面還有空間可以存放元素,但是已經放不進去了。我們讓front ...

鏈佇列 入隊出隊

include include typedef struct lnode int data struct lnode next linklist typedef struct linklist front linklist rear linkqueue int inqueue linkqueue l...