且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

单链表

更新时间:2022-08-12 23:23:02

  1. #ifndef List_H  
  2. #define List_H  
  3. typedef int Item;/*定义数据项类型*/  
  4. typedef struct node * PNode;/*定义节点指针*/  
  5.   
  6. typedef struct node/*节点的定义*/  
  7. {  
  8.     Item item;  /*数据域*/  
  9.     PNode next; /*链域*/  
  10.       
  11. }Node;  
  12.   
  13. typedef  PNode Position;  
  14. typedef  PNode List;  
  15.   
  16. List MakeEmpty(List L);  
  17. /* 
  18. 功能 
  19. 生成空链表L 
  20. */  
  21. int IsEmpty(List L);  
  22. /* 
  23. 功能 
  24. 判定链表是否为空 
  25. */  
  26. int IsLast(Position P);  
  27. /* 
  28. 功能 
  29. 判定位置P的节点是否为尾节点 
  30. */  
  31. Position Find(Item X,List L);  
  32. /* 
  33. 功能 
  34. 在链表L中查找数据项为X的第一个节点 
  35. */  
  36. void Delete(Item X,List L);  
  37. /* 
  38. 功能 
  39. 在链表L中删除数据项为X的第一个节点 
  40. */  
  41. Position FindPrevious(Item X,List L);  
  42. /* 
  43. 功能 
  44. 在链表L中查找数据项为X的第一个节点的前驱位置 
  45. */  
  46. Position FindNext(Item X,List L);  
  47. /* 
  48. 功能 
  49. 在链表L中查找数据项为X的第一个节点的后继位置 
  50. */  
  51. void Insert(Item X,List L,Position P);  
  52. /* 
  53. 功能 
  54. 在链表L中P位置插入数据项为X的节点 
  55. */  
  56. void DeleteList(List L);  
  57. /* 
  58. 功能 
  59. 删除链表L初头节点外的所有节点 
  60. */  
  61. Position Header(List L);  
  62. /* 
  63. 功能 
  64. 获得链表L中头节点位置 
  65. */  
  66. Position First(List L);  
  67. /* 
  68. 功能 
  69. 获得链表L中第一个数据节点的位置 
  70. */  
  71. Position Advance(Position P);  
  72. /* 
  73. 功能 
  74. 获得P位置的后继节点位置 
  75. */  
  76. Item Retrieve(Position P);  
  77. /* 
  78. 功能 
  79. 获得P位置节点的数据项 
  80. */  
  81. #endif  

实现如下

  1. #include"List.h"  
  2. #include<malloc.h>  
  3. #include<stdlib.h>  
  4. /* 
  5. List MakeEmpty(List L) 
  6. 参数 
  7. L 要生成的空链表名 
  8. 返回值 
  9. 返回生成的空链表名 
  10. 功能 
  11. 生成空链表 
  12. */  
  13. List MakeEmpty(List L)  
  14. {  
  15.     L = (PNode)malloc(sizeof(Node));  
  16.     L->item = 0;  
  17.     L->next = NULL;  
  18.     return L;  
  19. }  
  20.   
  21. /* 
  22. int IsEmpty(List L) 
  23. 参数 
  24. L 要判定的链表名 
  25. 返回值 
  26. 若L为空返回1,否则返回0 
  27. 功能 
  28. 判断链表L是否为空 
  29. */  
  30. int IsEmpty(List L)  
  31. {  
  32.     return L->next == NULL;  
  33. }  
  34. /* 
  35. int IsLast(Position P) 
  36. 参数 
  37. P 要判定的位置 
  38. 返回值 
  39. 若P为为最后一个节点则返回1,否则返回0 
  40. 功能 
  41. 判断位置P的节点是否是链表最后一个节点 
  42. */  
  43. int IsLast(Position P)  
  44. {  
  45.     return P->next == NULL;  
  46. }  
  47.   
  48. /* 
  49. Position Find(Item X,List L) 
  50. 参数 
  51. X 要查找的数据项 
  52. L 要查找的链表 
  53. 返回值 
  54. 若X在L中存在则返回第一个匹配节点的位置,否则返回NULL 
  55. 功能 
  56. 判断位置P的节点是否是链表最后一个节点 
  57. */  
  58. Position Find(Item X,List L)  
  59. {  
  60.     Position P;  
  61.     P = L->next;  
  62.     while( P!=NULL && P->item != X )  
  63.     {  
  64.         P = P->next;  
  65.     }  
  66.     return P;  
  67. }  
  68. /* 
  69. void Delete(Item X,List L) 
  70. 参数 
  71. X 要删除的数据项 
  72. L 要删除节点所在的链表 
  73. 返回值 
  74.  
  75. 功能 
  76. 在链表L中删除查找到的第一个数据项为X的节点 
  77. */  
  78. void Delete(Item X,List L)  
  79. {  
  80.     Position P,temp;    /*读者请思考,temp为什么是必要的?*/  
  81.     P = FindPrevious(X,L);  
  82.     if(!IsLast(P))  
  83.     {  
  84.         temp = P->next;  
  85.         P->next = temp->next;  
  86.         free(temp);  
  87.     }  
  88. }  
  89. /* 
  90. Position FindPrevious(Item X,List L) 
  91. 参数 
  92. X 要查找的数据项 
  93. L 要查找的链表 
  94. 返回值 
  95. 若X在L中存在则返回第一个匹配节点的前驱位置,否则返回NULL 
  96. 功能 
  97. 返回链表L中数据项为X的节点的前驱节点位置 
  98. */  
  99. Position FindPrevious(Item X,List L)  
  100. {  
  101.     Position P;  
  102.     P = L;  
  103.     while(P->next!=NULL && P->next->item != X)  
  104.         P = P->next;  
  105.     return P;  
  106. }  
  107. /* 
  108. Position FindNext(Item X,List L) 
  109. 参数 
  110. X 要查找的数据项 
  111. L 要查找的链表 
  112. 返回值 
  113. 若X在L中存在则返回第一个匹配节点的后继位置,否则返回NULL 
  114. 功能 
  115. 返回链表L中数据项为X的节点的后继节点位置 
  116. */  
  117. Position FindNext(Item X,List L)  
  118. {  
  119.     Position P;  
  120.     P = L;  
  121.     while(P!=NULL && P->item != X)  
  122.         P = P->next;  
  123.     return P;  
  124. }  
  125. /* 
  126. void Insert(Item X,List L,Position P) 
  127. 参数 
  128. X 要插入的数据项 
  129. L 要插入的链表 
  130. 返回值 
  131.  
  132. 功能 
  133. 在链表L中P位置之后插入数据项为X的新节点 
  134. */  
  135. void Insert(Item X,List L,Position P)  
  136. {  
  137.     Position temp;  
  138.     temp = malloc(sizeof(Node));  
  139.     if(temp==NULL)  
  140.         exit(0);  
  141.     temp->item = X;  
  142.     temp->next = P->next;  
  143.     P->next = temp;  
  144. }  
  145. /* 
  146. void DeleteList(List L) 
  147. 参数 
  148. L 要删除节点的链表 
  149. 返回值 
  150.  
  151. 功能 
  152. 删除链表L中除了头节点之外的所有节点 
  153. */  
  154. void DeleteList(List L)  
  155. {  
  156.     Position P,temp;  
  157.     P = L->next;  
  158.     L->next = NULL;  
  159.     while( P!=NULL)  
  160.     {  
  161.         temp = P->next;  
  162.         free(P);  
  163.          P = temp;  
  164.     }  
  165. }  
  166. /* 
  167. Position Header(List L) 
  168. 参数 
  169. L 要查找的链表 
  170. 返回值 
  171. 返回链表L的头节点位置 
  172. 功能 
  173. 返回头节点 
  174. */  
  175. Position Header(List L)  
  176. {  
  177.     return L;  
  178. }  
  179. /* 
  180. Position First(List L) 
  181. 参数 
  182. L 要查找的链表 
  183. 返回值 
  184. 若链表非空则返回第一个数据节点,否则返回NULL 
  185. 功能 
  186. 返回第一个数据节点位置 
  187. */  
  188. Position First(List L)  
  189. {  
  190.     if(L->next!=NULL)  
  191.     return L->next;  
  192. }  
  193. /* 
  194. Position Advance(Position P) 
  195. 参数 
  196. P 当前节点位置 
  197. 返回值 
  198. 若P位置后继节点存在则返回其位置,否则返回NULL 
  199. 功能 
  200. 获得位置P后继节点位置 
  201. */  
  202. Position Advance(Position P)  
  203. {  
  204.     if(P!=NULL)  
  205.     return P->next;  
  206. }  
  207. /* 
  208. Item Retrieve(Position P) 
  209. 参数 
  210. P 当前节点位置 
  211. 返回值 
  212. 若P非空则返回其数据项的值 
  213. 功能 
  214. 返回P位置的数据项 
  215. */  
  216. Item Retrieve(Position P)  
  217. {  
  218.     if(P!=NULL)  
  219.     return P->item;  
  220. }  


测试如下

    1. #include"List.h"  
    2. #include<stdlib.h>  
    3. int main()  
    4. {  
    5.     List list=NULL;  
    6.     Position p;   
    7.     int i;  
    8.     list = MakeEmpty(list);  
    9.     printf("已生成空链表list\n");  
    10.     if(IsEmpty(list))  
    11.     printf("经检验list是个空链表\n");  
    12.   
    13.     p = list;  
    14.     for(i=0;i<5;i++)  
    15.     {  
    16.         Insert(i*i,list,p);       
    17.         p = Advance(p);  
    18.         printf("已插入的值为%d新节点\n",Retrieve(p));  
    19.     }  
    20.     p = FindNext(9,list);  
    21.     printf("数据项为9的节点后继的数据项值为%d\n",Retrieve(p));  
    22.       
    23.     p = FindPrevious(9,list);  
    24.     printf("数据项为9的节点前驱的数据项值为%d\n",Retrieve(p));  
    25.   
    26.     Delete(9,list);  
    27.       
    28.     p = list;  
    29.     for(i=0;i<4;i++)  
    30.     {     
    31.         p = Advance(p);  
    32.         printf("删除数据项为9的节点剩下的节点值为%d\n",Retrieve(p));  
    33.     }  
    34.       
    35.     DeleteList(list);  
    36.     printf("已删除链表list的所以数据节点\n");  
    37.     if(IsEmpty(list))  
    38.     printf("经检验list是个空链表\n");  
    39.   
    40. }  




本文转自夏雪冬日博客园博客,原文链接:http://www.cnblogs.com/heyonggang/p/3272645.html,如需转载请自行联系原作者