C語言——經典之雙向鍊表的實現

1、節點定義

typedef struct DListElement_

{

void * data;

struct DListElement_ *prev;

struct DListElement_ *next;

}DListElement;

2、鏈表定義

typedef struct DList_

{

int size;

DListElement *head;

DListElement *tail;

}Dlist;

3、從某個節點的頭部插入

  • int dlist_ins_prev(Dlist *list, DListElement *element, const void *data)
  • {
  • DListElement *new_element;
  • if (element == NULL && list->size != 0)//給定的節點無效
  • return -1;
  • if ((new_element = (DListElement *)malloc(sizeof(DListElement))) == NULL)
  • return -1;
  • new_element->data = (void *)data;
  • if (list->size == 0)//插入的為頭節點
  • {
  • list->head = new_element;
  • list->tail = new_element;
  • new_element->prev = NULL;
  • new_element->next = NULL;
  • }
  • else//剩下的情況插入操作都是一樣的
  • {
  • element->prev->next = new_element;
  • new_element->prev = element->prev;
  • element->prev = new_element;
  • new_element->next = element;
  • }
  • list->size++;
  • return;
  • }

4、從某個節點的尾部插入

  • int dlist_ins_next(Dlist *list, DListElement *element, const void *data)
  • {
  • DListElement *new_element;
  • if (element == NULL && list->size != 0)
  • return -1;
  • if ((new_element = (DListElement *)malloc(sizeof(DListElement))) == NULL)
  • return -1;
  • new_element->data = (void *)data;
  • if (list->size == 0)//插入的為頭節點
  • {
  • list->head = new_element;
  • list->tail = new_element;
  • new_element->prev = NULL;
  • new_element->next = NULL;
  • }
  • else
  • {
  • if (element->next == NULL)//插入的為尾節點
  • {
  • new_element->next = NULL;
  • list->tail = new_element;
  • }
  • else
  • {
  • new_element->next = element->next;
  • element->next->prev = new_element;
  • }
  • element->next = new_element;
  • new_element->prev = element;
  • }
  • list->size++;
  • return;
  • }

5、刪除節點

int dlist_rm_node(Dlist *list, DListElement *element, void **data)

  • {
  • if (element == NULL || list->size == 0)
  • return -1;
  • //這裡有一個關於二重指針作為傳出參數的操作,主要原因是,因為我們需要傳出的是一個一重指針的值,所以需要傳入他的地址,即二重指針來獲取。如果傳入一重指針,則最後的結果和兩個變量的問題一樣。
  • *data = element->data;//獲取節點的數據
  • if (element->prev == NULL)//刪除頭部節點
  • {
  • list->head = element->next;
  • list->head->prev = NULL;
  • }
  • if (element->next == NULL)//刪除尾部節點
  • {
  • list->tail = element->prev;
  • list->tail->next = NULL;
  • }
  • else//刪除中間節點
  • {
  • element->prev = element->next;
  • element->next->prev = element->prev;
  • }
  • if (element != NULL)
  • {
  • free(element);
  • }
  • list->size--;
  • return;
  • }

6、鏈表的遍歷

int dlist_ergodic(Dlist *list)

{

DListElement *p;

p = list->head;

while (p->next != NULL)

{

printf("%d-", (int)(p->data));

p = p->next;

}

printf("%d-", (int)(p->data));

printf("\n鏈表的長度為%d.\n", list->size);

return;

}

首先編寫頭文件,頭文件裡做相關的定義和聲明,DList.h內容如下:

[cpp] view plain copy

  1. #ifndef DList_H
  2. #define DList_H
  3. typedef int Item;
  4. typedef struct
    Node * PNode;
  5. typedef PNode Position;
  6. /*定義節點類型*/
  7. typedef struct Node
  8. {
  9. Item data; /*數據域*/
  10. PNode previous; /*指向前驅*/
  11. PNode next; /*指向後繼*/
  12. }Node;
  13. /*定義鏈表類型*/
  14. typedef struct
  15. {
  16. PNode head; /*指向頭節點*/
  17. PNode tail; /*指向尾節點*/
  18. int size;
  19. }DList;
  20. /*分配值為i的節點,並返回節點地址*/
  21. Position MakeNode(Item i);
  22. /*釋放p所指的節點*/
  23. void FreeNode(PNode p);
  24. /*構造一個空的雙向鏈表*/
  25. DList* InitList();
  26. /*摧毀一個雙向鏈表*/
  27. void DestroyList(DList *plist);
  28. /*將一個鏈表置為空表,釋放原鏈表節點空間*/
  29. void ClearList(DList *plist);
  30. /*返回頭節點地址*/
  31. Position GetHead(DList *plist);
  32. /*返回尾節點地址*/
  33. Position GetTail(DList *plist);
  34. /*返回鏈表大小*/
  35. int GetSize(DList *plist);
  36. /*返回p的直接後繼位置*/
  37. Position GetNext(Position p);
  38. /*返回p的直接前驅位置*/
  39. Position GetPrevious(Position p);
  40. /*將pnode所指節點插入第一個節點之前*/
  41. PNode InsFirst(DList *plist,PNode pnode);
  42. /*將鏈表第一個節點刪除並返回其地址*/
  43. PNode DelFirst(DList *plist);
  44. /*獲得節點的數據項*/
  45. Item GetItem(Position p);
  46. /*設置節點的數據項*/
  47. void SetItem(Position p,Item i);
  48. /*刪除鏈表中的尾節點並返回其地址,改變鏈表的尾指針指向新的尾節點*/
  49. PNode Remove(DList *plist);
  50. /*在鏈表中p位置之前插入新節點S*/
  51. PNode InsBefore(DList *plist,Position p,PNode s);
  52. /*在鏈表中p位置之後插入新節點s*/
  53. PNode InsAfter(DList *plist,Position p,PNode s);
  54. /*返回在鏈表中第i個節點的位置*/
  55. PNode LocatePos(DList *plist,int i);
  56. /*依次對鏈表中每個元素調用函數visit()*/
  57. void ListTraverse(DList *plist,void (*visit)());
  58. #endif

接下來逐個實現其功能,DList.c內容如下:

[cpp] view plain copy

  1. #include"DList.h"
  2. #include
  3. #include
  4. /*分配值為i的節點,並返回節點地址*/
  5. Position MakeNode(Item i)
  6. {
  7. PNode p = NULL;
  8. p = (PNode)malloc(sizeof(Node));
  9. if(p!=NULL)
  10. {
  11. p->data = i;
  12. p->previous = NULL;
  13. p->next = NULL;
  14. }
  15. return p;
  16. }
  17. /*釋放p所指的節點*/
  18. void FreeNode(PNode p)
  19. {
  20. free(p);
  21. }
  22. /*構造一個空的雙向鏈表*/
  23. DList * InitList()
  24. {
  25. DList *plist = (DList *)malloc(sizeof(DList));
  26. PNode head = MakeNode(0);
  27. if(plist!=NULL)
  28. {
  29. if(head!=NULL)
  30. {
  31. plist->head = head;
  32. plist->tail = head;
  33. plist->size = 0;
  34. }
  35. else
  36. return NULL;
  37. }
  38. return plist;
  39. }
  40. /*摧毀一個雙向鏈表*/
  41. void DestroyList(DList *plist)
  42. {
  43. ClearList(plist);
  44. free(GetHead(plist));
  45. free(plist);
  46. }
  47. /*判斷鏈表是否為空表*/
  48. int IsEmpty(DList *plist)
  49. {
  50. if(GetSize(plist)==0&&GetTail(plist)==GetHead(plist))
  51. return 1;
  52. else
  53. return 0;
  54. }
  55. /*將一個鏈表置為空表,釋放原鏈表節點空間*/
  56. void ClearList(DList *plist)
  57. {
  58. PNode temp,p;
  59. p = GetTail(plist);
  60. while(!IsEmpty(plist))
  61. {
  62. temp = GetPrevious(p);
  63. FreeNode(p);
  64. p = temp;
  65. plist->tail = temp;
  66. plist->size--;
  67. }
  68. }
  69. /*返回頭節點地址*/
  70. Position GetHead(DList *plist)
  71. {
  72. return plist->head;
  73. }
  74. /*返回尾節點地址*/
  75. Position GetTail(DList *plist)
  76. {
  77. return plist->tail;
  78. }
  79. /*返回鏈表大小*/
  80. int GetSize(DList *plist)
  81. {
  82. return plist->size;
  83. }
  84. /*返回p的直接後繼位置*/
  85. Position GetNext(Position p)
  86. {
  87. return p->next;
  88. }
  89. /*返回p的直接前驅位置*/
  90. Position GetPrevious(Position p)
  91. {
  92. return p->previous;
  93. }
  94. /*將pnode所指節點插入第一個節點之前*/
  95. PNode InsFirst(DList *plist,PNode pnode)
  96. {
  97. Position head = GetHead(plist);
  98. if(IsEmpty(plist))
  99. plist->tail = pnode;
  100. plist->size++;
  101. pnode->next = head->next;
  102. pnode->previous = head;
  103. if(head->next!=NULL)
  104. head->next->previous = pnode;
  105. head->next = pnode;
  106. return pnode;
  107. }
  108. /*將鏈表第一個節點刪除,返回該節點的地址*/
  109. PNode DelFirst(DList *plist)
  110. {
  111. Position head = GetHead(plist);
  112. Position p=head->next;
  113. if(p!=NULL)
  114. {
  115. if(p==GetTail(plist))
  116. plist->tail = p->previous;
  117. head->next = p->next;
  118. head->next->previous = head;
  119. plist->size--;
  120. }
  121. return p;
  122. }
  123. /*獲得節點的數據項*/
  124. Item GetItem(Position p)
  125. {
  126. return p->data;
  127. }
  128. /*設置節點的數據項*/
  129. void SetItem(Position p,Item i)
  130. {
  131. p->data = i;
  132. }
  133. /*刪除鏈表中的尾節點並返回地址,改變鏈表的尾指針指向新的尾節點*/
  134. PNode Remove(DList *plist)
  135. {
  136. Position p=NULL;
  137. if(IsEmpty(plist))
  138. return NULL;
  139. else
  140. {
  141. p = GetTail(plist);
  142. p->previous->next = p->next;
  143. plist->tail = p->previous;
  144. plist->size--;
  145. return p;
  146. }
  147. }
  148. /*在鏈表中p位置之前插入新節點s*/
  149. PNode InsBefore(DList *plist,Position p,PNode s)
  150. {
  151. s->previous = p->previous;
  152. s->next = p;
  153. p->previous->next = s;
  154. p->previous = s;
  155. plist->size++;
  156. return s;
  157. }
  158. /*在鏈表中p位置之後插入新節點s*/
  159. PNode InsAfter(DList *plist,Position p,PNode s)
  160. {
  161. s->next = p->next;
  162. s->previous = p;
  163. if(p->next != NULL)
  164. p->next->previous = s;
  165. p->next = s;
  166. if(p = GetTail(plist))
  167. plist->tail = s;
  168. plist->size++;
  169. return s;
  170. }
  171. /*返回在鏈表中第i個節點的位置*/
  172. PNode LocatePos(DList *plist,int i)
  173. {
  174. int cnt = 0;
  175. Position p = GetHead(plist);
  176. if(i>GetSize(plist)||i<1)
  177. return NULL;
  178. while(++cnt<=i)
  179. {
  180. p=p->next;
  181. }
  182. return p;
  183. }
  184. /*依次對鏈表中每個元素調用函數visit()*/
  185. void ListTraverse(DList *plist,void (*visit)())
  186. {
  187. Position p = GetHead(plist);
  188. if(IsEmpty(plist))
  189. exit(0);
  190. else
  191. {
  192. while(p->next!=NULL)
  193. {
  194. p = p->next;
  195. visit(p->data);
  196. }
  197. }
  198. }

接下來進行測試,Test.h內容如下:

[cpp] view plain copy

  1. #include"DList.h"
  2. #include
  3. void print(Item i)
  4. {
  5. printf("數據項為%d \n",i);
  6. }
  7. main()
  8. {
  9. DList *plist = NULL;
  10. PNode p = NULL;

plist = InitList(); 1、節點定義

typedef struct DListElement_

{

void * data;

struct DListElement_ *prev;

struct DListElement_ *next;

}DListElement;

2、鏈表定義

typedef struct DList_

{

int size;

DListElement *head;

DListElement *tail;

}Dlist;

3、從某個節點的頭部插入

  • int dlist_ins_prev(Dlist *list, DListElement *element, const void *data)
  • {
  • DListElement *new_element;
  • if (element == NULL && list->size != 0)//給定的節點無效
  • return -1;
  • if ((new_element = (DListElement *)malloc(sizeof(DListElement))) == NULL)
  • return -1;
  • new_element->data = (void *)data;
  • if (list->size == 0)//插入的為頭節點
  • {
  • list->head = new_element;
  • list->tail = new_element;
  • new_element->prev = NULL;
  • new_element->next = NULL;
  • }
  • else//剩下的情況插入操作都是一樣的
  • {
  • element->prev->next = new_element;
  • new_element->prev = element->prev;
  • element->prev = new_element;
  • new_element->next = element;
  • }
  • list->size++;
  • return;
  • }

4、從某個節點的尾部插入

  • int dlist_ins_next(Dlist *list, DListElement *element, const void *data)
  • {
  • DListElement *new_element;
  • if (element == NULL && list->size != 0)
  • return -1;
  • if ((new_element = (DListElement *)malloc(sizeof(DListElement))) == NULL)
  • return -1;
  • new_element->data = (void *)data;
  • if (list->size == 0)//插入的為頭節點
  • {
  • list->head = new_element;
  • list->tail = new_element;
  • new_element->prev = NULL;
  • new_element->next = NULL;
  • }
  • else
  • {
  • if (element->next == NULL)//插入的為尾節點
  • {
  • new_element->next = NULL;
  • list->tail = new_element;
  • }
  • else
  • {
  • new_element->next = element->next;
  • element->next->prev = new_element;
  • }
  • element->next = new_element;
  • new_element->prev = element;
  • }
  • list->size++;
  • return;
  • }

5、刪除節點

int dlist_rm_node(Dlist *list, DListElement *element, void **data)

  • {
  • if (element == NULL || list->size == 0)
  • return -1;
  • //這裡有一個關於二重指針作為傳出參數的操作,主要原因是,因為我們需要傳出的是一個一重指針的值,所以需要傳入他的地址,即二重指針來獲取。如果傳入一重指針,則最後的結果和兩個變量的問題一樣。
  • *data = element->data;//獲取節點的數據
  • if (element->prev == NULL)//刪除頭部節點
  • {
  • list->head = element->next;
  • list->head->prev = NULL;
  • }
  • if (element->next == NULL)//刪除尾部節點
  • {
  • list->tail = element->prev;
  • list->tail->next = NULL;
  • }
  • else//刪除中間節點
  • {
  • element->prev = element->next;
  • element->next->prev = element->prev;
  • }
  • if (element != NULL)
  • {
  • free(element);
  • }
  • list->size--;
  • return;
  • }

6、鏈表的遍歷

int dlist_ergodic(Dlist *list)

{

DListElement *p;

p = list->head;

while (p->next != NULL)

{

printf("%d-", (int)(p->data));

p = p->next;

}

printf("%d-", (int)(p->data));

printf("\n鏈表的長度為%d.\n", list->size);

return;

}

首先編寫頭文件,頭文件裡做相關的定義和聲明,DList.h內容如下:

[cpp] view plain copy

  1. #ifndef DList_H
  2. #define DList_H
  3. typedef int Item;
  4. typedef struct Node * PNode;
  5. typedef PNode Position;
  6. /*定義節點類型*/
  7. typedef struct Node
  8. {
  9. Item data; /*數據域*/
  10. PNode previous; /*指向前驅*/
  11. PNode next; /*指向後繼*/
  12. }Node;
  13. /*定義鏈表類型*/
  14. typedef struct
  15. {
  16. PNode head; /*指向頭節點*/
  17. PNode tail; /*指向尾節點*/
  18. int size;
  19. }DList;
  20. /*分配值為i的節點,並返回節點地址*/
  21. Position MakeNode(Item i);
  22. /*釋放p所指的節點*/
  23. void FreeNode(PNode p);
  24. /*構造一個空的雙向鏈表*/
  25. DList* InitList();
  26. /*摧毀一個雙向鏈表*/
  27. void DestroyList(DList *plist);
  28. /*將一個鏈表置為空表,釋放原鏈表節點空間*/
  29. void ClearList(DList *plist);
  30. /*返回頭節點地址*/
  31. Position GetHead(DList *plist);
  32. /*返回尾節點地址*/
  33. Position GetTail(DList *plist);
  34. /*返回鏈表大小*/
  35. int GetSize(DList *plist);
  36. /*返回p的直接後繼位置*/
  37. Position GetNext(Position p);
  38. /*返回p的直接前驅位置*/
  39. Position GetPrevious(Position p);
  40. /*將pnode所指節點插入第一個節點之前*/
  41. PNode InsFirst(DList *plist,PNode pnode);
  42. /*將鏈表第一個節點刪除並返回其地址*/
  43. PNode DelFirst(DList *plist);
  44. /*獲得節點的數據項*/
  45. Item GetItem(Position p);
  46. /*設置節點的數據項*/
  47. void SetItem(Position p,Item i);
  48. /*刪除鏈表中的尾節點並返回其地址,改變鏈表的尾指針指向新的尾節點*/
  49. PNode Remove(DList *plist);
  50. /*在鏈表中p位置之前插入新節點S*/
  51. PNode InsBefore(DList *plist,Position p,PNode s);
  52. /*在鏈表中p位置之後插入新節點s*/
  53. PNode InsAfter(DList *plist,Position p,PNode s);
  54. /*返回在鏈表中第i個節點的位置*/
  55. PNode LocatePos(DList *plist,int i);
  56. /*依次對鏈表中每個元素調用函數visit()*/
  57. void ListTraverse(DList *plist,void (*visit)());
  58. #endif

接下來逐個實現其功能,DList.c內容如下:

[cpp] view plain copy

  1. #include"DList.h"
  2. #include
  3. #include
  4. /*分配值為i的節點,並返回節點地址*/
  5. Position MakeNode(Item i)
  6. {
  7. PNode p = NULL;
  8. p = (PNode)malloc(sizeof(Node));
  9. if
    (p!=NULL)
  10. {
  11. p->data = i;
  12. p->previous = NULL;
  13. p->next = NULL;
  14. }
  15. return p;
  16. }
  17. /*釋放p所指的節點*/
  18. void FreeNode(PNode p)
  19. {
  20. free(p);
  21. }
  22. /*構造一個空的雙向鏈表*/
  23. DList * InitList()
  24. {
  25. DList *plist = (DList *)malloc(sizeof(DList));
  26. PNode head = MakeNode(0);
  27. if(plist!=NULL)
  28. {
  29. if(head!=NULL)
  30. {
  31. plist->head = head;
  32. plist->tail = head;
  33. plist->size = 0;
  34. }
  35. else
  36. return NULL;
  37. }
  38. return plist;
  39. }
  40. /*摧毀一個雙向鏈表*/
  41. void DestroyList(DList *plist)
  42. {
  43. ClearList(plist);
  44. free(GetHead(plist));
  45. free(plist);
  46. }
  47. /*判斷鏈表是否為空表*/
  48. int IsEmpty(DList *plist)
  49. {
  50. if(GetSize(plist)==0&&GetTail(plist)==GetHead(plist))
  51. return 1;
  52. else
  53. return 0;
  54. }
  55. /*將一個鏈表置為空表,釋放原鏈表節點空間*/
  56. void ClearList(DList *plist)
  57. {
  58. PNode temp,p;
  59. p = GetTail(plist);
  60. while(!IsEmpty(plist))
  61. {
  62. temp = GetPrevious(p);
  63. FreeNode(p);
  64. p = temp;
  65. plist->tail = temp;
  66. plist->size--;
  67. }
  68. }
  69. /*返回頭節點地址*/
  70. Position GetHead(DList *plist)
  71. {
  72. return plist->head;
  73. }
  74. /*返回尾節點地址*/
  75. Position GetTail(DList *plist)
  76. {
  77. return plist->tail;
  78. }
  79. /*返回鏈表大小*/
  80. int GetSize(DList *plist)
  81. {
  82. return
    plist->size;
  83. }
  84. /*返回p的直接後繼位置*/
  85. Position GetNext(Position p)
  86. {
  87. return p->next;
  88. }
  89. /*返回p的直接前驅位置*/
  90. Position GetPrevious(Position p)
  91. {
  92. return p->previous;
  93. }
  94. /*將pnode所指節點插入第一個節點之前*/
  95. PNode InsFirst(DList *plist,PNode pnode)
  96. {
  97. Position head = GetHead(plist);
  98. if(IsEmpty(plist))
  99. plist->tail = pnode;
  100. plist->size++;
  101. pnode->next = head->next;
  102. pnode->previous = head;
  103. if(head->next!=NULL)
  104. head->next->previous = pnode;
  105. head->next = pnode;
  106. return pnode;
  107. }
  108. /*將鏈表第一個節點刪除,返回該節點的地址*/
  109. PNode DelFirst(DList *plist)
  110. {
  111. Position head = GetHead(plist);
  112. Position p=head->next;
  113. if(p!=NULL)
  114. {
  115. if
    (p==GetTail(plist))
  116. plist->tail = p->previous;
  117. head->next = p->next;
  118. head->next->previous = head;
  119. plist->size--;
  120. }
  121. return p;
  122. }
  123. /*獲得節點的數據項*/
  124. Item GetItem(Position p)
  125. {
  126. return p->data;
  127. }
  128. /*設置節點的數據項*/
  129. void SetItem(Position p,Item i)
  130. {
  131. p->data = i;
  132. }
  133. /*刪除鏈表中的尾節點並返回地址,改變鏈表的尾指針指向新的尾節點*/
  134. PNode Remove(DList *plist)
  135. {
  136. Position p=NULL;
  137. if(IsEmpty(plist))
  138. return NULL;
  139. else
  140. {
  141. p = GetTail(plist);
  142. p->previous->next = p->next;
  143. plist->tail = p->previous;
  144. plist->size--;
  145. return p;
  146. }
  147. }
  148. /*在鏈表中p位置之前插入新節點s*/
  149. PNode InsBefore(DList *plist,Position p,PNode s)
  150. {
  151. s->previous = p->previous;
  152. s->next = p;
  153. p->previous->next = s;
  154. p->previous = s;
  155. plist->size++;
  156. return s;
  157. }
  158. /*在鏈表中p位置之後插入新節點s*/
  159. PNode InsAfter(DList *plist,Position p,PNode s)
  160. {
  161. s->next = p->next;
  162. s->previous = p;
  163. if(p->next != NULL)
  164. p->next->previous = s;
  165. p->next = s;
  166. if(p = GetTail(plist))
  167. plist->tail = s;
  168. plist->size++;
  169. return s;
  170. }
  171. /*返回在鏈表中第i個節點的位置*/
  172. PNode LocatePos(DList *plist,int i)
  173. {
  174. int cnt = 0;
  175. Position p = GetHead(plist);
  176. if(i>GetSize(plist)||i<1)
  177. return NULL;
  178. while(++cnt<=i)
  179. {
  180. p=p->next;
  181. }
  182. return p;
  183. }
  184. /*依次對鏈表中每個元素調用函數visit()*/
  185. void ListTraverse(DList *plist,void (*visit)())
  186. {
  187. Position p = GetHead(plist);
  188. if(IsEmpty(plist))
  189. exit(0);
  190. else
  191. {
  192. while(p->next!=NULL)
  193. {
  194. p = p->next;
  195. visit(p->data);
  196. }
  197. }
  198. }

接下來進行測試,Test.h內容如下:

[cpp] view plain copy

  1. #include"DList.h"
  2. #include
  3. void print(Item i)
  4. {
  5. printf("數據項為%d \n",i);
  6. }
  7. main()
  8. {
  9. DList *plist = NULL;
  10. PNode p = NULL;
  11. plist = InitList();
  12. p = InsFirst(plist,MakeNode(1));
  13. InsBefore(plist,p,MakeNode(2));
  14. InsAfter(plist,p,MakeNode(3));
  15. printf("p前驅位置的值為%d\n",GetItem(GetPrevious(p)));
  16. printf("p位置的值為%d\n",GetItem(p));
  17. printf("p後繼位置的值為%d\n",GetItem(GetNext(p)));
  18. printf("遍歷輸出各節點數據項:\n");
  19. ListTraverse(plist,print);
  20. printf("除了頭節點該鏈表共有%d個節點\n",GetSize(plist));
  21. FreeNode(DelFirst(plist));
  22. printf("刪除第一個節點後重新遍歷輸出為:\n");
  23. ListTraverse(plist,print);
  24. printf("除了頭節點該鏈表共有%d個節點\n",GetSize(plist));
  25. DestroyList(plist);
  26. printf("鏈表已被銷燬\n");
  27. }
  28. p = InsFirst(plist,MakeNode(1));
  29. InsBefore(plist,p,MakeNode(2));
  30. InsAfter(plist,p,MakeNode(3));
  31. printf("p前驅位置的值為%d\n",GetItem(GetPrevious(p)));
  32. printf("p位置的值為%d\n",GetItem(p));
  33. printf("p後繼位置的值為%d\n",GetItem(GetNext(p)));
  34. printf("遍歷輸出各節點數據項:\n");
  35. ListTraverse(plist,print);
  36. printf("除了頭節點該鏈表共有%d個節點\n",GetSize(plist));
  37. FreeNode(DelFirst(plist));
  38. printf("刪除第一個節點後重新遍歷輸出為:\n");
  39. ListTraverse(plist,print);
  40. printf("除了頭節點該鏈表共有%d個節點\n",GetSize(plist));
  41. DestroyList(plist);
  42. printf("鏈表已被銷燬\n");
  43. }


分享到:


相關文章: