顺序表
顺序表的顺序存储结构,指的是用一段连续的存储单元 依次存储线性表的数据元素
线性表的顺序存储示意图:
![这里写图片描述](https://i-blog.csdnimg.cn/blog_migrate/e5b04a2d58d9da43afbb0a477ba9fa37.png)
c语言定义顺序表的顺序存储结构
struct array
{
int *pBase;//存储的是数组第一个元素的地址
int len;//数组所能容纳的最大元素的个数
int cnt;//当前数组有效元素个数
};
描述顺序存储结构需要三个元素:
存储空间的起始位置(即pBase)
线性表的最大存储容量(即len)
线性表的当前长度(即cnt)
顺序表的基本操作
(1)初始化
void ini_array(struct array * arr,int len)
{
arr->pBase = (int *)malloc(sizeof(int)*len);//开辟一个存储数据的连续空间
if (NULL == arr->pBase)
{
printf("动态内存分配失败!\n");
exit(-1);
}
arr->len = len;
arr->cnt = 0;
return;
}
算法:
1:开辟一个连续存储空间
2:长度赋值给len
3:cnt初始化为0
(2)追加元素
bool append_array(struct array *arr, int val)
{
if (is_full(arr))//通过is_full函数判断数组是否已经满了,若是满了则返回false
return false;
arr->pBase[arr->cnt] = val;//将要追加的元素添加在最后面
(arr->cnt)++;
return true;
}
算法:
1:首先判断数组是否满了,若是满了,则返回false
2:追加要添加的元素到数组最后面
3:cnt加一
(3)插入元素***
bool insert_array(struct array *arr, int val, int pos)
{
if (is_full(arr))
return false;
if (pos<1 || pos>arr->cnt + 1)
return false;
for (int i = arr->cnt-1; i >= pos-1; --i)//从最后开始插入位置之后的元素全部往后移一位
{
arr->pBase[i + 1] = arr->pBase[i];
}
arr->pBase[pos - 1] = val;
arr->cnt++;
return true;
}
算法:
1:若是插入位置小于一或是大于有效长度或是数组已满则返回false
2:从最后一个元素开始全部插入位置之后的元素都向后挪一位
3:将要插入的值赋给对应位置的值
4:有效长度加一
(4)删除元素
bool delete(struct array *arr, int pos)
{
if (is_empty(arr))
return false;
if (pos<1 || pos>arr->cnt)
return false;
for (int i = pos; i <= arr->cnt - 1; ++i)
{
arr->pBase[i - 1] = arr->pBase[i];
}
(arr->cnt)--;
return true;
}
算法:
1:如果删除位置小于1或者大于cnt,或者数组为空则返回false
2:将要删除位置后的元素全部向前挪一个
3:cnt–
(5)输出元素
void show(struct array *arr)
{
if (is_empty(arr))
printf("数组为空!\n");
else
{
for (int i = 0; i < arr->cnt; ++i)
{
printf("%d ", arr->pBase[i]);
}
printf("\n");
}
return;
}