關於可控大小的雙向迴圈鍊錶

2021-06-23 01:31:27 字數 2032 閱讀 5881

本人現從事linux嵌入式軟體開發工作,入職剛剛1年,是個菜鳥。

最近在工作中遇到了這樣乙個問題:乙個伺服器程式接收來自客戶端的gps資料報,伺服器解析資料報後,將資料儲存到鍊錶中,供給其他介面使用。

我在這裡使用的鍊錶為linux核心中使用的鍊錶,即list.h。大家知道,這個鍊錶非常好用,而且基本上不會出錯,但是它不能控制鍊錶的大小。

我起先想到了乙個辦法,即手動記錄鍊錶此時的大小,如果超過乙個值的話,就不再把新的資料存放到鍊錶中。但是這個辦法顯然是不行的,如果鍊錶滿了就不存放新資料的話,那我們得到的將是過時的gps資訊,資料將失去意義,而且對於應用層來說,資料將會變的「不正確」。

我能想到的可行的辦法,即當鍊錶超過某個大小之後,不再插入新的節點,而是將最新的資料覆蓋掉最老的資料,資料就像操場跑圈,在規定大小的煉表裡奔跑。

想到就開始做吧。

首先定義好鍊錶的大小,這是我們最終的目的:

#define max_list	3

簡單起見,我們定乙個結構體來虛擬需要存放到鍊錶中的gps結構體:

typedef struct testtest;

test *listhead = null;

也許你和我一樣,想知道今天我們的main函式又要做些什麼事情呢?好吧,我們首先來看看main長什麼樣子:

int main(void)

printlist(listhead);

return 0;

}

其實長的很簡單,首先為頭節點分配空間,然後初始化頭節點,接著利用迴圈建立鍊錶,然後列印鍊錶。

需要注意的是,請不要做把鍊錶大小定為0這樣逗比的行為,程式會直接無視你的。

接下來我們挨個看看每個函式都做了什麼。

首先是初始化函式,完成的事情很簡單:

void initlist(test *mylist)

賦初值,然後初始化linux核心鍊錶,這是在list.h中含有的介面。

接著,是我們今天要講的重點,插入鍊錶介面:

//插入節點

static bool insertlist(struct list_head *newer)

list_add_tail(newer, &(listhead->head));

return true;

}

函式的引數為需要新增到鍊錶的新節點的位址,如果此時函式的大小沒有超過最大值,則正常的呼叫list.h中的介面,將節點新增到鍊錶中。

但是如果鍊錶此時超過了最大值,則程式分成三步走:

1.將頭節點搬家,搬到頭節點的下一節點。也就是說,罷免現在頭節點的職務,由「二把手」,即頭節點的下乙個節點擔當頭節點。

2.刪除原頭節點。既然老的頭節點的職務已經被撤了,肯定是因為攤上了什麼事,下面你就要落實金元帥的指示,把老的頭節點給突突了。

3.將需要被插入鍊錶的節點插入到新的投機點之前。因為採用的是程式猿界最負盛譽的老漢推車---「尾插法」,所以最新的元素在頭節點之前,頭節點本身為最老的節點。

按照以上所述的思路,基本上可以完成乙個可以控制大小的雙向迴圈鍊錶。如果你想更改鍊錶的限制,只需要更改那個巨集定義即可。

最後,給我自己一點思考:

如果現在不用這個結構體了,換另外乙個結構體,完成同樣的功能,我是不是要重新寫乙個新的介面,而且**基本上是一樣的。這樣**將無法復用,冗餘度相當高。

我查閱了其他資料,可以用c++模板或者其他已有程式的框架來解決,但是鄙人才疏學淺,尚不能知其一二,還是以後再慢慢研究。

關於這篇文章,還有很多細節沒有講到,比如list.h中刪除節點的介面,其實沒有真正的刪除,只是斷開了這個節點與鍊錶的聯絡,也就相當於拐賣了,還沒撕票。

有關這些細節,日後再說。

謝謝你用玩擼啊擼、cf等「大型」遊戲的時間來閱讀本文,希望在促進你腸道消化的同時,對你有所幫助,願我們共同進步,一起老漢推車。

對了,差點忘記說好的原始碼了。擦類,都不能上傳檔案的,大家請移步到資源頁。

關於迴圈雙向鍊錶

typedef struct node node,link link createlink 建立鍊錶 初始化頭結點 head next null head pre null list head head先申請空間,在賦值,否則無效 printf please input data end with ...

雙向鍊錶和雙向迴圈鍊錶

和單向鍊錶相比,多了乙個前驅結點。如果他為空,那麼next和prior都指向自己。而對於雙迴圈鍊錶,只需要最後乙個元素的next指向head next,head next的prior指向最後乙個節點即可。新節點s插入鍊錶,s next給p結點,s prior給p prior,然後,p prior n...

迴圈鍊錶,雙向鍊錶

迴圈鍊錶 迴圈鍊錶與順序鍊錶之間的區別 迴圈鍊錶最後乙個資料的next指標域不為空,而是指向頭結點,其他基本操作大體相同,只是在判斷表結束的條件變為判斷節點的引用域是否為頭引用 雙向鍊錶 author neosong date oct 10,2017 4 43 01 pm program of in...