今天看圖的廣度優先遍歷的時候,發現用到了佇列,補一下鏈佇列的知識,參考《大話資料結構》的p118~120,自己寫了乙個簡單的測試例子便於理解。
理解起來並不難,用的是單鏈表結構。front指向鍊錶的頭結點(是虛結點,它的next指向第乙個節點),rear指向鍊錶的尾節點。
下面舉個簡單的例子,實現鏈佇列的建立,入隊和出隊操作。
第乙個程式除錯了很久,編譯沒有問題,執行總是崩潰。是對記憶體分配沒有考慮全面,先把錯誤的程式放上來思考一下。
1 #include 2 #include3 #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 #include3 #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...