使用c語言簡單實現鍊錶佇列的操作
#include
#include
#include
#define size (4)
// 節點
typedef
struct snode
snode;
// 鍊錶佇列
typedef
struct slistqueue
qlist;
// 初始化鍊錶佇列
intinitqlist
(qlist *qlist)
;// 從佇列頭部壓入資料
intputqlist
(qlist *qlist,
unsigned
char data[size]);
// 從佇列尾部取出資料
intpopqlist
(qlist *qlist,
unsigned
char
*data)
;// 清空佇列
intclearqlist
(qlist *qlist)
;
初始化:將頭節點的後指標指向尾節點,尾節點的前指標指向頭節點,計數值賦為0。注意:頭尾節點不用於儲存資料。**實現如下:
// 初始化鍊錶佇列
intinitqlist
(qlist *qlist)
// 煉表頭節點的前指標賦值為空
qlist->listhead.prev =
null
;// 煉表頭節點的後指標指向尾節點
qlist->listhead.next =
&(qlist->listtail)
;// 鍊錶尾節點的前指標指向頭節點
qlist->listtail.prev =
&(qlist->listhead)
;// 鍊錶尾節點的後指標賦值為空
qlist->listtail.next =
null
;// 其餘資料清零
memset
(qlist->listhead.data,
0, size)
;memset
(qlist->listtail.data,
0, size)
; qlist->num =0;
return0;
}
輸入資料,從佇列頭部壓入資料:先分配乙個節點(n)的記憶體空間存放資料,宣告乙個臨時節點(t)記錄頭節點(h)的後乙個節點。
將n插入到t和h中間,原本h的後指標是指向t的,現在需要改為指向n,同時n的前指標需要指向h;t的前指標原本指向h的,同樣要改為指向n,n的後指標也要指向t。h和t之間的兩個掛鉤分別斷開接向n,n的前後兩個掛鉤分別勾上h和t。**如下:
// 從佇列頭部壓入資料
intputqlist
(qlist *qlist,
unsigned
char data[size]
)// 先分配乙個節點(n)的記憶體空間存放資料
snode *node =
(snode *
)malloc
(sizeof
(snode));
if(node ==
null
)memset
(node,0,
sizeof
(snode));
memcpy
(node->data, data, size)
;// 臨時節點(t)記錄頭節點(h)的後乙個節點
snode *tem_node = qlist->listhead.next;
// h 的後指標指向 n
qlist->listhead.next = node;
// n 的前指標指向 h
node->prev =
&(qlist->listhead)
;// t 的前指標指向 n
tem_node->prev = node;
// n 的後指標指向 t
node->next = tem_node;
// 佇列計數加一
qlist->num++
;return0;
}
取出資料,從佇列尾部取出資料:尾節點記為ta,先宣告兩個節點,分別為tn和tp,tn記錄ta的前乙個節點,tp記錄tn的前乙個節點。取出資料則將tn的資料傳出去,然後將tn從佇列中移出。移出過程:將ta的前指標指向tp,tn的後指標指向空(ta和tn斷開);將tp的後指標指向ta,tn的前指標指向空(ta和tp斷開)。注意,如果tp為空,那麼ta的前一節點就是頭節點,則佇列無資料可提取。**如下:
// 從佇列尾部取出資料
intpopqlist
(qlist *qlist,
unsigned
char
*data)
// 尾節點記為ta
// 宣告節點tn,記錄ta的前乙個節點
snode *tem_node = qlist->listtail.prev;
// 宣告節點tp,記錄tn的前乙個節點
snode *tem_prev = tem_node->prev;
// 如果tp為空,那麼ta的前一節點就是頭節點,則佇列無資料可提取if(
!tem_prev)
// data不為空,則需要取出資料
// data為空則表示不需要取出資料,直接刪除最後乙個有效資料
if(data)
// ta和tn斷開的過程:
// 將ta的前指標指向tp
qlist->listtail.prev = tem_prev;
// tn的後指標指向空
tem_node->next =
null
;// ta和tp斷開的過程:
// 將tp的後指標指向ta
tem_prev->next =
&(qlist->listtail)
;// tn的前指標指向空
tem_node->prev =
null
;// 將tn節點記憶體釋放
free
(tem_node)
; tem_node =
null
;// 佇列計數減一
qlist->num--
;return0;
}
清空佇列,**如下:
// 清空佇列
intclearqlist
(qlist *qlist)
dowhile
(ret >=0)
;return0;
}
測試**如下:
int
main
(void);
initqlist
(&list)
;// 測試輸入後彈出
while
(tick <5)
else
if(ret ==-2
) ret =
popqlist
(&list,
(unsigned
char*)
&recv);if
(ret ==0)
else
if(ret ==-2
)}printf
("%d.佇列剩餘資料個數:%d\n"
, lognum++
, list.num)
;// 測試連續輸入7個數
while
(tick <5+
7)else
if(ret ==-2
)}printf
("%d.佇列剩餘資料個數:%d\n"
, lognum++
, list.num)
;// 測試連續彈出10個數
while
(tick <5+
7+10)
else
if(ret ==-2
)}printf
("%d.佇列剩餘資料個數:%d\n"
, lognum++
, list.num)
;// 繼續輸入3個數
while
(tick <5+
7+10+
3)else
if(ret ==-2
)}printf
("%d.佇列剩餘資料個數:%d\n"
, lognum++
, list.num)
;// 清空佇列
clearqlist
(&list)
;printf
("%d.佇列剩餘資料個數:%d\n"
, lognum++
, list.num)
;printf
("測試完成\n");
getchar()
;return0;
}
佇列 鍊錶 C語言實現
佇列 queue 的基本概念 佇列的影象模擬 佇列的基本操作 初始化佇列,判空,入隊,出隊,讀隊頭元素,清空佇列 順序儲存存在的問題 如果用順序儲存結構,假設陣列最大值為maxsize,我們怎麼判斷隊空呢。我們可以利用用隊尾 rear 和隊頭 front 的相對位置來進行判斷,如果rear fron...
陣列 鍊錶 佇列和棧 佇列,C語言實現
佇列,顧名思義就是很多個資料在排隊。既然是排隊,那就不能從最前面或者中間插進去,新來的資料只能排在隊伍的最後。另外,我們另外規定只有隊伍最前面的資料才能出去。當然,其實也只有隊伍最前面的資料能被外界檢視。能滿足這種功能的資料結構稱之為佇列。我們可以用陣列 鍊錶實現佇列。這裡用陣列實現簡單佇列。申請1...
鍊錶的C語言實現
編輯 c巨集例項 以下 摘自linux核心2.6.21.5原始碼 部分 展示了鍊錶的另一種實現思路,未採用ansi c標準,採用gnu c標準,遵從gpl版權許可。struct list head define list head init name define list head name st...