linux核心雙向迴圈鍊錶例項

2021-06-22 09:09:46 字數 2247 閱讀 3688

#

ifndef _list_h

#define _list_h

/***核心裡的雙向迴圈鍊錶

*是乙個只有指標域而沒有資料域的結構

*/struct

list;#

define list_head_init(name)

#define list_head(name) \

struct

list name = list_head_init(name)

#define offetof(type, member)

(unsigned

int&

((type *

)0->member))#

define list_entry(ptr, type, member)()

#define list_for_each(pos, head) \

for(pos =

(head)

->next; pos !

=(head)

; pos=pos-

>next)

/***初始化乙個雙向迴圈鍊錶

*/static

inline

void init_list_head(

struct

list

*list

)/**

*函式名:__list_add

*插入乙個new鍊錶

*/static

inline

void __list_add(

struct

list

*new

,struct

list

*prev,

struct

list

*next)

/***函式名:list_add_head

*採用頭插法插入乙個新的鍊錶

*/static

inline

void list_add_head(

struct

list

*new

,struct

list

*head)

/***函式名:list_add_tail

*採用尾插法插入乙個新的鍊錶

*/static

inline

void list_add_tail(

struct

list

*new

,struct

list

*head)

/***函式名:__list_del

*刪除乙個鍊錶

*/static

inline

void __list_del(

struct

list

*prev,

struct

list

*next)

/***函式名:list_del

*刪除乙個具體的鍊錶

*/static

inline

void list_del(

struct

list

*entry)

#endif

list.c:

#include

#include

#include

<

malloc

.h>

#include

"list.h"

struct mylist

;int main(

int args,

char

*argv)

printf

("\n");

list_for_each(pos,

&(head.

list))

printf

("\n");

pos = head.

list

.next;

n = 3;

//刪除第n個元素

for(i = 1; i < n; i++)

pos = pos-

>next;

list_del(pos)

;//刪除鍊錶

list_for_each(pos,

&(head.

list))

return 0;}

0

給主人留下些什麼吧!~~

核心雙向迴圈鍊錶

include include include include include 煉表頭結構 struct list head 真正實現鍊錶插入操作 void list add struct list head nnew,struct list head prev,struct list head n...

linux核心的雙向鍊錶

一 概述 linux核心中大量使用了鍊錶這個基本資料結構,因此有必要去窺探一下其 葫蘆裡賣的是什麼藥 先來些基本知識點吧 1.資料元素間是一對一關係 2.鍊錶中的元素個數是有限的 3.同一表中各資料元素的型別和長度相同。二 實現 先上 有個感性的認識,後面再解釋。include include 煉表...

雙向鍊錶和雙向迴圈鍊錶

和單向鍊錶相比,多了乙個前驅結點。如果他為空,那麼next和prior都指向自己。而對於雙迴圈鍊錶,只需要最後乙個元素的next指向head next,head next的prior指向最後乙個節點即可。新節點s插入鍊錶,s next給p結點,s prior給p prior,然後,p prior n...