佇列 鍊錶 C語言實現

2021-10-05 05:36:15 字數 2163 閱讀 2281

佇列(queue)的基本概念

佇列的影象模擬

佇列的基本操作:初始化佇列,判空,入隊,出隊,讀隊頭元素,清空佇列

順序儲存存在的問題:

如果用順序儲存結構,假設陣列最大值為maxsize,我們怎麼判斷隊空呢。我們可以利用用隊尾(rear)和隊頭(front)的相對位置來進行判斷,如果rear == front則說明隊空。同樣,求隊長的話就可以利用rear - front得出。可是求隊滿的時候卻不能利用rear == maxsize-1這種方法判斷。如下圖。

假設,a1-an依次入隊,再將a1出隊。此時,因為front是出隊點,如果佇列執行過出隊,就算rear == maxsize 此時成立,也不能說明隊滿了。那能不能利用rear - front == maxsize來判斷隊滿呢。仔細思考後發現,如圖,佇列執行過出隊後,front並不指向最開頭的位置。如果rear指向maxsize-1,此時是不算隊滿的,可陣列已經規定好了記憶體空間大小,如果此時執行入隊操作將會造成陣列越界。

我們可以把陣列在邏輯上看成乙個迴圈。

假設陣列長度為6,a1-a6依次入隊,再將a1出隊,效果如圖。

那麼,怎麼將陣列看成乙個迴圈呢,我們利用取餘運算來達到這一點,具體如下:

考慮清楚為什麼%maxsize

然而這又面臨乙個問題。如圖,如果再次進行入隊的話,此時隊滿,可是rear和front將會相等。這與判斷隊空的操作相沖,所以還要一些技巧來化解這個矛盾。具體如下:

以下為佇列的基本操作實現過程:

0. 準備

有寫東西都寫在注釋裡,多看注釋。

#define elementtype int               

//方便起見,元素型別用int,可以根據實際更改

typedef

struct queue

node;

//node為結構型別

typedef

struct

*ptr_que,flag_que;

//ptr_que 相當於 flag_que *

//函式宣告

ptr_que init_queue()

;bool is_empty

(ptr_que p)

;void

en_queue

(ptr_que p, elementtype e)

;bool de_queue

(ptr_que p)

;elementtype get_head

(ptr_que p)

;clear_queue

(ptr_que p)

;

1. 初始化佇列

雖然可以不用頭節點,但總感覺有頭節點更方便。使用malloc函式記得新增標頭檔案#include

//初始化佇列

ptr_que init_queue()

2. 判空

判斷佇列是否為空。使用 bool型別記得新增標頭檔案#include

//判空

bool is_empty

(const ptr_que p)

3. 入隊

入隊要從隊尾(rear)入。

//入隊

void

en_queue

(ptr_que p,elementtype e)

4.出隊

我這裡設定了出隊的時候銷毀資料,讀者可以靈活變通。

//出隊

bool de_queue

(ptr_que p)

5. 讀取隊頭資料
//讀取隊頭元素

elementtype get_head

(const ptr_que p)

6. 清空佇列

因為我的出隊操作時銷毀資料,所以清空佇列時就很方便

//清空佇列

clear_queue

(ptr_que p)

C語言實現簡單的鍊錶佇列

使用c語言簡單實現鍊錶佇列的操作 include include include define size 4 節點 typedef struct snode snode 鍊錶佇列 typedef struct slistqueue qlist 初始化鍊錶佇列 intinitqlist qlist q...

陣列 鍊錶 佇列和棧 佇列,C語言實現

佇列,顧名思義就是很多個資料在排隊。既然是排隊,那就不能從最前面或者中間插進去,新來的資料只能排在隊伍的最後。另外,我們另外規定只有隊伍最前面的資料才能出去。當然,其實也只有隊伍最前面的資料能被外界檢視。能滿足這種功能的資料結構稱之為佇列。我們可以用陣列 鍊錶實現佇列。這裡用陣列實現簡單佇列。申請1...

C語言鍊錶實現佇列

課本上只給了佇列的陣列實現,關於鍊錶實現的留做了作業,現實現如下 queueli.h typedef int elementtype start fig3 57.txt ifndef queueli h define queueli h struct node struct qnode typede...