当前位置:   article > 正文

C语言---11顺序表

C语言---11顺序表

目录

一、基本概念

二、头文件

(一)防止头文件重复包含

(二)顺序表数据结构的定义

(三)顺序表结构体类型

(四)报错功能

(五)功能函数的声明

三、函数功能实现

(一)声明头文件

(二)顺序表的创建

(三)顺序表数据元素的插入

(四)数据元素的删除

(五)顺序表的输出

(六)顺序表的销毁

(七)顺序表的重置(重置为空表)

(八)顺序表判空(判断顺序表释放为空)

四、主函数


一、基本概念

  • 顺序表是可以动态改变大小的数组

  • 顺序表的特点是确定起始位置,数据可以通过指定位置得到:首地址+(位置*偏移的大小)

  • 顺序表的功能:增、删、改、查

  • 顺序表存储空间的大小 = 表长*sizeof(元素类型)

二、头文件

(一)防止头文件重复包含

  1.  #pragma once // 防止头文件重复包含(VS独有)
  2.  #ifndef ARRAY // 防止头文件重复包含
  3.  #define ARRAY
  4.  #endif // 放在最后

(二)顺序表数据结构的定义

  1.  typedef int Type; // 给数据类型取别名,便于使用,能够做到一改全改  
  2.  #define TYPE_P "%d\t" //"%c\t" 用TYPE_P代表“%d\t” 输出
  3.  #define TYPE_S "%d"   //"%c"   输入

(三)顺序表结构体类型

  1.  typedef struct Array{
  2.   Type *data; // 数据域:指向一个存储数据的内存空间
  3.   int lenth; // 长度:顺序表中当前元素个数
  4.  }array; // 别名array

(四)报错功能

 #define ERROR(str) printf("错误:%s\t文件名:%s\t函数名:%s\t行数%d\n",str, __FILE__, __FUNCTION__, __LINE__)

(五)功能函数的声明

  1.  array *arr_init(); // 顺序表的创建,返回array类型的指针
  2.  void arr_push(array *arr,Type elem); // 向顺序表尾部插入数据(尾插法)
  3.  void arr_insert(array *arr, int index, Type elem); // 向顺序表指定位置插入数据
  4.  Type arr_remove(array *arr, int index); // 顺序表数据元素的删除,返回被删除元素的值
  5.  void arr_out(array *arr); // 顺序表的输出
  6.  void arr_free(array * arr); // 顺序表的销毁
  7.  void arr_clear(array * arr); // 顺序表的重置(重置为空表)
  8.  int arr_empty(array * arr); // 顺序表判空(判断顺序表释放为空)

三、函数功能实现

(一)声明头文件

 #include "Array.h" // 顺序表头文件

(二)顺序表的创建

  • 包含了顺序表结构(数据域、顺序表大小)

  1.  array *arr_init()
  2.  {
  3.      // 顺序表结构的初始化:动态开辟一个顺序表结构体内存
  4.   array* temp = (array *)malloc(sizeof(array));
  5.   if (temp == NULL) // 判断顺序表是不是指向空,如果为空的话那么就创建失败
  6.   {
  7.   printf("顺序表初始化失败!\n");
  8.   return NULL;
  9.   }
  10.   // 顺序表数据域的初始化:动态开辟一个顺序表数据域的动态内存
  11.   temp->data = (Type *)calloc(1, sizeof(Type));
  12.   // 顺序表大小的初始化:顺序表初始化的状态下,当前顺序表为空,其中没有任何数据
  13.   temp->lenth = 0;
  14.   return temp;
  15.  }

(三)顺序表数据元素的插入

  1.  // 向顺序表尾部插入数据(尾插法):一般用于空表第一次连续输入数据
  2.  void arr_push(array *arr, Type elem)
  3.  {
  4.   switch (arr_empty(arr))
  5.   {
  6.   case 1: ERROR("顺序表为空!\n"); // 如果顺序表为空则不允许数据的插入
  7.   break;
  8.   case 2: ERROR("顺序表数据域不存在!\n"); // 如果顺序表的数据域为空则不允许数据的插入
  9.   break;
  10.   case 3: ERROR("顺序表数据域为空!\n");
  11.   break;
  12.   }
  13.   arr->lenth++; // 有空间去插入数据,顺序表长度+1
  14.   arr->data = (Type *)realloc(arr->data, sizeof(Type)*arr->lenth); // 顺序表数据域内存扩大
  15.   arr->data[arr->lenth - 1] = elem; // 数据元素elem放入顺序表的最后
  16.  }
  17.  // 向顺序表arr中第index的位置插入一个数据元素elem
  18.  void arr_insert(array *arr, int index, Type elem)
  19.  {
  20.   switch (arr_empty(arr))
  21.   {
  22.   case 1: ERROR("顺序表为空!\n");
  23.   break;
  24.   case 2: ERROR("顺序表数据域不存在!\n");
  25.   break;
  26.   case 3: ERROR("顺序表数据域为空!\n");
  27.   break;
  28.   }
  29.   if (index <= 0 || index > arr->lenth) // 如果插入数据元素的位置小于等于0或者大于顺序表最大下标,则不允许数据插入
  30.   {
  31.   printf("数据插入位置错误!\n");
  32.   return;
  33.   }
  34.   // 定义一个临时变量i记录顺序表最后一个元素的位置
  35.   int i = arr->lenth++; // 顺序表长度+1
  36.   arr->data = (Type *)realloc(arr->data, sizeof(Type)*arr->lenth);
  37.   for (; i >= index; i--)  // 插入位置之后的所有数据元素往后移动一个位置
  38.   {
  39.   arr->data[i] = arr->data[i - 1];
  40.   }
  41.   arr->data[i] = elem; // 把待插入的数据放入指定位置
  42.  }

(四)数据元素的删除

  1. Type arr_remove(array *arr, int index) // 删除顺序表指定位置上的数据元素,并返回被删除元素的值
  2. {
  3. switch (arr_empty(arr))
  4. {
  5. case 1: ERROR("顺序表为空!\n");
  6. break;
  7. case 2: ERROR("顺序表数据域不存在!\n");
  8. break;
  9. case 3: ERROR("顺序表数据域为空!\n");
  10. break;
  11. }
  12. if (index <= 0 || index > arr->lenth)
  13. {// 如果插入数据元素的位置小于等于0或者大于顺序表最大下标,则不允许数据插入
  14. printf("数据删除位置错误!\n");
  15. return;
  16. }
  17. // 记录被删除元素的数据
  18. Type val = arr->data[index - 1];
  19. // 记录被删除元素的位置
  20. int i = index - 1;
  21. for (; i < arr->lenth; i++)
  22. {
  23. arr->data[i] = arr->data[i + 1];
  24. }
  25. // 顺序表长度-1
  26. arr->lenth--;
  27. // 顺序表数据域内存缩小
  28. arr->data = (Type *)realloc(arr->data, sizeof(Type)*arr->lenth);
  29. return val;
  30. }

(五)顺序表的输出

  1. void arr_out(array *arr)
  2. {
  3. switch (arr_empty(arr))
  4. {
  5. case 1: ERROR("顺序表为空!\n");
  6. break;
  7. case 2: ERROR("顺序表数据域不存在!\n");
  8. break;
  9. case 3: ERROR("顺序表数据域为空!\n");
  10. break;
  11. }
  12. for (int i = 0; i < arr->lenth; i++)
  13. {
  14. printf(TYPE_P, arr->data[i]); // 输出的格式随着Type变化,
  15. }
  16. putchar('\n');
  17. }

(六)顺序表的销毁

  1. void arr_free(array * arr)
  2. {
  3. if (arr != NULL) // 顺序表不为空
  4. {
  5. if (arr->data != NULL) // 数据域存在
  6. {
  7. free(arr->data); // 释放顺序表的数据域
  8. }
  9. free(arr); // 释放整个顺序表(结构体)
  10. }
  11. else
  12. printf("顺序表为空!\n");
  13. }

(七)顺序表的重置(重置为空表)

  1. void arr_clear(array * arr)
  2. {
  3. switch (arr_empty(arr))
  4. {
  5. case 1: ERROR("顺序表为空!\n");
  6. break;
  7. case 2: ERROR("顺序表数据域不存在!\n");
  8. break;
  9. case 3: ERROR("顺序表数据域为空!\n");
  10. break;
  11. }
  12. // 释放数据域
  13. free(arr->data);
  14. // 重新动态开辟一个顺序表数据域的动态内存
  15. arr->data = (Type *)calloc(1, sizeof(Type));
  16. // 顺序表长度置0
  17. arr->lenth = 0;
  18. }

(八)顺序表判空(判断顺序表释放为空)

  1. int arr_empty(array * arr)
  2. {
  3. if (NULL == arr) // 如果顺序表为空则不允许数据的插入
  4. {
  5. printf("顺序表为空!\n");
  6. return 1;
  7. }
  8. if (NULL == arr->data) // 如果顺序表数据域不存在则不允许数据的插入
  9. {
  10. printf("顺序表数据域不存在!\n");
  11. return 2;
  12. }
  13. if (arr->lenth == 0) // 如果顺序表数据域为空则不允许数据的插入
  14. {
  15. printf("顺序表数据域为空!\n");
  16. return 3;
  17. }
  18. return 0; // 顺序表不为空
  19. }

四、主函数

  • 顺序表:动态数组(能够动态改变大小,实现功能封装的一种数据结构)

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include "Array.h"
  4. void arr_test() // 顺序表功能测试函数
  5. {
  6. array* arr1 = arr_init(); // 顺序表的初始化
  7. Type temp; // 临时变量
  8. printf("请输入顺序表的数据:\n");
  9. do
  10. {
  11. scanf(TYPE_S, &temp);
  12. arr_push(arr1, temp); // 数据插入顺序表(尾插)
  13. } while ('\n' != getchar()); // 输入顺序表的数据以回车结束
  14. printf("当前顺序表中的数据为:\n");
  15. arr_out(arr1); // 顺序表的输出
  16. arr_insert(arr1, 3, 66); // 向顺序表第3个位置插入数据66
  17. printf("被删除的数据为:%d\n",arr_remove(arr1, 4)); // 删除顺序表第4个位置上的数据
  18. printf("当前顺序表中的数据为:\n");
  19. arr_out(arr1); // 顺序表的输出
  20. }
  21. int main()
  22. {
  23. arr_test();
  24. system("pause");
  25. return 0;
  26. }

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

闽ICP备14008679号