不定长的顺序表即其内存是可扩容的
(操作大纲可参考上一篇定长顺序表)
//定义结构体
#deifne INIT_SIZE 10//初始化
typedef struct DSQList{
int elem[10];
int length;//有效长度
int listsize;//总容量
}DSQList,*PDSQList;
//初始化
void InitSqList(PDSQList ps){
assert(ps!=NULL);
if(ps==NULL){
return false;
}
//定义的所有变量都要进行初始化
//注意这是一个可以扩容的顺序表,所以要进行动态内存的开辟
ps->elem=(int*)malloc(INIT_SIZE*sizeof(int));//开辟的空间不能超过总容量
ps->length=0;
ps->listsize=INIT_SIZE;//总容量不会超过10
}
//插入数据,在ps顺序表的pos位置插入val
stactic bool Inc(PDSQList ps){
//先开辟动态内存
int* p=(int*)realloc(ps->elem,ps->listsize*2*sizeof(int));
assert(ps->elem!=NULL);
ps->listsize*=2;
//有效长度没变化
return true;
}
stactic bool IsFull(PDSQList ps){
//不定长顺序表满的条件是:有效长度==顺序表的容量
return ps->lengtn==ps->listsize;
}
bool Insert(PDSQList ps, int pos, int val) {
assert(ps != NULL);
if (ps == NULL) {
return false;
}
if (pos<0 || pos>ps->length) {
return false;
}
//如果满了就要用增长函数进行扩容
if (IsFull(ps)) {
//增长函数
Inc(ps);
}
//接下来的操作逻辑与定长顺序表一致
//先把数据后移
for (int i = ps->length - 1; i >= pos; i--) {
ps->elem[i + 1] = ps->elem[i];
}
//pos位置插入val
ps->elem[pos] = val;
//有效数据长度变化
ps->length++;
return true;
}
//判空 与定长顺序表一致(可参考我的上一篇文章)
//在ps中查找第一个key值,找到了返回下标,没有找到返回-1(可参考我的上一篇文章)
//删除pos位置的值 不会改变容量与定长顺序表一致(可参考我的上一篇文章)
//删除第一个val的值(可参考我的上一篇文章)
//返回key的前驱下标,如果不存在返回-1(可参考我的上一篇文章)
//返回key的后继下标。如果不存在返回-1(可参考我的上一篇文章)
//输出(可参考我的上一篇文章)
//清空数据(可参考我的上一篇文章)
//销毁
void Destroy(PSQDList ps){
free(ps->elem);//防止内存泄漏
ps->elem=NULL;//防止野指针
ps->length=0;
ps->listsize=0;
//注意 ps=NULL 无效代码
}