当前位置:   article > 正文

手撕数据结构---顺序表

手撕数据结构---顺序表

头文件:

  1. #ifndef _SEQLIST_H_
  2. #define _SEQLIST_H_
  3. #include<stdio.h>
  4. #include<malloc.h>
  5. #include<assert.h>
  6. #define SEQLIST_INIT_SIZE 8
  7. typedef int ElemType;
  8. typedef struct SeqList
  9. {
  10.     ElemType *base;          //开辟空间,数据表开辟的连续空间
  11.     int      capacity;       //容量,最大长度
  12.     int      size;           //表的长度,实际长度
  13. }SeqList;
  14. void InitSeqList(SeqList *list);
  15. void push_back(SeqList *list,ElemType x);
  16. void show_list(SeqList *list);
  17. void push_front(SeqList *list,ElemType x);
  18. void pop_back(SeqList *list);
  19. void pop_front(SeqList *list);
  20. void insert_pos(SeqList *list,ElemType x,int pos);
  21. int find(SeqList *list,ElemType key);
  22. int length(SeqList *list);
  23. void delete_pos(SeqList *list,int pos);
  24. void delete_val(SeqList *list,ElemType x);
  25. void sort(SeqList *list);
  26. void reserve(SeqList *list);
  27. void clear(SeqList *list);
  28. void destroy(SeqList *list);
  29. #endif //_SEQLIST_H_

具体方法实现(顺序表创建回收,增删改查等操作):

  1. #include"SeqList.h"
  2. #include <stdbool.h>
  3. /*
  4. *线性表初始化
  5. */
  6. void InitSeqList(SeqList *list)
  7. {
  8.     list->base = (ElemType *)malloc(sizeof(ElemType) * SEQLIST_INIT_SIZE);    //开辟连续空间
  9.     assert(list->base != NULL);
  10.     list->capacity = SEQLIST_INIT_SIZE;
  11.     list->size = 0;
  12. }
  13. /*
  14. *尾插法(插入数据必须要判断表是否为满)
  15. */
  16. void push_back(SeqList *list, ElemType x)
  17. {
  18.     if(list->base == NULL)
  19.     {
  20.         printf("list is not exist!\n");
  21.         return;
  22.     }
  23.     if (list->size >= list->capacity)
  24.     {
  25.         printf("list full!\n");
  26.         return;
  27.     }
  28.     list->base[list->size] = x;
  29.     list->size++;
  30. }
  31. void show_list(SeqList *list)
  32. {
  33.     int i = 0;
  34.     if(list->base == NULL)
  35.     {
  36.         printf("list is not exist!\n");
  37.         return;
  38.     }
  39.     if(list->size == 0||list->base == NULL)
  40.     {
  41.         printf("list empty!");
  42.         return;
  43.     }
  44.     for(i=0;i<list->size;i++)
  45.     {
  46.         printf("%d ",list->base[i]);
  47.     }
  48.     printf("\n");
  49. }
  50. /*
  51. *头插法(插入数据必须要判断表是否为满)
  52. */
  53. void push_front(SeqList *list,ElemType x)
  54. {
  55.     int i = 0;
  56.     if(list->base == NULL)
  57.     {
  58.         printf("list is not exist!\n");
  59.         return;
  60.     }
  61.     if(list->size >= list->capacity)
  62.     {
  63.         printf("list full!");
  64.         return;
  65.     }
  66.     for(i=list->size;i>0;i--)
  67.     {
  68.         list->base[i] = list->base[i-1];
  69.     }
  70.     list->base[0] = x;
  71.     list->size++;
  72. }
  73. /*
  74. *尾删法(删除数据必须要判断表是否为空)
  75. */
  76. void pop_back(SeqList *list)
  77. {
  78.     if(list->base == NULL)
  79.     {
  80.         printf("list is not exist!\n");
  81.         return;
  82.     }
  83.     if(list->size <= 0)
  84.     {
  85.         printf("list empty!");
  86.         return;
  87.     }
  88.     list->size--;
  89. }
  90. /*
  91. *头删法(删除数据必须要判断表是否为空)
  92. */
  93. void pop_front(SeqList *list)
  94. {
  95.     int i = 0;
  96.     if(list->base == NULL)
  97.     {
  98.         printf("list is not exist!\n");
  99.         return;
  100.     }
  101.     if(list->size <= 0)
  102.     {
  103.         printf("list empty!");
  104.         return;
  105.     }
  106.     printf("%d ",list[0]);
  107.     for(i=0;i<list->size-1;i++)
  108.     {
  109.         list->base[i]=list->base[i+1];
  110.     }
  111.     list->size--;
  112. }
  113. /*
  114. *在指定位置pos插入元素x
  115. */
  116. void insert_pos(SeqList *list,ElemType x ,int pos)
  117. {
  118.     int i = 0;
  119.     if(list->base == NULL)
  120.     {
  121.         printf("list is not exist!\n");
  122.         return;
  123.     }
  124.     if(list->size >= list->capacity)
  125.     {
  126.         printf("list full!");
  127.         return;
  128.     }
  129.     if(pos <= 0 || pos > list->capacity)
  130.     {
  131.         printf("pos is illegal!");
  132.         return;
  133.     }
  134.     if(pos == 1)
  135.     {
  136.         /*list->base[0] = x;
  137.         return;*/
  138.         push_front(list,x);    //当插入位置为第一位时,可直接用头插法插入数据
  139.     }
  140.     else if(pos == list->size+1)
  141.     {
  142.         /*list->base[pos-1] = x;
  143.         return;*/
  144.         push_back(list,x);   //当插入位置为最后一位时,可直接用尾插法插入数据
  145.     }
  146.     else{
  147.         for(i=list->size;i>=pos;i--)
  148.         {
  149.             list->base[i]=list->base[i-1];
  150.         }
  151.         list->base[pos-1]=x;
  152.         list->size++;
  153.     }
  154.    
  155. }
  156. /*查找给出元素的位置,每个元素只出现一次,若有多个相同元素考虑使用数组*/
  157. int find(SeqList *list, ElemType key)
  158. {
  159.     int i = 0;
  160.     if(list->base == NULL)
  161.     {
  162.         printf("list is not exist!\n");
  163.         return -1;
  164.     }
  165.     for(i=0;i<list->size;i++)
  166.     {
  167.         if(key == list->base[i])
  168.         {
  169.             return i+1;
  170.         }
  171.     }
  172.     return -1;
  173. }
  174. /*顺序表的长度*/
  175. int length(SeqList *list)
  176. {
  177.     if(list->base == NULL)
  178.     {
  179.         printf("list is not exist!\n");
  180.         return -1;
  181.     }
  182.     return list->size;
  183. }
  184. /*删除指定位置的元素*/
  185. void delete_pos(SeqList *list, int pos)
  186. {
  187.     if(list->base == NULL)
  188.     {
  189.         printf("list is not exist!\n");
  190.         return;
  191.     }
  192.     if(pos <= 0 || pos > list->size)
  193.     {
  194.         printf("pos is illegal!\n");
  195.         return;
  196.     }
  197.     if(pos == 1)
  198.     {
  199.         pop_front(list);
  200.     }
  201.     else if(pos == list->size)
  202.     {
  203.         pop_back(list);
  204.     }
  205.     else
  206.     {
  207.         for(int i = pos;i<list->size;i++)
  208.         {
  209.             list->base[i-1] = list->base[i];
  210.         }
  211.         list->size--;
  212.     }
  213. }
  214. void delete_val(SeqList *list, ElemType x)
  215. {
  216.     int pos;
  217.     if(list->base == NULL)
  218.     {
  219.         printf("list is not exist!\n");
  220.         return;
  221.     }
  222.     pos = find(list,x);
  223.     if(pos == -1)
  224.     {
  225.         printf("value is not exist!\n");
  226.         return;
  227.     }
  228.     delete_pos(list,pos);
  229. }
  230. void sort(SeqList *list)
  231. {  
  232.     //C99的C语言支持bool类型,而Visual Studio Code不支持(C++是支持的)。一些编译器认为使用该类型不够安全,加入#include<stdbool.h>
  233.     bool flag = false;  
  234.     ElemType a;
  235.     if(list->base == NULL)
  236.     {
  237.         printf("list is not exist!\n");
  238.         return;
  239.     }
  240.     for(int i = 0;i<list->size-1;i++)
  241.     {
  242.         flag = false;
  243.         for(int j = 0;j<list->size-1-i;j++)
  244.         {
  245.             if(list->base[j]>list->base[j+1])
  246.             {
  247.                 a = list->base[j];
  248.                 list->base[j] = list->base[j+1];
  249.                 list->base[j+1] = a;
  250.                 flag = true;
  251.             }
  252.         }
  253.         /*如果某一轮排序中无任何位置变化,则顺序表已经排好序,直接跳出循环*/
  254.         if(flag == false)
  255.         {
  256.             break;
  257.         }
  258.     }
  259. }
  260. void reserve(SeqList *list)
  261. {
  262.     ElemType temp;
  263.     if(list->base == NULL)
  264.     {
  265.         printf("list is not exist!\n");
  266.         return;
  267.     }
  268.     if(list->size == 0||list->size == 1)
  269.     {
  270.         return;
  271.     }
  272.     for(int i = 0;i < list->size/2;i++)
  273.     {
  274.         temp = list->base[i];
  275.         list->base[i] = list->base[list->size-i-1];
  276.         list->base[list->size-i-1] = temp;
  277.     }
  278. }
  279. /*清除数据,表仍存在*/
  280. void clear(SeqList *list)
  281. {
  282.     if(list->base == NULL)
  283.     {
  284.         printf("list is not exist!\n");
  285.         return;
  286.     }
  287.     list->size = 0;
  288.     return;
  289. }
  290. /*清除数据,释放表,删除base所指的顺序表空间*/
  291. void destroy(SeqList *list)
  292. {
  293.     free(list->base);
  294.     list->base = NULL;
  295.     list->capacity = 0;
  296.     list->size = 0;
  297.     return;
  298. }

主程序:

  1. #include"SeqList.h"
  2. #include<stdio.h>
  3. int main()
  4. {
  5.     SeqList myList;
  6.     InitSeqList(&myList);
  7.     ElemType Item;
  8.     int pos;
  9.     int len = 0;
  10.     int select = 1;
  11.     while(select)
  12.     {
  13.         printf("***********************************\n");
  14.         printf("* [1] push_back    [2] push_front *\n");
  15.         printf("* [3] show_list    [4] pop_back   *\n");
  16.         printf("* [5] pop_front    [6] insert_pos *\n");
  17.         printf("* [7] find         [8] length     *\n");
  18.         printf("* [9] delete_pos   [10] delete_val*\n");
  19.         printf("* [11] sort        [12] reserve   *\n");
  20.         printf("* [13] clear       [14*] destroy  *\n");
  21.         printf("* [0] quit_system                 *\n");
  22.         printf("***********************************\n");
  23.         printf("请选择:>");
  24.         scanf("%d",&select);
  25.         if(select == 0)
  26.             break;
  27.         switch(select)
  28.         {
  29.             case 1:
  30.                 printf("请输入要插入的数据(-1结束):>");
  31.                 while(scanf("%d",&Item),Item!=-1)
  32.                 {
  33.                     push_back(&myList,Item);
  34.                 }
  35.                 break;
  36.             case 2:
  37.                 printf("请输入要插入的数据(-1结束):>");
  38.                 while(scanf("%d",&Item),Item!=-1)
  39.                 {
  40.                     push_front(&myList,Item);
  41.                 }
  42.                 break;
  43.             case 3:
  44.                 show_list(&myList);
  45.                 break;
  46.             case 4:
  47.                 pop_back(&myList);
  48.                 break;
  49.             case 5:
  50.                 pop_front(&myList);
  51.                 break;
  52.             case 6:
  53.                 printf("请输入要插入的位置和数据(以输入数据为-1结束):>");
  54.                 while(scanf("%d %d",&pos,&Item))
  55.                 {
  56.                     if(Item == -1)
  57.                     {
  58.                         break;
  59.                     }
  60.                     insert_pos(&myList,Item,pos);
  61.                 }
  62.                 break;
  63.             case 7:
  64.                 printf("请输入要查找的数据:>");
  65.                 scanf("%d",&Item);
  66.                 pos = find(&myList,Item);
  67.                 if(pos == -1)
  68.                 {
  69.                     printf("查找数据不存在\n");
  70.                 }
  71.                 else
  72.                 {
  73.                     printf("查找元素在第 %d 位\n",pos);
  74.                 }
  75.                 break;
  76.             case 8:
  77.                 len = length(&myList);
  78.                 printf("顺序表中数据长度为 %d ",len);
  79.                 break;
  80.             case 9:
  81.                 printf("请输入要删除数据元素的位置:>");
  82.                 scanf("%d",&pos);
  83.                 delete_pos(&myList,pos);
  84.                 break;
  85.             case 10:
  86.                 printf("请输入要删除数据元素的值:>");
  87.                 scanf("%d",&Item);
  88.                 delete_val(&myList,Item);
  89.                 break;
  90.             case 11:
  91.                 sort(&myList);
  92.                 break;
  93.             case 12:
  94.                 reserve(&myList);
  95.                 break;
  96.             case 13:
  97.                 clear(&myList);
  98.                 break;
  99.             /*case 14:
  100.                 destroy(&myList);
  101.                 break;*/
  102.             default:
  103.                 printf("输入的选择错误,请重新输入.\n");
  104.                 break;
  105.         }
  106.     }
  107.     destroy(&myList);
  108.     return 0;
  109. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/876694
推荐阅读
相关标签
  

闽ICP备14008679号