C语言中如何实现通用双链表
来源:优易学  2011-11-14 14:24:50   【优易学:中国教育考试门户网】   资料下载   IT书店

  /**

  * C 和 C++ 的谁好谁坏的争论还在不断的继续,C语言的使用非常的广范,很多大型的系统都是用C 语言来写的。

  * C++ 似乎有更好的编程范式。支持面向对象,模版,省去了很多处理。

  * C++ 最好不要滥用,具体问题,具体分析。

  *

  */

  #include <stdio.h>

  #include <stdlib.h>

  /**

  * 通用链表声明部分

  */

  struct list_head {

  struct list_head *next, *prev;

  };

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

  #define LIST_HEAD(name) \

  struct list_head name = LIST_HEAD_INIT(name)

  #define INIT_LIST_HEAD(ptr) do { \

  (ptr)->next = (ptr); (ptr)->prev = (ptr); \

  } while (0)

  static  void __list_add(struct list_head * new, struct list_head * prev, struct list_head * next);

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

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

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

  static  void list_del(struct list_head *entry);

  static  void list_del_init(struct list_head *entry);

  static  int list_empty(struct list_head *head);

  static  void list_splice(struct list_head *list, struct list_head *head);

  #define list_entry(ptr, type, member) \

  ((type *)((char *)(ptr)-(size_t)(&((type *)0)->member)))

  #define list_for_each(pos, head) \

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

  #define NEW_LIST_NODE(type, node) \

  {\

  node = (struct type *)malloc( sizeof(struct type)); \

  if (node == NULL) exit(-1);\

  }

  #define FREE_LIST(type, p, list_name)\

  {\

  struct type  *posnode;\

  while(!list_empty(&(p)->list_name)) {\

  posnode = list_entry((&(p)->list_name)->next, type, list_name);\

  list_del((&(p)->list_name)->next);\

  free(posnode);\

  }\

  }

  /**

  * 通用链表实现部分

  */

  static  void __list_add(struct list_head * new, struct list_head * prev, struct list_head * next)

  {

  next->prev = new;

  new->next = next;

  new->prev = prev;

  prev->next = new;

  }

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

  {

  __list_add(new, head, head->next);

  }

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

  {

  __list_add(new, head->prev, head);

  }

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

  {

  next->prev = prev;

  prev->next = next;

  }

  static  void list_del(struct list_head *entry)

  {

  __list_del(entry->prev, entry->next);

  }

 

[1] [2] 下一页

责任编辑:小草

文章搜索:
 相关文章
热点资讯
资讯快报
热门课程培训