找回密码
 立即注册
首页 业界区 科技 顺序表的初始化、插入、删除、遍历

顺序表的初始化、插入、删除、遍历

国瑾瑶 2025-6-26 20:30:28
  1. /*******************************************************************
  2. *
  3. *        file name:        seqlist.c
  4. *        author         :  MINDSETT@163.com
  5. *        date         :  2025/6/19
  6. *        function :  该程序通过堆内存实现顺序表元素的增删改查,目的是提高设计程序的逻辑思维,另外为了提高可移植性,所以
  7. *               顺序表中元素的数据类型为DataType_t,用户可以根据实际情况修改顺序表中元素的类型
  8. *         note         :  None
  9. *
  10. *        CopyRight (c)  2025   MINDSETT@163.com   All Right Reserved
  11. *
  12. * *****************************************************************/
  13. #include <stdbool.h>
  14. #include <stdlib.h>
  15. #include <stdio.h>
  16. //指定顺序表中的元素的数据类型,用户可根据需要进行修改
  17. typedef int DataType_t;
  18. //构造一个实现顺序表的各项参数(顺序表的首地址+顺序表的容量+顺序表最后有效元素的下标)的结构体
  19. typedef struct Sequence_list
  20. {
  21.     DataType_t *  addr;    //顺序表的首地址
  22.     unsigned int  size;    //顺序表的容量
  23.     int           last;    //顺序表最后有效元素的下标
  24. }SeqList_t;
  25. /********************************************************************
  26. *   name     :  Seqlist_Creat
  27. *   function :  创建一个顺序表并进行初始化
  28. *   argument :
  29. *               @size:创建的顺序表的大小
  30. *   retval   :  返回顺序表管理结构体的首地址
  31. *   author   :  MINDSETT@163.com
  32. *   date     :  2025/6/19
  33. *   note     :  None
  34. *
  35. * ******************************************************************/
  36. SeqList_t *Seqlist_Creat(unsigned int size)
  37. {
  38.     //1.利用calloc对顺序表的管理结构体申请一个内存
  39.     SeqList_t *manager=(SeqList_t *)calloc(1,sizeof(SeqList_t));
  40.     if (NULL == manager){
  41.         perror("calloc memory for manager is failed\n");
  42.         exit(-1);
  43.     }
  44.     //2.对顺序表管理结构体的所有元素进行初始化
  45.     manager->addr=(DataType_t *)calloc(size,sizeof(DataType_t));
  46.     if (NULL == manager->addr){
  47.         perror("calloc memory for element is failed\n");
  48.         exit(-1);
  49.     }
  50.     manager->size=size;
  51.     manager->last=-1;
  52.     return manager;
  53. }
  54. /********************************************************************
  55. *   name     :  Seqlist_IsFull
  56. *   function :  判断顺序表是否已满
  57. *   argument :
  58. *               @manager:需要判断的顺序表
  59. *   retval   :  已满返回true,未满返回false
  60. *   author   :  MINDSETT@163.com
  61. *   date     :  2025/6/19
  62. *   note     :  None
  63. *
  64. * ******************************************************************/
  65. bool Seqlist_IsFull(SeqList_t *manager)
  66. {
  67.     return (manager->last+1==manager->size)? true : false;
  68. }
  69. /********************************************************************
  70. *   name     :  Seqlist_IsEmpty
  71. *   function :  判断顺序表是否为空
  72. *   argument :
  73. *               @manager:需要判断的顺序表
  74. *   retval   :  未满返回true,已满返回false
  75. *   author   :  MINDSETT@163.com
  76. *   date     :  2025/6/19
  77. *   note     :  None
  78. *
  79. * ******************************************************************/
  80. bool Seqlist_IsEmpty(SeqList_t *manager)
  81. {
  82.     return (-1==manager->last)? true : false;
  83. }
  84. /********************************************************************
  85. *   name     :  Seqlist_TailAdd
  86. *   function :  从顺序表的尾部插入一个元素
  87. *   argument :
  88. *               @manager:需要操作的顺序表
  89. *               @Data:需要插入的元素
  90. *   retval   :  成功返回true,失败返回false
  91. *   author   :  MINDSETT@163.com
  92. *   date     :  2025/6/19
  93. *   note     :  None
  94. *
  95. * ******************************************************************/
  96. bool Seqlist_TailAdd(SeqList_t *manager,DataType_t Data)
  97. {
  98.     //判断顺序表是否已满
  99.     if ( Seqlist_IsFull(manager) ){
  100.         printf("sequence list is Full\n");
  101.         return false;
  102.     }
  103.     //如果顺序表有剩余空间,则把新元素插入顺序表的尾部,并更新管理结构体中最后有效元素的下标
  104.     manager->addr[++manager->last]=Data;
  105.     return true;
  106. }
  107. /********************************************************************
  108. *   name     :  Seqlist_HeadAdd
  109. *   function :  从顺序表的首部插入一个元素
  110. *   argument :
  111. *               @manager:需要操作的顺序表
  112. *               @Data:需要插入的元素
  113. *   retval   :  成功返回true,失败返回false
  114. *   author   :  MINDSETT@163.com
  115. *   date     :  2025/6/19
  116. *   note     :  None
  117. *
  118. * ******************************************************************/
  119. bool Seqlist_HeadAdd(SeqList_t *manager,DataType_t Data)
  120. {
  121.     //判断顺序表是否已满
  122.     if ( Seqlist_IsFull(manager) ){
  123.         printf("sequence list is Full\n");
  124.         return false;
  125.     }
  126.     //如果顺序表有空闲空间,将顺序表中的元素依次向后移1个单位
  127.     for (int i=manager->last;i>=0;i--){
  128.         manager->addr[i+1]=manager->addr[i];
  129.     }
  130.     //将新元素插入顺序表的尾部,并更新管理结构体中最后有效元素的下标
  131.     manager->addr[0]=Data;
  132.     manager->last++;
  133.     return true;
  134. }
  135. /********************************************************************
  136. *   name     :  Seqlist_Delete
  137. *   function :  删除数据表的一个元素
  138. *   argument :
  139. *               @manager:需要操作的顺序表
  140. *               @Data:需要删除的元素
  141. *   retval   :  成功返回true,失败返回false
  142. *   author   :  MINDSETT@163.com
  143. *   date     :  2025/6/19
  144. *   note     :  None
  145. *
  146. * ******************************************************************/
  147. bool Seqlist_Delete(SeqList_t *manager,DataType_t Data)
  148. {   
  149.     //判断顺序表是否为空
  150.     if ( Seqlist_IsEmpty(manager) ){
  151.         printf("sequence list is empty\n");
  152.         return false;
  153.     }
  154.     //如果顺序表不为空,则判断该元素在顺序表中是否存在,如果存在,则判断数据在顺序表的尾部 OR 头部 OR 中间(*存在几个*)
  155.     int temp=-1;
  156.     for (int i=0;i<=manager->last;i++){
  157.         if(Data==manager->addr[i]){
  158.         temp=i;
  159.         break;
  160.         }
  161.     }
  162.     if (-1==temp){
  163.         printf("Data[%d] is not found\n",Data);
  164.         return false;
  165.     }
  166.     if (temp==manager->last){
  167.         manager->addr[manager->last]='\0';
  168.     }else if(temp==0){
  169.             for(int i=0;i<manager->last;i++)
  170.                 manager->addr[i]=manager->addr[i+1];
  171.             manager->addr[manager->last]='\0';
  172.     }else{
  173.         for(int i=temp;i<manager->last;i++)
  174.             manager->addr[i]=manager->addr[i+1];
  175.         manager->addr[manager->last]='\0';
  176.     }
  177.     manager->last--;
  178.     return true;
  179. }
  180. /********************************************************************
  181. *   name     :  Seqlist_print
  182. *   function :  遍历顺序表
  183. *   argument :
  184. *               @manager:需要遍历的顺序表
  185. *   retval   :  None
  186. *   author   :  MINDSETT@163.com
  187. *   date     :  2025/6/19
  188. *   note     :  None
  189. *
  190. * ******************************************************************/
  191. void Seqlist_Print(SeqList_t *manager)
  192. {  
  193.      //判断顺序表是否为空
  194.     if ( Seqlist_IsEmpty(manager) ){
  195.         printf("sequence list is empty\n");
  196.         return;
  197.     }
  198.     //如果顺序表不为空,则打印顺序表的元素
  199.     for (int i=0;i<manager->last+1;i++){
  200.         printf("Element[%d]=%d\n",i,manager->addr[i]);
  201.     }
  202.     printf("\n");
  203. }
复制代码
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册