程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C >> 關於C >> C語言中實現通用雙鏈表

C語言中實現通用雙鏈表

編輯:關於C

/**

  * 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);

  }

  static  void list_del_init(struct list_head *entry)

  {

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

  INIT_LIST_HEAD(entry);

  }

  static  int list_empty(struct list_head *head)

  {

  return head->next == head;

  }

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

  {

  struct list_head *first = list->next;

  if (first != list) {

  struct list_head *last = list->prev;

  struct list_head *at = head->next;

  first->prev = head;

  head->next = first;

  last->next = at;

  at->prev = last;

  }

  }

  typedef struct int_list

  {

  struct list_head list;

  int data;

  } int_list, *pint_list;

  void test_int_list()

  {

  struct int_list *dlink, *newnode, *posnode;

  struct list_head *pos;

  int i;

  NEW_LIST_NODE(int_list, dlink);

  INIT_LIST_HEAD(&dlink->list);

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

  {

  NEW_LIST_NODE(int_list, newnode);

  newnode->data = i;

  list_add_tail(&newnode->list, &dlink->list);

  }

  list_for_each(pos, &dlink->list) {

  posnode = list_entry(pos, int_list, list);

  printf("%d ", posnode->data);

  }

  FREE_LIST(int_list, dlink, list);

  printf("\n");

  }

  typedef struct string_list

  {

  struct list_head list;

  char *data;

  } string_list, *pstring_list;

  void test_string_list()

  {

  char * strings[] = {

  "我們",

  "都是",

  "中國",

  "人"

  };

  struct string_list *dlink, *newnode, *posnode;

  struct list_head *pos;

  int i, length;

  length = sizeof(strings) / sizeof(char *);

  NEW_LIST_NODE(string_list, dlink);

  INIT_LIST_HEAD(&dlink->list);

  for (i = 0; i < length; i++)

  {

  NEW_LIST_NODE(string_list, newnode);

  newnode->data = strings[i];

  list_add(&newnode->list, &dlink->list);

  }

  list_for_each(pos, &dlink->list) {

  posnode = list_entry(pos, string_list, list);

  printf("%s ", posnode->data);

  }

  FREE_LIST(string_list, dlink, list);

  printf("\n");

  }

  int main()

  {

  test_int_list();

  test_string_list();

  }

*
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved