首先先看核心鍊錶的定義:linux-/include/linux/list.h
struct list_head ;
看出來核心鍊錶(迴圈表)只有前驅和後繼指標,沒有資料域,這是和一般的單雙鏈表的區別
示意圖:
初始化鍊錶:
#define list_head_init(name)
#define list_head(name) \
struct list_head name = list_head_init(name)
list_head(name)相當於struct list_head name = list_head_init(name)= 定義並初始化了前驅和後繼指標。等於下邊
struct list_head head= 就是一般的結構體定義並初始化。
新增節點:
static inline void __list_add(struct list_head *newer,
struct list_head *prev,
struct list_head *next)
//插入節點操作
static inline void mlist_add(struct list_head *newer, struct list_head *head)
//頭插法,遍歷時資料逆序
**:static inline void mlist_add_tail(struct list_head *newer, struct list_head *head)
//尾插法,遍歷時資料正序
#include#include#include#include"list.h"
typedef struct _stu
stu; //定義了宿主結構體stu 在宿主結構體中定義了struct list_head的變數list
int main()
//對宿主結構體初始化並新增到以stu_list為頭節點的鍊錶中
list_for_each(pos,&stu_list) //?
mlist_del(&(pstu[4].list)); //刪除的節點
printf("使用list_del()刪除pstu[3]\n");
list_for_each(pos,&stu_list)
mlist_move(&(pstu[2].list),&stu_list); //刪除節點再頭插進去
printf("把pstu[2]移至head和head->next兩個指標所指向的結點之間\n");
list_for_each(pos,&stu_list)
mlist_move_tail(&(pstu[1].list),&stu_list); //刪除節點再尾插進去
printf("把pstu[1]移至head和head->prev兩個指標所指向的結點之間\n");
list_for_each(pos,&stu_list)
free(pstu);
return 0;
}
linux核心學習 核心鍊錶
資料結構是程式設計中很重要的一部分.鍊錶是一種資料結構,程式設計中,我們為了實現鍊錶這種資料結構,常常需要完成他的初始化,新增,遍歷,新增,刪除等功能.針對n多種鍊錶來講,除了內容不同外,但這些 新增,刪除,遍歷操作其實都是可以寫成公共 的,不必每次需要實現一種鍊錶,就重新寫一遍新增,刪除,遍歷的操...
Linux核心學習之鍊錶
文章參照任橋位linux核心修煉之道3.6節編寫。1.鍊錶的定義 這個跟我們在課本上學習的一樣,相當簡單。包括了乙個前項指標,和後項指標。是不是有點不對勁?不錯,竟然沒有資料域!不急,我們慢慢看。struct list head 沒有資料是核心鍊錶的一大特色,因為他採用的方式比較特殊,他不是用鍊錶來...
Linux核心學習之鍊錶
文章參照任橋位linux核心修煉之道3.6節編寫。1.鍊錶的定義 這個跟我們在課本上學習的一樣,相當簡單。包括了乙個前項指標,和後項指標。是不是有點不對勁?不錯,竟然沒有資料域!不急,我們慢慢看。struct list head 沒有資料是核心鍊錶的一大特色,因為他採用的方式比較特殊,他不是用鍊錶來...