• 单链表


    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 ");  
      10.     if(IsEmpty(list))  
      11.     printf("经检验list是个空链表 ");  
      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新节点 ",Retrieve(p));  
      19.     }  
      20.     p = FindNext(9,list);  
      21.     printf("数据项为9的节点后继的数据项值为%d ",Retrieve(p));  
      22.       
      23.     p = FindPrevious(9,list);  
      24.     printf("数据项为9的节点前驱的数据项值为%d ",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 ",Retrieve(p));  
      33.     }  
      34.       
      35.     DeleteList(list);  
      36.     printf("已删除链表list的所以数据节点 ");  
      37.     if(IsEmpty(list))  
      38.     printf("经检验list是个空链表 ");  
      39.   

  • 相关阅读:
    进制转换
    BZOJ 1232 安慰奶牛题解
    [BeiJing wc2012]冻结 题解
    the Captain题解;
    最佳贸易
    第二短路
    街道赛跑
    图论基础知识.
    Tkinter 之事件绑定
    Tkinter 之TopLevel顶级窗口
  • 原文地址:https://www.cnblogs.com/heyonggang/p/3272645.html
Copyright © 2020-2023  润新知