通用C 鍊錶(linux思想)

2021-07-09 09:14:48 字數 2296 閱讀 1485

通用 c鍊錶,適合任意型別

標頭檔案定義mylist.h

# define poison_pointer_delta 0

#define list_poison1 ((void *) 0x00100100 + poison_pointer_delta)

#define list_poison2 ((void *) 0x00200200 + poison_pointer_delta)

//計算member在type中的位置

#define offsetof(type, member) (size_t)(&((type*)0)->member)

//根據member的位址獲取type的起始位址

#define container_of(ptr, type, member) ()

//鍊錶結構

struct list_head

;static inline void init_list_head(struct list_head *list)

static inline void __list_add(struct list_head *new,

struct list_head *prev, struct list_head *next)

//從頭部新增

static inline void list_add(struct list_head *new , struct list_head *head)

//從尾部新增

static inline void list_add_tail(struct list_head *new, struct list_head *head)

static inline void __list_del(struct list_head *prev, struct list_head *next)

static inline void list_del(struct list_head *entry)

static inline void list_move(struct list_head *list, struct list_head *head)

static inline void list_move_tail(struct list_head *list,

struct list_head *head)

#define list_entry(ptr, type, member) \

container_of(ptr, type, member)

#define list_first_entry(ptr, type, member) \

list_entry((ptr)->next, type, member)

#define list_for_each(pos, head) \

for (pos = (head)->next; pos != (head); pos = pos->next)

使用:mylist.c

/**@brief 練習使用linux核心鍊錶,功能包括:

* 定義鍊錶結構,建立鍊錶、插入節點、刪除節點、移動節點、遍歷節點

* *@auther anker @date 2013-12-15

**/#include #include #include #include #include "mylist.h" }

}}int main()

//初始化鍊錶頭部

init_list_head(head);

//將第乙個節點移到末尾

printf("move first node to tail:\n");

list_move_tail(head->next, head);

//刪除最後乙個節點

printf("delete the last node:\n");

list_del(head->prev);

return 0;

}

結果:

root@ubuntu:/test/linux/20160109# ./list 

ap_id: 1

ap_id: 2

ap_id: 3

move first node to tail:

ap_id: 2

ap_id: 3

ap_id: 1

delete the last node:

ap_id: 2

ap_id: 3

root@ubuntu:/test/linux/20160109#

通用鍊錶 通用鍊錶的基本使用

1.1雙向鍊錶指標域 從圖中可以看出雙向鍊錶的前向指標指向前乙個結點的首位址,後向指標指向下乙個節點的首位址,並且指標型別相同,且只能指向與自己型別相同的結構體。1.2通用鍊錶指標域 從圖中可以看出通用鍊錶的前向指標指向前乙個結點的指標域的首位址,後向指標指向下乙個節點的指標域的首位址,所以在不同的...

C 通用鍊錶構建(二)

昨日 了一篇如何構建c 通用鍊錶的文章,自己對c 不熟悉,看了許久沒有看明白這到底是如何實現的。於是打算不管三七二十一了,直接硬搬硬套。不過後來有個比較懂c 的同學幫我看了程式給我講解了那個程式是如何實現的通用鍊錶。注 只看來 c 類實現的方法 該方法採用了c 硬編碼的方式實現通用鍊錶。我們常用的鍊...

Linux核心通用鍊錶詳解

linux核心中充斥著大量的資料結構,這些資料結構很多都是使用結構體來表示 如cdev結構體用於描述乙個字元裝置,再如task struct結構體,是我們所說的程序控制塊pcb,用於描述乙個程序的所有資訊。追尋核心原始碼我們會發現很多都是表示裝置的結構體中都有list head這樣的字段,沒錯這就是...