資料結構與演算法 單 鏈佇列

2021-09-29 14:36:14 字數 4389 閱讀 5381

首先建立單鏈表,和佇列結構,在佇列結構中定義兩個指標變數front、rear,分別用來指向佇列的首部和為尾部。判斷佇列是否為空,是否已滿。

#define maxsize 5 

//佇列的最大容量

typedef

int datatype;

//佇列中元素型別

typedef

struct _qnode qnode;

//鍊錶

typedef qnode * queueptr;

typedef

struct queue linkqueue;

//佇列

//佇列初始化,將佇列初始化為空佇列

void

initqueue

(linkqueue *lq)

//判斷隊列為空

bool

isempty

(linkqueue *lq)

return

false;}

//判斷佇列是否為滿

bool

isfull

(linkqueue *lq)

return

false

;}

防禦式判斷佇列各種不成立條件,無誤後分配新節點,遵循佇列規則,則(新節點)該節點為尾節點,所以next指標置為空。 若該當前隊列為空佇列,那麼此節點就為首節點和尾節點,將首節點指標和尾節點指標同時指向該節點,否則隊首指標不動,將隊尾指標指向當前節點的next指標指向新節點,後將尾指標指向新節點。

//入隊,將元素 data 插入到佇列 lq 中 

bool

enterqueue

(linkqueue *lq,datatype data)

qnode *qnode =

new qnode;

//分配新節點

qnode-

>data = data;

qnode-

>next =

null

;//將新節點的next指標置為空(先進先出原則)if(

isempty

(lq)

)else

lq->length++

;//佇列長度加1

return

true

;}

定義乙個臨時變數儲存首節點,以便釋放記憶體。

//出隊,將佇列中隊頭的元素出隊,其後的第乙個元素成為新的隊首 

bool

deletequeue

(linkqueue *lq, datatype *data)if(

!data)

return

false

; tmp = lq-

>front;

//儲存隊首節點

lq->front = tmp-

>next;

//將隊首指標指向原首節點的下乙個節點if(

!lq-

>front) lq-

>rear =

null

;//如果隊頭出列後不存在其他元素,則 rear 節點也要置空

*data = tmp-

>data;

lq->length--

;//佇列長度減1

delete tmp;

//釋放記憶體

return

true

;}

其他功能在完整**中,實現與順序佇列大體相同,只是實現方式不同而已。

#include

#include

#include

#include

using

namespace std;

#define maxsize 5

//佇列的最大容量

typedef

int datatype;

//佇列中元素型別

typedef

struct _qnode qnode;

//鍊錶

typedef qnode * queueptr;

typedef

struct queue linkqueue;

//佇列

//佇列初始化,將佇列初始化為空佇列

void

initqueue

(linkqueue *lq)

//判斷隊列為空

bool

isempty

(linkqueue *lq)

return

false;}

//判斷佇列是否為滿

bool

isfull

(linkqueue *lq)

return

false;}

//入隊,將元素 data 插入到佇列 lq 中

bool

enterqueue

(linkqueue *lq,datatype data)

qnode *qnode =

new qnode;

//分配新節點

qnode-

>data = data;

qnode-

>next =

null

;//將新節點的next指標置為空(先進先出原則)if(

isempty

(lq)

)else

lq->length++

;//佇列長度加1

return

true;}

//出隊,將佇列中隊頭的元素出隊,其後的第乙個元素成為新的隊首

bool

deletequeue

(linkqueue *lq, datatype *data)if(

!data)

return

false

; tmp = lq-

>front;

//儲存隊首節點

lq->front = tmp-

>next;

//將隊首指標指向原首節點的下乙個節點if(

!lq-

>front) lq-

>rear =

null

;//如果隊頭出列後不存在其他元素,則 rear 節點也要置空

*data = tmp-

>data;

lq->length--

;//佇列長度減1

delete tmp;

//釋放記憶體

return

true;}

//列印佇列中的各元素

void

printqueue

(linkqueue *lq)

tmp = lq-

>front;

while

(tmp)

cout<}//獲取隊首元素,不出隊

bool

gethead

(linkqueue *lq,datatype *data)if(

!data)

return

false

;*data = lq-

>front-

>data;

return

true;}

//清空佇列

void

clearqueue

(linkqueue *lq)

lq->front = lq-

>rear =

null

; lq-

>length =0;

}//獲取佇列中元素的個數

intgetlength

(linkqueue* lq)

intmain()

//列印佇列中的元素

printf

("佇列中的元素(總共%d 個):"

,getlength

(lq));

printqueue

(lq)

; cout << endl;

//出隊

//for(int i=0; i<10; i++)

else

//}

//列印佇列中的元素

printf

("出隊乙個元素後,佇列中剩下的元素[%d]:"

,getlength

(lq));

printqueue

(lq)

; cout

(lq)

; cout<<

"清空佇列!\n"

;printqueue

(lq)

;//清理資源

delete lq;

system

("pause");

return0;

}

資料結構 鏈佇列

佇列沒完全看懂 include include define datatype int 定義節點結構 typedef struct nodequeuenode 定義頭節點 typedef structlinkqueue 初始化鏈佇列,頭節點置空 void initqueue linkqueue q ...

資料結構 鏈佇列

課程實驗,多有不足 include include include define true 1 define false 0 define ok 1 define error 0 typedef int queueelementtype typedef struct node linkqueueno...

資料結構 鏈佇列

鏈式佇列的實現思想同順序佇列類似,只需建立兩個指標 命名為 top 和 rear 分別指向鍊錶中佇列的隊頭元素和隊尾元素 圖 1 所示為鏈式佇列的初始狀態,此時佇列中沒有儲存任何資料元素,因此 top 和 rear 指標都同時指向頭節點。在建立鏈式佇列時,強烈建議初學者建立乙個帶有頭節點的鍊錶,這樣...