不定长顺序表
即空间大小会随着存放数据的多少而变化,比如存放数据增加时,会先进行扩展内存,然后进行存放数据。
基础知识
length //当前顺序表中数据元素的个数
listsize //当前顺序表的空间大小
基本内容
1、初始化
2、扩容
3、插入
【1】头插
【2】按位置插入
【3】尾插
4、删除
【1】头删
【2】按位置删
【3】尾删
5、清空
6、销毁
初始化
【1】先判空
【2】置空
代码示例
void InitUSeqList(PUList list)
{
DeterPointIsNull(list);
list->data = NULL;
list->length = list->size = 0;
}
扩容
方案:在原始空间大小 + INITSIZE大小
基本规则
【1】申请扩展空间
【2】判空
【3】原始数据拷贝给新空间
【4】释放原始数据空间
【5】将新空间首地址复制给list->data
【6】链表扩充
代码示例
static void AppendSpace(PUList list)
{
ElemType *s = (ElemType *)malloc(sizeof(ElemType)*(list->length + INITSIZE));
assert(s != NULL);
for (int i = 0; i < list->length; ++i)
{
s[i] = list->data[i];
}
free(list->data);
list->data = s;
list->size += INITSIZE;
}
按位置插入
此部分和定长顺序表略有差异
基本规则
【1】判断链表是否为空
【2】判断pos位置是否合法
【3】判断当前顺序表是否为满,如果满,则进行扩容
【4】将pos位置及其后数据统一向后移一个位置
【5】将插入值放入放到pos位置
【6】链表大小+1
代码示例
int InserUSeqListPos(PUList list, ElemType val, int pos)
{
DeterPointIsNull(list);
if (pos<0||pos>list->length>0)
{
printf("pos is erro,Insert fail\n");
return 0;
}
if (list->length==list->size)
{
AppendSpace(list);
}
for (int i = list->length; i <pos ; --i)
{
list->data[i] = list->data[i - 1];
}
list->data[pos] = val;
list->length++;
return 1;
}
删除
删除部分和上篇定长顺序表的套路思想一样,
这里就不做过多说明了。
清空
【1】链表判空
【2】链表大小置为0
代码示例
void ClearUSeqList(PUList list)
{
DeterPointIsNull(list);
list->length = 0;
}
销毁
【1】判空
【2】数据清理
代码示例
void DestroyUSeqList(PUList list)
{
DeterPointIsNull(list);
free(list->data);
list->data = NULL;
list->length = list->size = 0;
}