1、动态顺序表的基本结构
动态顺序表区别于静态顺序表,优势在于可以根据所需开辟新的内存去储存更多的数据
静态顺序表
struct SeqList
{
SLDataType a[100]; //有限长度数组
int size; //存储数据个数
}
动态顺序表
typedef int SLDataType;
struct SeqList
{
SLDataType* a; //动态数组
int size; //有效数据长度
int capicity; //容量
};
typedef struct SeqList SL;
2.基本接口函数
顺序表初始化
void SeqListInit(SL* sl)
void SeqListInit(SL* sl)
{
sl->a = NULL;
sl->size = 0;
sl->capicity = 0;
}
顺序表销毁
void SeqListDestory(SL* sl);
void SeqListDestory(SL* sl)
{
free(sl->a);
sl->a = NULL;
sl->size = 0;
sl->capicity = 0;
}
注:开辟了动态顺序表,最后一定要销毁。否则,会内存泄漏。
顺序表打印
void SeqListPrint(SL* sl);
void SeqListPrint(SL* sl)
{
for (int i = 0; i < sl->size; i++)
{
printf("%d ", sl->a[i]);
}
printf("\n");
}
检查空间,如果满了,进行增容
void CheckCapacity(SL* sl);
void CheckCapacity(SL* sl)
{
if (sl->size == sl->capicity)
{
int newcapicity = sl->capicity == 0 ? 4 : sl->capicity * 2;
SLDataType* tmp = (SLDataType*)realloc(sl->a,sizeof(SLDataType) * newcapicity);
if (tmp == NULL)
{
printf("realloc fail!");
exit(-1);
}
else
{
sl->a = tmp;
sl->capicity = newcapicity;
}
}
}
realloc函数:将分配内存重新分配,大小为第二个所传参数。若原指针未分配内存,直接分配内存。
顺序表尾插
void SeqListPushBack(SL* sl, SLDataType x);
void SeqListPushBack(SL* sl, SLDataType x)
{
CheckCapacity(sl);
sl->a[sl->size++] = x;
}
顺序表头插
void SeqListPushFront(SL* sl, SLDataType x);
void SeqListPushFront(SL* sl, SLDataType x)
{
CheckCapacity(sl);
int end = sl->size;
while (end > 0)
{
sl->a[end] = sl->a[end - 1];
end--;
}
sl->a[0] = x;
sl->size++;
}
顺序表尾删
void SeqListPopBack(SL* sl);
void SeqListPopBack(SL* sl)
{
assert(sl->size > 0);
sl->size--;
}
顺序表头删
void SeqListPopFront(SL* sl);
void SeqListPopFront(SL* sl)
{
assert(sl->size > 0);
for (int i = 1; i < sl->size; i++)
{
sl->a[i - 1] = sl->a[i];
}
sl->size--;
}
顺序表查找
int SeqListFind(SL* sl, SLDataType x);
int SeqListFind(SL* sl, SLDataType x)
{
for (int i = 0; i < sl->size; ++i)
{
if (sl->a[i] == x)
return i;
}
return -1;
}
顺序表在pos位置插入x
void SeqListInsert(SL* sl, int pos, SLDataType x);
void SeqListInsert(SL* sl, int pos, SLDataType x)
{
CheckCapacity(sl);
int end = sl->size;
while (end > pos)
{
sl->a[end] = sl->a[end - 1];
end--;
}
sl->a[pos] = x;
sl->size++;
}
顺序表删除pos位置的值
void SeqListErase(SL* sl, int pos);
void SeqListErase(SL* sl, int pos)
{
for (int i = pos; i < sl->size - 1; i++)
{
sl->a[i] = sl->a[i + 1];
}
sl->size--;
}
3.动态顺序表的使用
int main()
{
SL sl;
SeqListInit(&sl);
SeqListPushFront(&sl, 1);
SeqListPushBack(&sl, 2);
SeqListPushFront(&sl, 1);
SeqListPushFront(&sl, 3);
SeqListPushFront(&sl, 1);
SeqListPushBack(&sl, 4);
SeqListPopBack(&sl);
int pos = SeqListFind(&sl, 3);//可嵌套使用
SeqListInsert(&sl, pos, 7); //SeqListInsert(&sl,SeqListFind(&sl, 3), 7);
pos = SeqListFind(&sl, 1);
SeqListErase(&sl, pos); //SeqListErase(&sl, SeqListFind(&sl, 1));
SeqListPrint(&sl);
printf("%d", sl.size);
SeqListDestory(&sl);
}