线性表的顺序储存结构(实现顺序表的增,删功能)

前言

线性表的顺序存储结构是常用的存储方式,它直接将线性表的逻辑结构映射到存储结构上。

1.头文件申明

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#define N 1000
typedef int SeqlistDatatype;

void SeqlistInit(SL *s);//定义函数初始化顺序表
void SeqlistPushBack(SL* ps, SeqlistDatatype x);//尾插
void SeqlistDestory(SL* sl);//销毁顺序表
void Seqlistprint(SL* sl);//打印顺序表
void CheckCapacity(SL* s);//检查顺序表的内存
void SeqlistInsert(SL* s, SeqlistDatatype x, SeqlistDatatype pos);//插入数据
void SeqlistDelete(SL* s, SeqlistDatatype pos);//删除数据

2.建立顺序表

//动态顺序表 按需要开展空间
typedef struct Seqlist
{
	SeqlistDatatype *a;
	SeqlistDatatype size;//记录存储了多少个有效数据
	SeqlistDatatype capacity;//记录容量空间的大小

}SL;

3.初始化顺序表

void SeqlistInit(SL *ps)//初始化顺序表
{
	ps->a = NULL;//ps指针(顺序表)指向a的值变成NULL
	ps->size = 0;
	ps->capacity = 0;//设置容量和数据为0
}

4.销毁顺序表

void SeqlistDestory(SL* ps)//销毁顺序表,释放空间
{
	if (ps->a)//当ps->a不为空时
	{
		free(ps->a);//释放
		SeqlistInit(&ps);//初始化
	}
}

5.检查容量

void CheckCapacity(SL* ps)
{
	assert(ps);//检查ps是否为空
	if (ps->size == ps->capacity)//当数据等于容量的时候,说明此顺序表空间已满
	{
		int newCapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
		//新开创一个容量,把容量扩展为原来的两倍
		SeqlistDatatype* temp = (SeqlistDatatype*)realloc(ps->a, newCapacity * sizeof(SeqlistDatatype));
		if (temp == NULL)
		{
			perror("realloc fail");
			exit(-1);
		}
		ps->a = temp;
		ps->capacity = newCapacity;
	}
} 

6.打印顺序表

void Seqlistprint(SL* ps)
{
	assert(ps);//断言
	for (int i = 0; i < ps->size; i++)
	{
		printf("%d ",ps->a[i]);//从第一个数据开始打印顺序表
	}
	printf("\n");
}

7.尾插数据

void SeqlistPushBack(SL* ps, SeqlistDatatype x)//顺序表,数据
{
	CheckCapacity(ps);//扩容
	ps->a[ps->size] = x;//让顺序表a[]size位置上存储数据x
	ps->size++;//然后size+1,为下次存数据的位置
}

8.插入数据

void SeqlistInsert(SL* ps, SeqlistDatatype x, SeqlistDatatype pos)//顺序表,插入数据,插入位置
{
	assert(ps);
	assert(pos >= 0);
	assert(pos < ps->size);//断言

	CheckCapacity(ps);//扩容
	int end = ps->size - 1;
	//假如创建了 1,2,3三个数据,size这个时候是等于3的
	//所以创建一个变量end-1,方便指针的调用,而且避免了结尾size++后size值不改变的尴尬
	while (end >= pos)//这里循环的作用主要是把数据后移
		//例如:123 我想在1和2中间插入一个4,我会先调整成1223然后把2改成4
	{
		ps->a[end + 1] = ps->a[end];
		end--;
	}
	ps->a[pos] = x;//这里就是把想改的位置上换成插入的数据
	ps->size++;//新增一个数据,所以size-1;
}

9.删除数据

void SeqlistDelete(SL* ps, SeqlistDatatype pos)//顺序表,删除的位置
{
	assert(ps);
	assert(pos >= 0);
	assert(pos < ps->size);
	int begin = pos + 1;
	while (begin < ps->size)
	{
		ps->a[begin - 1] = ps->a[begin];
		begin++;
	}
    //这里就跟增加是一个道理,这里就相当于1423,把4删了之后要把数据迁移1233
	//然后最后一位的数据不用管,让size--,所以目前顺序表只有3位数据,第四位数据也不干涉
	ps->size--;
}

10.主函数实现以及结果展示

int main()
{
	SL sl;
	SeqlistInit(&sl);
	SeqlistPushBack(&sl, 1);
	SeqlistPushBack(&sl, 2);
	SeqlistPushBack(&sl, 3);
	SeqlistPushBack(&sl, 4);
	SeqlistPushBack(&sl, 5);
	Seqlistprint(&sl);
	SeqlistInsert(&sl, 7, 2);
	Seqlistprint(&sl);
	SeqlistDelete(&sl, 2);
	Seqlistprint(&sl);
	SeqlistDestory(&sl);
	return 0;
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值