• Linux内核-链表


     linux内核链表的定义(定义了双向链表,不含数据域)

    定义在 /linux-source-3.13.0/include/linux/types.h 头文件中.

    1 struct list_head {
    2         struct list_head *next, *prev;
    3 };

    我们可以利用这个数据结构定义含有数据域的链表,如:

    1 struct my_list
    2 {
    3         void * mydata;   //void * 可以指向任何类型的数据
    4         struct list_head list;  //隐藏了链表指针
    5 } 

     链表的声明和初始化宏(list.h)

    定义在 /linux-source-3.13.0/include/linux/list.h 中.

    1 #define LIST_HEAD_INIT(name) { &(name), &(name) }

    初始化一个名为name的双向链表的头节点.(name.pre = &name , name.next = &name)

    1 #define LIST_HEAD(name) 
    2         struct list_head name = LIST_HEAD_INIT(name)

    通过调用LIST_HEAD,来声明和初始化一个自己的链表头,产生一个空链表.如:LIST_HEAD(mylist_head)

     在链表添加一个节点

    定义在 /linux-source-3.13.0/include/linux/list.h 中

    具体实现:

     1 /*
     2  * Insert a new entry between two known consecutive entries.
     3  *
     4  * This is only for internal list manipulation where we know
     5  * the prev/next entries already!
     6  */
     7 #ifndef CONFIG_DEBUG_LIST
     8 static inline void __list_add(struct list_head *new,
     9                               struct list_head *prev,
    10                               struct list_head *next)
    11 {
    12         next->prev = new;
    13         new->next = next;
    14         new->prev = prev;
    15         prev->next = new;
    16 }
    17 #else
    18 extern void __list_add(struct list_head *new,
    19                               struct list_head *prev,
    20                               struct list_head *next);
    21 #endif
    22 
    23 /**
    24  * list_add - add a new entry
    25  * @new: new entry to be added
    26  * @head: list head to add it after
    27  *
    28  * Insert a new entry after the specified head.
    29  * This is good for implementing stacks.
    30  */
    31 static inline void list_add(struct list_head *new, struct list_head *head) //在head节点后插入new节点,循环链表没有首尾,head可以是任意节点
    32 {
    33         __list_add(new, head, head->next);
    34 }
    35 
    36 /**
    37  * list_add_tail - add a new entry
    38  * @new: new entry to be added
    39  * @head: list head to add it before
    40  *
    41  * Insert a new entry before the specified head.
    42  * This is useful for implementing queues.
    43  */
    44 static inline void list_add_tail(struct list_head *new, struct list_head *head) //在head节点前插入new节点
    45 {
    46         __list_add(new, head->prev, head);
    47 }

     遍历链表

    定义在 /linux-source-3.13.0/include/linux/list.h 中

    1 /**
    2  * list_for_each        -       iterate over a list
    3  * @pos:        the &struct list_head to use as a loop cursor.
    4  * @head:       the head for your list.
    5  */
    6 #define list_for_each(pos, head) 
    7         for (pos = (head)->next; pos != (head); pos = pos->next)

     它实际上是一个for循环,利用传入的pos作为循环变量,从表头开始逐顶向后(next方向)移动pos,直至回到head.

    1 /**
    2  * list_entry - get the struct for this entry
    3  * @ptr:        the &struct list_head pointer.
    4  * @type:       the type of the struct this is embedded in.
    5  * @member:     the name of the list_struct within the struct.
    6  */
    7 #define list_entry(ptr, type, member) 
    8         container_of(ptr, type, member)

    list_entry宏:从结构体(type)某成员变量(menber)指针(prt)来求出该结构体(type)的首指针.

  • 相关阅读:
    解题报告:luogu P3853 [TJOI2007]路标设置
    解题报告:luogu P2678 跳石头
    SG函数
    解题报告:CF622F
    解题报告:luogu P1144 最短路计数
    树剖小结(简述)
    LCA之tarjan离线
    %你赛2020.2
    一个小证明(题解 P5425 Part1)
    科创版简介
  • 原文地址:https://www.cnblogs.com/lrh-xl/p/5327503.html
Copyright © 2020-2023  润新知