首先顺序表是学数据结构开始就学的内容,可以说它是一种非常容易理解的内容,其实我们之前学习c语言也经常使用顺序表,只是我们没有这个概念而已,那么接下来我先介绍它的概念。
顺序表故名思意就是有一定顺序的表格,对于计算机来说,它就是连续的物理空间存储,并且它的数据必须从头开始依次存储,那么非常容易理解的就是数组了。
对于数组的增删查改和排序那么就是顺序表必不可少的操作了,接下来我会详细的介绍它。
顺序表是一块连续的空间,那么我们无法一次将内存开辟合适,所以将考虑用动态内存的方法.
typedef struct SeqList
{
int* arr;
int size;
int capicity;
}SeqList;
size:有效数据个数 caoicity:总容量大小
arr将用malloc申请空间realloc进行调整
所有的接口
//初始化 尾增 前增 尾删 前删 随机增 随机修改 排序 查找 检查容量 打印 释放空间
void SeqListInit(SeqList* ps);
void AddListEnd(SeqList* ps, int date);
void AddFirstList(SeqList* ps, int date);
void DeleteListEnd(SeqList* ps);
void DeleteListFirst(SeqList* ps);
void InterLest(SeqList* ps, int loc, int date);
void ModList(SeqList* ps, int loc, int date);
void SortList(SeqList* ps);
int* FondList(SeqList* ps, int date);
void CheckList(SeqList* ps);
void PrintList(SeqList* ps);
void Release(SeqList* ps);
其实这里面很多东西都非常简单,先上代码
void SeqListInit(SeqList* ps)
{
ps->arr = (int*)malloc(sizeof(int) * 3);
if (ps == NULL)
{
return;
}
ps->capicity = 3;
ps->size = 3;
memset(ps->arr, 0, sizeof(int) * 3);
}
void CheckList(SeqList* ps)
{
if (ps->size == ps->capicity)
{
int* pa = realloc(ps->arr, sizeof(int) * ps->capicity * 2);
if (pa != NULL)
{
ps->arr = pa;
ps->capicity *= 2;
}
}
}
void AddListEnd(SeqList* ps, int date)
{
CheckList(ps);
ps->arr[ps->size] = date;
ps->size++;
}
void AddFirstList(SeqList* ps, int date)
{
CheckList(ps);
int end = ps->size - 1;
while (end >= 0)
{
ps->arr[end + 1] = ps->arr[end];
end--;
}
ps->arr[0] = date;
ps->size++;
}
void DeleteListEnd(SeqList* ps)
{
int end = ps->size - 1;
ps->arr[end] = 0;
ps->size--;
}
void DeleteListFirst(SeqList* ps)
{
int first = 0;
while (first<=ps->size-2)
{
ps->arr[first] = ps->arr[first + 1];
first++;
}
ps->size--;
}
void InterLest(SeqList* ps, int loc, int date)
{
assert(loc < ps->capicity);
CheckList(ps);
int end = ps->size - 1;
while (end >= loc)
{
ps->arr[end + 1] = ps->arr[end];
end--;
}
ps->arr[loc] = date;
ps->size++;
}
void ModList(SeqList* ps, int loc, int date)
{
ps->arr[loc] = date;
}
int arr_sub[20] = { 0 };
int* FondList(SeqList* ps, int date)
{
int i = 0;
int j = 0;
for (i = 0; i < ps->size; i++)
{
int count = 0;
if (ps->arr[i] == date)
{
arr_sub[j] = i;
j++;
count++;
}
if (i == ps->size - 1 && count != 1)
{
while (count--)
{
arr_sub[count] = arr_sub[count - 1];
}
arr_sub[0] = count;
return arr_sub;
}
else
{
return NULL;
}
}
}
int w_cmp(const void* e1, const void* e2)
{
return *(int*)e1 - *(int*)e2;
}
void SortList(SeqList* ps)
{
qsort(ps->arr, ps->size, sizeof(int), w_cmp);
}
void PrintList(SeqList* ps)
{
int i = 0;
for (i = 0; i < ps->size; i++)
{
printf("%d ", ps->arr[i]);
}
printf("\n");
}
void Release(SeqList* ps)
{
free(ps->arr);
ps->arr = NULL;
}
SortList排序函数这里用的是qsort快速排序,这里的FondList函数有些bug随后会进行修改。其他也没什么需要说的,记得malloc的空间要释放哦。