內(nèi)核鏈表與Linux常用數(shù)據(jù)結(jié)構(gòu)

0.這是什么镊辕?有什么用掏婶?
Linux大神將雙向循環(huán)鏈表需要開(kāi)發(fā)者對(duì)鏈表基本操作函數(shù)的封裝逻炊,便于直接調(diào)用(復(fù)雜到用指針套了很多層指針,不過(guò)還有反轉(zhuǎn)等功能哦)
使用:#include "kernel_list.h"

struct kernel_list{//宿主
struct student std;
struct list_head myList;//包含兩個(gè)指針的(小)結(jié)構(gòu)體
}

內(nèi)核鏈表中封裝好的這些宏函數(shù)以及普通函數(shù)絕大部分都是在對(duì)小結(jié)構(gòu)體指針進(jìn)行操作


1.先上來(lái)個(gè)式子熱熱身
((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member)))
含義:

2.大結(jié)構(gòu)體(宿主)
小結(jié)構(gòu)體
使用時(shí)要處理小結(jié)構(gòu)體,操作小就能影響大

3.list_entry是什么

4.注意list_for_each的使用
list_for_each_entry:第一個(gè)參數(shù)不能傳錯(cuò)
參數(shù)代表意思很重要
list_for_each_entry_safe
例子:
//重點(diǎn):指定位置前插
int kernel_assign(struct kernel_list head ,struct kernel_list new ,char name){
struct kernel_list pos;
/
list_for_each list_for_each_entry_safe
/
list_for_each_entry(pos,&head->myList,myList){
if(strcmp(pos->stu.name,name)==0)
break;
}
//注意:這里的pos是大結(jié)構(gòu)體的,不能直接用
pos->myList.prev->next = &new->myList;
new->myList.next = &pos->myList;
new->myList.prev = pos->myList.prev;//與下面交換鹅心,連接會(huì)斷,轉(zhuǎn)換處理
pos->myList.prev = &new->myList;//本來(lái)在第三,連接會(huì)斷行拢,所以放第四
/
list_add()又有什么不同
/
return 0;
//什么時(shí)候會(huì)要pos.myList=pos.myList->next;
}

5.坑:static inline void __list_add(struct list_head *new,struct list_head *prev,struct list_head *next)里三參數(shù)的解析

6.涉及知識(shí)點(diǎn):static inline(多次調(diào)用的且循環(huán)較少或無(wú)循環(huán)的函數(shù)焊傅,犧牲空間實(shí)現(xiàn)快速調(diào)用) & 宏定義(帶參數(shù))

7.相關(guān)參考
http://blog.chinaunix.net/uid-27037833-id-3237153.html
http://blog.csdn.net/tigerjibo/article/details/8299599
http://blog.csdn.net/coding__madman/article/details/51325646

所有的內(nèi)核鏈表的操作函數(shù)都是對(duì)小結(jié)構(gòu)體進(jìn)行操作的剂陡,不要錯(cuò)誤理解成大結(jié)構(gòu)體
(3)內(nèi)核鏈表的遍歷:
方法一:list_for_each()跟list_entry()相互配合實(shí)現(xiàn)遍歷
方法二:list_for_each_entry(pos, head, member) 將方法一的二個(gè)宏函數(shù)合并了
pos ---》大結(jié)構(gòu)體指針
head ---》小結(jié)構(gòu)體指針
member ---》小結(jié)構(gòu)體在大結(jié)構(gòu)體中的名字
注意:第一個(gè)參數(shù)一定不要傳參錯(cuò)誤,是大結(jié)構(gòu)體
方法三:list_for_each_entry_safe(pos, n, head, member) 往往在刪除節(jié)點(diǎn)的時(shí)候使用
pos ---》大結(jié)構(gòu)體指針
n ---》大結(jié)構(gòu)體指針
head ---》小結(jié)構(gòu)體指針
member ---》小結(jié)構(gòu)體在大結(jié)構(gòu)體中的名字
(4)刪除
list_for_each_entry_safe(pos, n, head, member)
list_del(struct list_head *entry)
entry ---》你想要?jiǎng)h除的那個(gè)節(jié)點(diǎn)里面的小結(jié)構(gòu)體指針
(5)list_move(struct list_head *list,
struct list_head *head)
list_move() ---》將指定的節(jié)點(diǎn)移動(dòng)到head的下一個(gè)位置
list_move_tail()---》將指定的節(jié)點(diǎn)移動(dòng)到最后面
(6)container_of(ptr, type, member) 求ptr對(duì)應(yīng)的大結(jié)構(gòu)體
雖然內(nèi)核鏈表沒(méi)有給我們封裝指定位置插入的函數(shù)狐胎,但是你可以自己去寫鸭栖,注意使用的指針是小結(jié)構(gòu)體里面的next和prev
總結(jié):(1)經(jīng)過(guò)反復(fù)使用內(nèi)核鏈表,加上分析了源碼握巢,我們發(fā)現(xiàn)內(nèi)核鏈表跟前面學(xué)的雙向循環(huán)鏈表的操作模式是類似的晕鹊,只是要注意內(nèi)核鏈表是操作的小結(jié)構(gòu)體指針,所有在指針的寫法上變得很啰嗦(自己體會(huì)暴浦,查看我寫的最終代碼)
(2)內(nèi)核鏈表中封裝的那個(gè)小結(jié)構(gòu)體一般都寫成普通結(jié)構(gòu)體溅话,注意在使用的時(shí)候取地址

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市歌焦,隨后出現(xiàn)的幾起案子飞几,更是在濱河造成了極大的恐慌,老刑警劉巖独撇,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件屑墨,死亡現(xiàn)場(chǎng)離奇詭異躁锁,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)卵史,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門战转,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人以躯,你說(shuō)我怎么就攤上這事槐秧。” “怎么了忧设?”我有些...
    開(kāi)封第一講書人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵刁标,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我见转,道長(zhǎng)命雀,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任斩箫,我火速辦了婚禮吏砂,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘乘客。我一直安慰自己狐血,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布易核。 她就那樣靜靜地躺著匈织,像睡著了一般。 火紅的嫁衣襯著肌膚如雪牡直。 梳的紋絲不亂的頭發(fā)上缀匕,一...
    開(kāi)封第一講書人閱讀 49,031評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音碰逸,去河邊找鬼乡小。 笑死,一個(gè)胖子當(dāng)著我的面吹牛饵史,可吹牛的內(nèi)容都是我干的满钟。 我是一名探鬼主播,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼胳喷,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼湃番!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起吭露,我...
    開(kāi)封第一講書人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤吠撮,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后讲竿,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體纬向,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡择浊,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了逾条。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡投剥,死狀恐怖师脂,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情江锨,我是刑警寧澤吃警,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站啄育,受9級(jí)特大地震影響酌心,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜挑豌,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一安券、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧氓英,春花似錦侯勉、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至徘键,卻和暖如春练对,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背吹害。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工螟凭, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人赠制。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓赂摆,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親钟些。 傳聞我的和親對(duì)象是個(gè)殘疾皇子烟号,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容