本人現從事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...