• 用连续内存空间实现线性表


    用结构体,实现了线性表初始化,删除索引的元素,查找元素,销毁线性表空间。

    1. #include
    2. #include
    3. #define error -1
    4. #define ok 1
    5. typedef unsigned unit;
    6. typedef int eleType;
    7. //定义一个结构体,用来存线性表的属性
    8. typedef struct {
    9. eleType * element;//定义一个元素类型指针
    10. unit length;
    11. unit listsize;
    12. }arrayList;
    13. //初始化一个线性表,给定线性表的可容纳元素的总个数
    14. arrayList array_init(unit len){
    15. arrayList t; // 构造一个结构体,类型是arrayList
    16. //分配一块堆内存空间,用来存储线性表
    17. t.element=(eleType *)malloc(len* sizeof(eleType)); //element是线性表元素所在内存的指针
    18. t.length = 0; //初始元素个数为0
    19. t.listsize = len;
    20. return t;
    21. };
    22. //顺序表的输出,按顺序遍历线性表,打印出来其中的每一个元素
    23. void print_array(arrayList t){
    24. printf("the array elements are:\n");
    25. int i;
    26. for (i=0;i
    27. printf("%d\n",t.element[i]);
    28. };
    29. };
    30. //顺序表的取值,根据下标取值,如果下标不合法,返回一个错误值。如果下标合法,返回下标对应的值
    31. eleType get_element(arrayList t,unit index){
    32. if (index
    33. printf("the index is out range");
    34. return -1;
    35. }
    36. return t.element[index];
    37. }
    38. // 顺序表的查找,从左到右,遍历顺序表,比较元素与所给元素是否相等,如果相等就返回该索引
    39. int find_element(arrayList t,eleType elem){
    40. int index;
    41. for (index=0;index
    42. if (elem==t.element[index]){
    43. return index;
    44. }
    45. }
    46. return -1;
    47. }
    48. //顺序表的销毁
    49. int arrayList_destroy(arrayList *t){
    50. if (NULL == t){
    51. return error;
    52. }
    53. if (t->element != NULL){
    54. free(t->element);
    55. t->length=0;
    56. t->listsize=0;
    57. }
    58. return ok;
    59. }
    60. //删除指定位置的元素,先判定索引是否合法,如果不合法,返回错误。
    61. // 如果合法,把指定元素删除后,i+1到length-1的索引元素往前移动一位。线性表长度-1
    62. int locate_element_delete(arrayList *t,unit index){
    63. if (NULL == t)
    64. return error;
    65. if (index > t->length-1){
    66. printf("index out range");
    67. return error;
    68. }
    69. int i;
    70. for (i=index;ilength-1;i++){
    71. t->element[i]=t->element[i+1];
    72. }
    73. t->length = t->length -1;
    74. return ok;
    75. }
    76. int main()
    77. { arrayList t;//构造一个结构体
    78. t = array_init(20);//初始化结构体
    79. int i=0; //往线性表里赋值
    80. for (i;i<10;i++){
    81. t.element[i]=100+i;
    82. t.length++;
    83. }
    84. //打印出线性表中的元素
    85. locate_element_delete(&t,3);
    86. /* int j=0;
    87. for (j;j
    88. printf("%d ",t.element[j]);
    89. }
    90. printf("%d",t.length);
    91. */
    92. return 0;
    93. }
    • 删除指定元素
    • 线性表扩容
    • 在指定索引出插入元素
    1. #define error -1
    2. #define ok 1
    3. //删除指定的元素值,指定的元素值可能有多个重复的元素,要遍历整个列表长度
    4. int delete_designated_element(arrayList *t,unit elem){
    5. if (NULL == t){
    6. return error;
    7. }
    8. int index=0;
    9. while (index !=t->length-1){
    10. if (t->element[index] != elem){
    11. index++;
    12. continue;
    13. }
    14. //查找到相同的元素,从这个元素之后的所有元素往前移动一位
    15. //指针index不要+1,后边移位来的元素可能还是要删除的元素,但是列表的长度要-1
    16. int i=index;
    17. for (i;ilength-1;i++){
    18. t->element[i]=t->element[i+1];
    19. }
    20. t->length--;
    21. }
    22. return ok;
    23. }
    24. //线性表扩容成原来2倍
    25. int expand(arrayList *t){
    26. if (NULL == t){
    27. return error;
    28. }
    29. t->listsize *=2;//为顺序表分配新的空间
    30. t->element = (eleType *)realloc(t->element,t->listsize* sizeof(eleType));
    31. return ok;
    32. }
    33. //在指定索引处插入一个元素
    34. int element_insert(arrayList *t, int index,int elem){
    35. if (NULL == t)
    36. {
    37. printf("[%s %d] SqList is NULL\n", __FUNCTION__ , __LINE__);
    38. return error;
    39. }
    40. //判断插入的位置是否合法
    41. if (index > t->length)
    42. return error;
    43. //判断顺序表是否满了,如果满了则扩容
    44. if (t->length == t->listsize)
    45. {
    46. expand(&t);
    47. }
    48. int i=0;
    49. for (i;ilength-index;i++){
    50. //从最后一个元素开始,往后移动一位
    51. t->element[t->length-i]=t->element[t->length-i-1];
    52. }
    53. t->element[index] = elem;
    54. t->length++;
    55. return ok;
    56. }

  • 相关阅读:
    四旋翼无人机学习第8节--OpenMV电路分析
    在HBuilder X中ElementUI框架的搭建
    vue3-vant4-vite-pinia-axios-less学习日记
    Java-校验规则Integer使用 @NotEmpty注解报错
    jdk中bin目录详解
    python3:print()打印. 2023-11-18
    idea常用快捷键持续更新
    面试算法37:小行星碰撞
    想转行做IC,却找不到适合自己的岗位?
    Vue项目的详细目录结构解析
  • 原文地址:https://blog.csdn.net/m0_64407685/article/details/128040821