前言
继上一篇:【数据结构】:线性表之静态顺序表。在该文章的结尾我们说了静态顺序表是固定大小的,今天我们来实现动态增容的顺序表。
1.存储结构
动态增容的顺序表和静态顺序表的没有变化。
typedef int ElemType;
typedef struct SeqList
{
ElemType *base;
int capacity; //顺序表最大容量
int size; //顺序表当前容量
}SeqList;
2.动态增容的代码
增容成功返回1,不成功返回0,一般增加容量的大小为2倍较为合理。
提示:前提需要了解c库函数中的reallc函数的使用方式。
bool Inc_capacity(SeqList* list)
{
ElemType* newBase = (ElemType*)realloc(list->base, sizeof(ElemType)*SEQLIST_INT_SIZE *2);
if (newBase == NULL)
return 0;
list->capacity *= 2;
return 1;
}
3.尾插
void Push_back(SeqList* list, ElemType x)
{
//如果容量不够时候判断 是否增容成功 ,成功就插入元素
if (list->size >= list->capacity && !Inc_capacity(list))
return;
list->base[list->size++] = x;
}
4.头插
注意体会该语句的含义if (list->size >= list->capacity && !Inc_capacity(list));
void Push_front(SeqList* list, ElemType x)
{
if (list->size >= list->capacity && !Inc_capacity(list))
return;
//头插
for (int tail = list->size - 1; tail >= 0; tail--)
{
list->base[tail+1] = list->base[tail];
}
//插入元素
list->base[0] = x;
list->size++;
5.按位置插入
void Insert_position(SeqList* list, int pos, ElemType x)
{
if (pos < 0 || pos>list->capacity)
return;
if (list->size >= list->capacity && !Inc_capacity(list))
return;
for (int index = list->size - 1; index >= pos; index--)
{
list->base[index+1] = list->base[index];
}
list->base[pos] = x;
list->size++;
}
总结
其实动态增容也就是在插入算法时候起作用。其他的算法和静态顺序表没什么区别。
共勉。