1. 程式人生 > 其它 >核心資料結構-連結串列

核心資料結構-連結串列

連結串列作為一種常用的資料結構,核心中使用很多,常用的連結串列把資料結構放入連結串列,定義方式如下:

struct fox {

  unsigned long tail_length;

  unsigned long weight;

  bool is_fantastic;

  struct fox *next;

  struct fox *prev;

};

這種連結串列的定義方式就是,等你建立一個鏈之後,需要自己去實現它的增刪改查操作,如果有很多不同型別的連結串列,就需要為其重複實現增刪改查。為了避免重複造輪子,核心提供了一種精妙的設計——把連結串列放到資料結構。

連結串列在<linux/list.h>中宣告如下:

struct list_head {

  struct list_head *next;

  struct list_head *prev;

};

該連結串列實現了通用的操作比如list_add()方法。

在需要使用連結串列的時候,將改連結串列結構放到自定義的資料結構:

struct fox {

  unsigned long tail_length;

  unsigned long weight;

  bool is_fantastic;

  struct list_head list;

};

該連結串列的操作方法指接受list_head結構作為引數,需要找父結構中包含的變數試,可以使用container_of()巨集。

#define container_of(ptr, type, member) ({ const typeof(((type *)0) *__mptr = (ptr); (type *) ((char *)__mptr - offsetof(type, member));})

因為在C語言中,一個給定結構的變數偏移在編譯時,地址就被ABI固定下來了。