顺序表的概念:
顺序表是将表中的数据依次存放在计算机内存中一组地址连续的存储单元中的一种数据结构,可以将顺序表看成一个可以动态改变大小的数组。
数据元素物理存储的相邻关系来反映数据元素之间逻辑上的相邻关系是线性表的一种,也就是采用顺序存储结构的线性表简称为"顺序表"。
顺序表的存储特点是:只要确定了起始位置 ,数据可以通过指定位置得到:首地址+(位置*偏移大小)。
那么顺序表怎么定义呢?
这里我是要int类型为顺序表元素的类型编写代码举例。
typedef int Type;
typedef struct //顺序表结构体
{
Type *data;//数据域
int lenth;//大小
}array;
定义完我们的顺序表后,第一步给他初始化。
//初始化函数
array * arr_init(){
//顺序表结构体的初始化
array *temp = (array *)malloc(sizeof(array));//地契 把这块地强转成你的
if (temp == NULL)
{
printf("顺序表初始化失败!\n");
return NULL;//假
}
//顺序表数据域的初始化
temp->data = (Type *)calloc(1, sizeof(Type));
temp->lenth = 0;//对长度置零 有一个array大小
return temp;
}
接下来就是实现一些顺序表的功能函数。
//顺序表指定位置插入数据
void arr_insert(array * arr, int index, int elem)
{
if (arr == NULL)
{
printf("顺序表为空!\n");
return;
}
if (arr->data == NULL)
{
printf("顺序表的数据域为空!\n");
return;//不执行插入操作
}
int i = ++arr->lenth; //外部定义i 是为了保留下标值
//printf("lenth:%d\n",arr->lenth);
//扩大顺序表数据域内存
arr->data = (Type *)realloc(arr->data, sizeof(Type)*(arr->lenth+1));
for (; i > index - 1; i--)
{
arr->data[i] = arr->data[i - 1];//数据后移
}
arr->data[index-1] = elem;
}
//实现删除顺序表指定位置上的数据,并将已删除的数据返回
Type arr_remove(array *arr, int index)
{
if (arr == NULL)
{
printf("顺序表为空!\n");
return;
}
if (arr->data == NULL)
{
printf("顺序表的数据域为空!\n");
return;//不执行插入操作
}
//记录被删除的数据
Type val = arr->data[index - 1];//下标从0开始 位置数从1开始
int i = index - 1;
for (; i < arr->lenth; i++)
{
arr->data[i] = arr->data[i + 1];//往前覆盖index-1开始的值
}
arr->lenth--;
//缩小顺序表数据域大小
arr->data = (Type*)realloc(arr->data, sizeof(Type) * (arr->lenth+1));
return val;
}
//实现顺序表的输出
void arr_out(array*arr)
{
if (arr == NULL)//习惯性判断 否则功能不完整
{
printf("顺序表为空!\n");
return;
}
if (arr->data == NULL)
{
printf("顺序表的数据域为空!\n");
return;//不执行插入操作
}
for (int i = 0; i <= arr->lenth; i++)
{
printf("arr[%d]:%d\n", i, arr->data[i]);
}
}
//实现返回顺序表中第n个数据元素的值,不删除元素
Type arr_get(array *arr, int index)
{
if (arr == NULL)//习惯性判断 否则功能不完整
{
printf("顺序表为空!\n");
return;
}
if (arr->data == NULL)
{
printf("顺序表的数据域为空!\n");
return;//不执行插入操作
}
if (index > arr->lenth)
{
printf("位置超出!\n");
return;
}
return arr->data[index - 1];
}
//函数arr_merge(*arr1, *arr2),实现两个顺序表的合并,将顺序表arr2连接到顺序表arr1之后
void arr_marge(array *arr1, array *arr2)
{
if ((arr1 == NULL) || (arr2 == NULL))//习惯性判断 否则功能不完整
{
printf("顺序表为空!\n");
return;
}
if ((arr1->data == NULL) || (arr2->data == NULL))//1+0
{
printf("顺序表的数据域为空!\n");
return;//不执行插入操作
}
for (int i = 0; i <= arr2->lenth; i++)
{
arr_push(arr1, arr2->data[i]);
}
}
//实现顺序表的销毁
void arr_free(array**arr)//参数是指向arr的指针
{
if (*arr != NULL)
{
if ((*arr)->data != NULL)// -> 优先级 比 * 高
{
free(*arr);
*arr = NULL;
}
else
printf("数据域为空!\n");
}
else
printf("顺序表为空!\n");
}
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!