小张慢慢成了老张

导航

一种链表的实现

  从别人博客总结而来的,主要是受到内核中链表的启发。与常见的链表不同的,这种链表将节点和数据独立:

  struct list_head
  {
        struct list_head *prev,*next;
  };

  struct entry
  {
        struct list_head* list;
        type data;
  };

  用节点做为遍历的iterator,来处理数据。这样做很好得解决了一个问题,那就是如何使一个链表的实现能独立于数据。不同是数据type就不同,按以往的方式,一种数据就得实现一套链表处理。C++中用模板来解决,而内核链表是C,用这种方法来解决。

  数据在节点以外,那怎么访问节点对应的数据呢?
  内核链表提供了这个宏:
  #define list_entry(ptr, type, member) container_of(ptr, type, member)

  而container_of的定义是:
  #define container_of(ptr, type, member) ({ \
   const typeof( ((type *)0)->member ) *__mptr = (ptr); \
   (type *)( (char *)__mptr - offsetof(type,member) );})

  offsetof是我们熟悉的:
  #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)

  利用list_head在entry中的位置与list_head的指针,反推出entry的位置。
  使用list_entry的方法:
  如定义了
  struct entry
  {
        struct list_head* list;
        int data;
  }myentry;
  调用
  struct entry* return_value=list_entry(list,struct entry,list);
  则
  return_value==&myentry;

 

posted on 2012-06-16 10:40  小张慢慢成了老张  阅读(130)  评论(0编辑  收藏  举报