核心鍊錶學習注釋

2021-08-08 22:00:13 字數 1816 閱讀 3210

首先先看核心鍊錶的定義: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 沒有資料是核心鍊錶的一大特色,因為他採用的方式比較特殊,他不是用鍊錶來...