顺序表
顺序表
1、什么是顺序表
顺序表是将表中的数据依次存放在计算机内存中一组地址连续的存储单元中的一种数据结构,可以将顺序表看成一个可以动态改变大小的数组。
数据元素物理存储的相邻关系来反映数据元素之间逻辑上的相邻关系,顺序表是线性表的一种,也就是采用顺序存储结构的线性表简称为"顺序表"。
顺序表的存储特点是:只要确定了起始位置 ,数据可以通过指定位置得到:首地址+(位置*偏移大小)
2、顺序表的定义
#define MAX_SIZE 128 //顺序表的元素大小
typedef int Type //类型的定义,这里用Type替代int是为了后续改变类型方便
struct Array
{
Type *data; //存储数组的指针
int length; //顺序表里元素的个数
int capacity; //顺序表内存空间大小
};
3、顺序表的功能实现
3.1 构造一个空的顺序表
//3.1构造一个空的顺序表
Array* arr_init()
{
Array* temp = (Array*)malloc(sizeof(Array)); //结构体初始化
if (temp == NULL)
{
printf("顺序表开辟空间失败");
return NULL;
}
temp->data = (Type*)calloc(1,sizeof(Type)); //数据域初始化
temp->lenth = 0;
return temp;
}
3.2 销毁顺序表
void arr_free(Array* arr)
{
if (arr != NULL)
{
if(arr->data != NULL)
free(arr->data); //释放顺序表数据域
free(arr); //释放整个顺序表
}
else
{
printf("顺序表为空");
}
}
3.3 重置为空表
void arr_clear(Array* arr)
{
if (arr == NULL)
{
printf("\n顺序表为空:文件位置:%s 函数:%s 行数:%d \n",__FILE__,__FUNCTION__,__LINE__); //如果报错,输出错误信息
return;
}
else
{
for (int i = 0; i < arr->lenth; ++i)
{
arr->data[i] = 0; //顺序表置空(元素置0)
}
arr->data = (Type*)realloc(arr->data, sizeof(Type)); //顺序表数据域置0
arr->lenth = 0;
}
/*
* 或者先free,再开辟
* free(arr->data);
* arr->data = (Type*)calloc(1,sizeof(Type))
* arr->lenth = 0;
*/
}
3.4 判断是否为空表
int arr_empty(Array* arr)
{
if (arr->lenth == 0)
{
printf("顺序表数据为空");
return 1;
}
return 0;
}
3.5 返回第i个数据元素的值
Type arr_get(Array* arr, int i)
{
if (arr == NULL)
{
printf("\n顺序表为空:文件位置:%s 函数:%s 行数:%d \n", __FILE__, __FUNCTION__, __LINE__);
return NULL;
}
if (arr->data == NULL)
{
printf("\n顺序表数据域为空:文件位置:%s 函数:%s 行数:%d \n", __FILE__, __FUNCTION__, __LINE__);
return NULL;
}
arr_empty(arr);
if (i > arr->lenth)
{
printf("\n位置有误:文件位置:%s 函数:%s 行数:%d \n", __FILE__, __FUNCTION__, __LINE__);
return NULL;
}
return arr->data[i - 1];
}
3.6 插入顺序表元素
void arr_push(Array* arr, Type val)
{
if (arr == NULL)
{
printf("\n顺序表为空:文件位置:%s 函数:%s 行数:%d \n", __FILE__, __FUNCTION__, __LINE__);
return;
}
if (arr->data == NULL)
{
printf("\n顺序表数据域为空:文件位置:%s 函数:%s 行数:%d \n", __FILE__, __FUNCTION__, __LINE__);
return;
}
arr->lenth++; //长度+1
arr->data = (Type*)realloc(arr->data, sizeof(Type) * arr->lenth); //顺序表数据域内存扩大
arr->data[arr->lenth - 1] = val; //尾插
}
3.7 在顺序表指定位置插入新的数据元素
void arr_insert(Array* arr, int index, Type val)
{
if (arr == NULL)
{
printf("\n顺序表为空:文件位置:%s 函数:%s 行数:%d \n", __FILE__, __FUNCTION__, __LINE__);
return;
}
if (arr->data == NULL)
{
printf("\n顺序表数据域为空:文件位置:%s 函数:%s 行数:%d \n", __FILE__, __FUNCTION__, __LINE__);
return;
}
arr_empty(arr);
if (index > arr->lenth)
{
printf("\n插入位置有误:文件位置:%s 函数:%s 行数:%d \n", __FILE__, __FUNCTION__, __LINE__);
return;
}
int i = arr->lenth++;
arr->data = (Type*)realloc(arr->data, sizeof(Type) * arr->lenth);
for (int j = arr->lenth - 1; j > index -1; --j) //把插入数据之后的元素向后移动
{
arr->data[j] = arr->data[j-1];
}
arr->data[index-1] = val;
}
3.8 删除顺序表指定位置的数据元素,并返回元素的值
Type arr_remove(Array* arr, int index)
{
if (arr == NULL)
{
printf("\n顺序表为空:文件位置:%s 函数:%s 行数:%d \n", __FILE__, __FUNCTION__, __LINE__);
return NULL;
}
if (arr->data == NULL)
{
printf("\n顺序表数据域为空:文件位置:%s 函数:%s 行数:%d \n", __FILE__, __FUNCTION__, __LINE__);
return NULL;
}
if (index > arr->lenth)
{
printf("\n插入位置有误:文件位置:%s 函数:%s 行数:%d \n", __FILE__, __FUNCTION__, __LINE__);
return NULL;
}
arr_empty(arr);
int temp = arr->data[index - 1]; //记录被删除元素
for (int i = index - 1; i < arr->lenth; ++i)
{
arr->data[i] = arr->data[i + 1];
}
arr->lenth--;
arr->data = (Type*)realloc(arr->data, sizeof(Type) * arr->lenth);
return temp;
}
3.9 输出顺序表
void arr_out(Array* arr)
{
if (arr == NULL)
{
printf("\n顺序表为空:文件位置:%s 函数:%s 行数:%d \n", __FILE__, __FUNCTION__, __LINE__);
return;
}
if (arr->data == NULL)
{
printf("\n顺序表数据域为空:文件位置:%s 函数:%s 行数:%d \n", __FILE__, __FUNCTION__, __LINE__);
return;
}
arr_empty(arr);
for (int i = 0; i < arr->lenth; ++i)
{
printf(T, arr->data[i]);
}
}
3.10 从尾部删除顺序表
Type arr_pop(Array* arr)
{
if (arr == NULL)
{
printf("\n顺序表为空:文件位置:%s 函数:%s 行数:%d \n", __FILE__, __FUNCTION__, __LINE__);
return NULL;
}
if (arr->data == NULL)
{
printf("\n顺序表数据域为空:文件位置:%s 函数:%s 行数:%d \n", __FILE__, __FUNCTION__, __LINE__);
return NULL;
}
arr_empty(arr);
int temp = arr->data[arr->lenth - 1];
arr->lenth--;
arr->data = (Type*)realloc(arr->data, sizeof(Type) * arr->lenth);
return temp;
}
当然也可以用宏定义替代报错
#define Error(str) printf("\n%s 文件位置:%s 函数:%s 行数:%d \n", __FILE__, __FUNCTION__, __LINE__);
//这样只需要在代码里写Error("顺序表为空 ");了