1.1 顺序表的定义
线性表的顺序存储结构,指的是用一段地址连续的储存单元依次存储线性表的数据元素
所以我们需要一个数组来存放数据,一个整形来记录线性表当前长度,还有一个来记录当前线性表最大的存储量。
1.2 扩容顺序表的初始化
可扩容的顺序表相比与定长顺序表要多一个整型值来保存最大容量个数。
根据上图分析代码如下:
typedef struct Dsqlist
{
int length;
int list_size;
ELEM_TYPE* data;//接受从堆内申请来的空间
}Dsqlist ,*PDsqlist;
1.2 任意位置插入函数
设计思路:
①先进行断言(防止 p指针为空指针)
②判断插入位置是否合法
③要进行判满操作(这里记住一个规律 :插入时要进行判满操作,删除时进行判空操作)
如果发现若空间满了则扩容,让用户感觉到好似是无限空间在这里就要开始调用扩容函数了。
④开始腾位置
⑤执行到此时待插入位置空出,插入即可(一定要记着p->length++),将要插入的val值赋给p->data[pos]
根据上述分析代码如下
//任意位置插入数据
bool Insert_pos(PDsqlist p, int pos, int val)
{
//1、断言
assert(p != NULL);//指针判空 保不定长顺序表头节点存在
if (p == NULL) return false;
//2、判断插入位置是否合法
assert(pos > 0 && pos <= p->length);//插入值合法判断
if (pos<0 || pos>p->length) return printf("不能删除在该位置插入");
//判满操作
if (IsFull(p))//判满操作 若空间满则扩容,让用户感觉到好似是无限空间
{
Inc(p);
}
//此时,执行到此保证有足够空间
for (int i = p->length-1; i>=pos;i--)
{
p->data[i] = p->data[i + 1];
}
//此时,执行到此已将待插入位置空出
p->data[pos] = val;
return true;
p->length++;
}
1.3任意位置删除函数
设计思路:
①先进行断言(防止 p指针为空指针)
②判断删除位置是否合法
③开始挪动要删除元素的下一个元素(例:要删除pos,就int i=pos+1 ,最后一个需要挪动的数据下标为p->length)(一定要记着p->length--)
//任意位置删除数据
bool Del_pos(PDsqlist p, int pos)
{
assert(p != NULL);
if (p == NULL) return false;
if (pos < 0 || pos >= p->length) return printf("您所删除的位置不存在:");
//i指向第一个要挪动的元素下标,最后一个需要挪动的数据下标为p->length
for (int i = pos + 1; i < p->length; i++)
{
p->data[i + 1] = p->data[i];
}
p->length--;
}
1.4判空函数、判满函数
//判空操作
bool IsEmpty(PDsqlist p)
{
return p->length == 0;
}
//判满操作
bool IsFull(PDsqlist p)
{
return p->length = p->list_size;
}
1.5扩容函数
//扩容
void Inc(PDsqlist p)
{
//realloc (第二个参数:需要的是 新开辟内存的总大小(以字节为单位))
p->data=(ELEM_TYPE*)realloc(p->data, p->list_size * sizeof(ELEM_TYPE) * 2);
p->length;//扩容不会涉及有效长度的改变
}