• 线性表之顺序表


    线性表之顺序表(C++版)http://t.csdn.cn/pEmnl

    seqlist.h文件包含结构体的定义,函数的声明

    1. #pragma once
    2. #include
    3. #include
    4. #include
    5. #define Initsel 8
    6. #define INC_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 val);//尾插
    16. void Show(SeqList* list);//显示
    17. void push_front(SeqList* list, ElemType val);//头插
    18. void pop_back(SeqList *list);//尾删
    19. void pop_front(SeqList* list);//头删
    20. void inser_pos(SeqList* list, int val,int pos);//按位置插入
    21. int find(SeqList* list, int val);//按值查找
    22. int length(SeqList* list);//长度
    23. void delete_pos(SeqList* list, int pos);//按位置删除
    24. int delete_val(SeqList* list, int val);//按值删除
    25. void sort(SeqList* list);//排序
    26. void reverse(SeqList* list);//逆序
    27. void swap(int& a, int& b);//交换函数
    28. void clear(SeqList* list);//清空
    29. void destroy(SeqList* list);//销毁
    30. bool Inc(SeqList* list);//增加空间

    list.cpp文件,顺序表的初始化以及函数实现

    1. #include"seqlist.h"
    2. //初始化
    3. void InitSeqList(SeqList* list)
    4. {
    5. list->base = (ElemType*)malloc(sizeof(ElemType) * Initsel);
    6. assert(list->base != NULL);
    7. list->capacity = Initsel;
    8. list->size = 0;
    9. }
    10. //增加空间
    11. bool Inc(SeqList* list)
    12. {
    13. ElemType *newbase = (ElemType*)realloc(list->base, sizeof(ElemType) * list->capacity+INC_SIZE);
    14. if (newbase == NULL)
    15. {
    16. printf("增容失败\n");
    17. return false;
    18. }
    19. list->base = newbase;
    20. list->capacity += INC_SIZE;
    21. return true;
    22. }
    23. //尾插
    24. void push_back(SeqList* list, ElemType val)
    25. {
    26. if (list->size >= list->capacity&& !Inc(list))
    27. {
    28. printf("顺序表满了,不能尾插\n");
    29. return;
    30. }
    31. list->base[list->size] = val;
    32. list->size++;
    33. }
    34. //头插
    35. void push_front(SeqList* list, ElemType val)
    36. {
    37. if (list->size >= list->capacity && !Inc(list))
    38. {
    39. printf("顺序表满了,不能头插\n");
    40. return;
    41. }
    42. for (int i = list->size; i > 0; --i)
    43. {
    44. list->base[i] = list->base[i - 1];
    45. }
    46. list->base[0] = val;
    47. list->size++;
    48. }
    49. //显示
    50. void Show(SeqList* list)
    51. {
    52. assert(list != NULL);
    53. for (int i = 0; i < list->size; i++)
    54. {
    55. printf("%d ", list->base[i]);
    56. }
    57. printf("\n");
    58. }
    59. //尾删
    60. void pop_back(SeqList* list)
    61. {
    62. assert(list != NULL);
    63. list->size--;
    64. }
    65. //头删
    66. void pop_front(SeqList* list)
    67. {
    68. //把后面的数据移到前面
    69. for (int i = 1; i < list->size; ++i)
    70. {
    71. list->base[i - 1] = list->base[i];
    72. }
    73. list->size--;
    74. }
    75. //随机插入一个数
    76. void inser_pos(SeqList* list, int val, int pos)
    77. {
    78. //判断位置是否合法
    79. if (pos<0 || pos>list->size)return;
    80. if (list->size == list->capacity && !Inc(list))
    81. {
    82. return;
    83. }
    84. for (int i = list->size; i > pos; --i)
    85. {
    86. list->base[i] = list->base[i - 1];
    87. }
    88. list->base[pos] = val;
    89. list->size++;
    90. }
    91. //按值查找
    92. int find(SeqList* list, int val)
    93. {
    94. if (list->size == 0)return -1;
    95. for (int i = 0; i < list->size; ++i)
    96. {
    97. if (list->base[i] == val) return i;
    98. }
    99. return -1;
    100. }
    101. //长度
    102. int length(SeqList* list)
    103. {
    104. return list->size;
    105. }
    106. //按位置删除
    107. void delete_pos(SeqList* list, int pos)
    108. {
    109. if (pos<0||pos >= list->size)return ;
    110. for (int i = pos; i < list->size-1; i++)
    111. {
    112. list->base[i] = list->base[i + 1];
    113. }
    114. list->size--;
    115. }
    116. //按值删除
    117. int delete_val(SeqList* list, int val)
    118. {
    119. int pos = find(list, val);
    120. if (pos == -1)
    121. return -1;
    122. delete_pos(list, pos);
    123. }
    124. //排序
    125. void sort(SeqList* list)//从小到大
    126. {
    127. for (int i =0; i size-1; ++i)
    128. {
    129. for (int j = 0; j < list->size-i-1; j++)
    130. {
    131. if (list->base[j] > list->base[j + 1])
    132. {
    133. swap(list->base[j], list->base[j + 1]);
    134. }
    135. }
    136. }
    137. }
    138. //逆序
    139. void reverse(SeqList* list)
    140. {
    141. int tmp = 0;
    142. int left = 0; int right = list->size - 1;
    143. while (left < right)
    144. {
    145. swap(list->base[left], list->base[right]);
    146. left++;
    147. right--;
    148. }
    149. }
    150. //交换函数
    151. void swap(int &a, int &b)
    152. {
    153. int tmp = 0;
    154. tmp = a;
    155. a = b;
    156. b = tmp;
    157. }
    158. //清空
    159. void clear(SeqList* list)
    160. {
    161. list->size = 0;
    162. }
    163. //销毁(与清空区别在于销毁要释放空间
    164. void destroy(SeqList* list)
    165. {
    166. free(list->base);
    167. list->base = NULL;
    168. list->capacity = 0;
    169. list->size = 0;
    170. }

    test.cpp测试代码

    1. #include"seqlist.h"
    2. int main()
    3. {
    4. SeqList list;
    5. int select = 1;
    6. InitSeqList(&list);
    7. while (1)
    8. {
    9. printf("**********************************\n");
    10. printf("*[1] init [2]push_back *\n");
    11. printf("*[3] show [4]push_front *\n");
    12. printf("*[5] pop_back [6]inser_pos *\n");
    13. printf("*[7] find [8]length *\n");
    14. printf("*[9] delete_pos [10]delete_val *\n");
    15. printf("*[11] sort [12]reverse *\n");
    16. printf("*[13]pop_front [14]clear *\n");
    17. printf("*[0] quit_system [15]destroy *\n");
    18. printf("**********************************\n");
    19. printf("请输入选项:");
    20. scanf_s("%d",&select);
    21. int val = 0;//值
    22. int pos = 0;//位置
    23. if (select == 0)
    24. break;
    25. switch (select)
    26. {
    27. case 1:
    28. InitSeqList(&list);
    29. break;
    30. case 2:
    31. printf("请输入要插入的数,以-1结束:\n");
    32. while (scanf_s("%d", &val),val != -1)
    33. {
    34. push_back(&list, val);//尾插
    35. }
    36. break;
    37. case 3:
    38. Show(&list);
    39. break;
    40. case 4:
    41. printf("请输入要插入的数,以-1结束:\n");
    42. while (scanf_s("%d", &val), val != -1)
    43. {
    44. push_front(&list, val);//头插
    45. }
    46. break;
    47. case 5:
    48. pop_back(&list);//尾删
    49. break;
    50. case 6:
    51. printf("请输入插入的数据及位置:");
    52. scanf_s("%d %d", &val, &pos);
    53. inser_pos(&list,val,pos);
    54. break;
    55. case 7:
    56. printf("请输入查找的数据:");
    57. scanf_s("%d", &val);
    58. pos = find(&list, val);
    59. if (pos== -1)//按值查找
    60. {
    61. printf("%d没有找到\n",val);
    62. }
    63. else
    64. {
    65. printf("%d找到了,下标为%d\n",val,pos);
    66. }
    67. break;
    68. case 8:
    69. pos= length(&list);//长度
    70. printf("顺序表的长度为%d\n", list.size);
    71. break;
    72. case 9:
    73. printf("请输入删除的位置:");
    74. scanf_s("%d", &pos);
    75. delete_pos(&list,pos);//按位置删除
    76. break;
    77. case 10:
    78. printf("请输入要删的值:");
    79. scanf_s("%d", &val);
    80. delete_val(&list,val);//按值删除
    81. break;
    82. case 11:
    83. sort(&list);//排序
    84. break;
    85. case 12:
    86. reverse(&list);//逆序
    87. break;
    88. case 13:
    89. pop_front(&list);//头删
    90. break;
    91. case 14:
    92. clear(&list);//清空
    93. break;
    94. case 15:
    95. destroy(&list);//销毁
    96. break;
    97. default:
    98. printf("输入错误,请重新输入:\n");
    99. break;
    100. }
    101. }
    102. destroy(&list);//销毁
    103. return 0;
    104. }

  • 相关阅读:
    网络安全系列-三十六:使用Suricata IDS分析pcap文件
    Vue研习录(03)——条件渲染讲解及示例分析
    为什么要使用MVP架构
    Layui 2.8.0 正式发布,官网全新文档站朴实归来
    Transformers北大源
    软考 系统架构设计师系列知识点之软件质量属性(4)
    人工智能技术在开源情报周期中的应用
    什么是高阶成分(HOC)?解释 React 中 render() 的目的?
    点大商城V2_2.5.0 全开源独立版 商家自营+多商户入驻 百度+支付宝+QQ+头条+小程序端+unipp开源前端
    分享金媒v10.3开源系统中CRM线下客户管理系统使用指南和小程序上架细分流程
  • 原文地址:https://blog.csdn.net/swint_er/article/details/127852328