1. 顺序表的初始化
typedef int SLDatatype;
typedef struct S
{
SLDatatype* a;//动态顺序表
int sz; //sz是有效数据个数
int capacity;//capactiy是容量
}SL;
这里先定义了一个动态顺序表(数组)。typedef将顺序表类型定义为SLDatatype(这样可以随意修改类型),typedef将结构体类型定义为SL(也是为了减少一些代码量,防止眼花缭乱)
对其进行初始化操作:
void InitSeqList(SL* psl)
{
assert(psl);//断言 防止其为野指针
psl->a = (SLDatatype*)malloc(sizeof(SLDatatype) * 4);
if (psl->a == NULL)
{
perror("malloc");//如果malloc函数创建空间失败,perror会报错
return;
}
psl->sz = 0;
psl->capacity = 4;//初始容量定为4
}
用malloc内存函数为其开辟4个结构体类型大小的空间,如果malloc函数创建空间失败,perror会报错。
2. 顺序表的尾插
void SLCheckCapacity(SL* psl)
{
assert(psl);
if (psl->sz == psl->capacity)
{
SLDatatype* tmp = (SLDatatype*)realloc(psl->a, sizeof(SLDatatype) * psl->capacity * 2);
if (tmp == NULL)
{
perror("realloc");
return;
}
psl->a = tmp;
psl->capacity *= 2;
}
}
void SLPushBack(SL* psl, SLDatatype x)
{
assert(psl);
SLCheckCapacity(psl);
psl->a[psl->sz] = x;
psl->sz++;
}
在进行插入操作时,我们要检查顺序表的容量是否足够,如果不够,用realloc对其进行扩容。数组下标是从0开始的,所以我们添加在psl->sz位置上.
3. 顺序表的尾删
void SLPopBack(SL* psl)
{
assert(psl->sz>0);
psl->a[psl->sz - 1] = 0;
psl->sz--;
}
尾删直接将psl->sz-1(数组下标从0开始)位置归0即可。
4. 顺序表的头插
void SLPushFront(SL* psl, SLDatatype x)
{
assert(psl);
SLCheckCapacity(psl);
int end = psl->sz;
while (end > 0)
{
psl->a[end] = psl->a[end - 1];
end--;
}
psl->a[0] = x;
psl->sz++;
}
这里从尾部开始,将每一个数据往后移动一位,第一位放x。
5. 顺序表的头删
void SLPopFront(SL* psl)
{
assert(psl);
int start = 1;
while (start < psl->sz)
{
psl->a[start-1] = psl->a[start];
start++;
}
psl->sz--;
}
删除从下标1开始,将每一位往前移动一位。
6. 顺序表的插入
void SLInsert(SL* psl, int pos, SLDatatype x)
{
assert(pos >= 0 && pos <= psl->sz);
SLCheckCapacity(psl);
int end = psl->sz - 1;
while (end>=pos)
{
psl->a[end + 1] = psl->a[end];
end--;
}
psl->a[pos] = x;
psl->sz++;
}
这里pos插入到数据里面,先断言pos在0到psl->sz中,不然可能会造成越界访问。从pos开始的头插,将pos后的每一位往后移动。
7. 顺序表的删除
void SLErase(SL* psl, int pos)
{
assert(pos >= 0 && pos <= psl->sz);
int start = pos + 1;
while (start < psl->sz)
{
psl->a[start - 1] = psl->a[start];
start++;
}
psl->sz–;
}
这里pos插入到数据里面,先断言pos在0到psl->sz中,不然可能会造成越界访问。从pos开始的头删,将pos后的每一位往前移动。
8.顺序表的销毁
void DestroySeqList(SL* psl)
{
assert(psl);
free(psl->a);
psl->a = NULL;
psl->sz = 0;
psl->capacity = 0;
}
内存函数创建的空间一定要free释放。
源码参考:
链接: https://gitee.com/yujin518/test_c/tree/master/test_3_13