顺序表
顺序表的定义
顾名思义是逻辑结构中的线性结构在物理存储中使用顺序存储
顺序表在抽象数据类型中的定义
- 初始化
- 头插法
- 尾插法
- 头删法
- 尾删法
- 指定插入
- 指定删除
- 查找
- 修改
- 销毁
物理存储实现
- 初始化
void SqListInit(SL* ps)//初始化
{
ps->a = NULL;
ps->size = 0;
ps->rongliang = 0;
}
- 头插法
void ZengRong(SL* ps)//动态分配空间
{
if (ps->size == ps->rongliang)
{
int newrongliang = ps->rongliang == 0 ? 4 : ps->rongliang * 2;
emtype* p = (emtype*)realloc(ps->a, newrongliang * 2 * sizeof(emtype));
if (p == NULL)
{
printf("扩容失败!");
exit(-1);
}
else
{
ps->a = p;
ps->rongliang = newrongliang;
}
}
}
void SqListPushFront(SL* ps, emtype x)//头插法
{
ZengRong(ps);
int end = ps->size - 1;
while (end >= 0)
{
ps->a[end + 1] = ps->a[end];
--end;
}
ps->a[0] = x;
ps->size++;
}
- 尾插法
void ZengRong(SL* ps)//动态分配空间
{
if (ps->size == ps->rongliang)
{
int newrongliang = ps->rongliang == 0 ? 4 : ps->rongliang * 2;
emtype* p = (emtype*)realloc(ps->a, newrongliang * 2 * sizeof(emtype));
if (p == NULL)
{
printf("扩容失败!");
exit(-1);
}
else
{
ps->a = p;
ps->rongliang = newrongliang;
}
}
}
void SqListPushBack(SL* ps, emtype x)//尾插法
{
ps->a[ps->size] = x;
ps->size++;
ZengRong(ps);
ps->a[ps->size] = x;
ps->size++;
}
- 头删法
void SqListPopFront(SL* ps, emtype x)//头删法
{
assert(ps->size > 0);
int start = 1;
while (start < ps->size)
{
ps->a[start - 1] = ps->a[start];
++start;
}
ps->size--;
}
- 尾删法
void SqListPopBack(SL* ps, emtype x)//尾删法
{
assert(ps->size > 0);
ps->size--;
}
- 指定插入
void ZengRong(SL* ps)//动态分配空间
{
if (ps->size == ps->rongliang)
{
int newrongliang = ps->rongliang == 0 ? 4 : ps->rongliang * 2;
emtype* p = (emtype*)realloc(ps->a, newrongliang * 2 * sizeof(emtype));
if (p == NULL)
{
printf("扩容失败!");
exit(-1);
}
else
{
ps->a = p;
ps->rongliang = newrongliang;
}
}
}
void SqListInsert(SL* ps, int i, emtype x)//指定插入
{
assert(i<ps->size);
ZengRong(ps);
int end = ps->size - 1;
while (end >= i)
{
ps->a[end + 1] = ps->a[end];
--end;
}
ps->a[i] = x;
ps->size++;
}
- 指定删除
void SqListDelete(SL* ps, int i)//删除元素
{
assert(i < ps->size);
int start = i + 1;
while (start < ps->size)
{
ps->a[start - 1] = ps->a[start];
++start;
}
}
- 查找
int SqListFind(SL* ps, emtype x)//查找元素
{
for (int i = 0; i < ps->size; ++i)
{
if (ps->a[i] == x)
{
return i;
}
}
return -1;
}
- 修改
int SqListModity(SL* ps, int i,emtype x)//修改元素
{
assert(i < ps->size);
ps->a[i] = x;
return 0;
}
- 销毁
int SqListDestory(SL* ps)//销毁线性表
{
free(ps->a);
ps->a = NULL;
ps->rongliang = ps->size = 0;
return 0;
}