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

2021-10-05 02:36:16 字數 4494 閱讀 8403

使用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...