首先建立單鏈表,和佇列結構,在佇列結構中定義兩個指標變數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 指標都同時指向頭節點。在建立鏈式佇列時,強烈建議初學者建立乙個帶有頭節點的鍊錶,這樣...