鏈式佇列,簡稱"鏈佇列",即使用鍊錶實現的佇列儲存結構。
鏈式佇列的實現思想同順序佇列類似,只需建立兩個指標(命名為 top 和 rear)分別指向鍊錶中佇列的隊頭元素和隊尾元素,如下圖所示:
所示為鏈式佇列的初始狀態,此時佇列中沒有儲存任何資料元素,因此 top 和 rear 指標都同時指向頭節點。
在建立鏈式佇列時,強烈建議初學者建立乙個帶有頭節點的鍊錶,這樣實現鏈式佇列會更簡單。由此,我們可以編寫出建立鏈式佇列的 c 語言實現**為:
//鍊錶中的節點結構
typedef
struct qnodeqnode;
//建立鏈式佇列的函式
qnode *
initqueue()
鏈隊佇列中,當有新的資料元素入隊,只需進行以下 3 步操作:
將該資料元素用節點包裹,例如新節點名稱為 elem;
與 rear 指標指向的節點建立邏輯關係,即執行 rear->next=elem;
最後移動 rear 指標指向該新節點,即 rear=elem;
由此,新節點就入隊成功了。
例如,在上圖的基礎上,我們依次將依次入隊,各個資料元素入隊的過程如下圖所示:
資料元素入鏈式佇列的 c 語言實現**為:
qnode*
enqueue
(qnode * rear,
int data)
當鏈式佇列中,有資料元素需要出隊時,按照 「先進先出」 的原則,只需將儲存該資料的節點以及它之前入隊的元素節點按照原則依次出隊即可。這裡,我們先學習如何將隊頭元素出隊。
鏈式佇列中隊頭元素出隊,需要做以下 3 步操作:
通過 top 指標直接找到隊頭節點,建立乙個新指標 p 指向此即將出隊的節點;
將 p 節點(即要出隊的隊頭節點)從鍊錶中摘除;
釋放節點 p,**其所佔的記憶體空間;
例如,在上圖2b) 的基礎上,我們將元素 1 和 2 出隊,則操作過程如下圖所示:
鏈式佇列中隊頭元素出隊的 c 語言實現**為:
void
dequeue
(qnode * top,qnode * rear)
// 1、
qnode * p=top->next;
printf
("%d"
,p->data)
; top->next=p->next;
if(rear==p)
free
(p);
}
注意,將隊頭元素做出隊操作時,需提前判斷佇列中是否還有元素,如果沒有,要提示使用者無法做出隊操作,保證程式的健壯性。鏈式佇列的長度,只需要設定乙個移動指標,由佇列頭部移動直至到佇列尾部,來達到計數的效果。
//佇列的長度
intqueuelength
(qnode * top)
while
(pmove->next !=
null
)return length;
}
鏈式佇列的列印,實際上也就是乙個鍊錶的遍歷過程。
void
printqueue
(qnode * top)
while
(pmove!=
null
)printf
("\n");
}
通過學習鏈式佇列最基本的資料入隊和出隊操作,我們可以就實際問題,對以上**做適當的修改。
前面在學習順序佇列時,由於順序表的侷限性,我們在順序佇列中實現資料入隊和出隊的基礎上,又對實現**做了改進,令其能夠充分利用陣列中的空間。鏈式佇列就不需要考慮空間利用的問題,因為鏈式佇列本身就是實時申請空間。因此,這可以算作是鏈式佇列相比順序佇列的乙個優勢。
這裡給出鏈式隊列入隊和出隊的完整 c 語言**為:
#include
#include
//鍊錶中的節點結構
typedef
struct qnodeqnode;
//建立鏈式佇列的函式
qnode *
initqueue()
qnode*
enqueue
(qnode * rear,
int data)
qnode*
dequeue
(qnode * top,qnode * rear)
qnode * p=top->next;
printf
("出隊的元素是:%d \n"
,p->data)
; top->next=p->next;
if(rear==p)
free
(p);
return rear;
}//佇列的長度
intqueuelength
(qnode * top)
while
(pmove->next !=
null
)return length;
}void
printqueue
(qnode * top)
while
(pmove!=
null
)printf
("\n");
}int
main()
printqueue
(top)
;printf
("佇列的長度為:%d\n"
,queuelength
(top));
//入隊完成,所有資料元素開始出佇列
rear=
dequeue
(top, rear)
; rear=
dequeue
(top, rear)
;return0;
}
程式執行結果為:
1 2 3 4 5 6 7 8 9 10以上就是本次給大家分享的c語言實現鏈式佇列,如今作為大學生的我,也開始受網課的折磨了,在家上網課的感覺比在學校還要累。每天都在上課,寫作業,所以一直更新文章也比較少。需要了解其他的資料結構的知識的,可以訪問個人部落格,我們一起交流分享啊!佇列的長度為:10
出隊的元素是:1
出隊的元素是:2
鏈式佇列 C語言實現
鏈式佇列的儲存結構 我們知道,佇列是操作受限制的線性表,佇列有隊頭和隊尾,插入元素的一端稱為隊頭,刪除元素的一端稱為隊尾。練市佇列的隊頭指標指向當前佇列的隊頭結點位置,隊尾指標指向佇列的當前隊尾結點位置。對於不帶頭結點的鏈式佇列,出佇列時可直接刪除隊頭指標所指的結點,因此,鏈式佇列不帶頭結點更方便。...
C語言實現鏈式佇列
include link queue.h 建立入列 出列顯示所有資料 是否為空 釋放佇列 建立1 void create link queue 1 plinkqueue h h len 0 h header null h tail null 建立2 void create link queue 2 ...
C語言實現鏈式佇列
鏈式佇列原始碼 鏈隊運算演算法 include include typedef char elemtype typedef struct datanode datanode 鏈隊資料節點型別定義 typedef struct linkqunode 鏈隊型別定義 void initqueue link...