C语言顺序表详解

顺序表是什么?

顺序表是在计算机内存中以数组的形式保存的线性表,线性表是最基本、最简单、最常用的一种数据结构。线性表中数据元素之间的关系是一对一的关系。

顺序表代码构思

创建文件

首先创建3个文件分别是一个头文件和二个源文件
在这里插入图片描述

创建结构体

在头文件 SeqLIst.h 里面写

创建一个结构体类型,typedef定义一下方便之后写代码,名字随便取

typedef int SLDataType;  //重命名

typedef struct Seqlist  
{
   
	SLDataType* a;   
	int size;        //储存有效数据
	int capacity;		//容量
}SL;

在源文件 test.c 里面写

创建一个结构体

int main()
{
   
	SL s;  //创建结构体
	
	system("pause");
	return 0;
}

初始化

在头文件 SeqLIst.h 里面写

void SeqListInit(SL* ps); //初始化

在源文件 SeqList.c 里面写

void SeqListInit(SL* ps) //初始化
{
   
	ps->a = (SLDataType*)malloc(sizeof(SLDataType)*4); //开辟内存 16字节 SLDataType是int 4字节

	if (ps->a == NULL) //如果初始化失败,就没有必要继续下去了
	{
   
		printf("申请内存失败\n");
		exit(-1); //退出
	}

	ps->size = 0;  //目前容量,因为还没有使用,所有为0
	ps->capacity = 4; //总容量
	

尾插

在头文件 SeqLIst.h 里面写

void SeqListPushBack(SL* ps, SLDataType x); //尾插

在源文件 SeqList.c 里面写

SeqListCapacity(ps);这个扩容函数先不管,后面会说

void SeqListPushBack(SL* ps, SLDataType x) //尾插
{
   
	SeqListCapacity(ps); //扩容
	
	ps->a[ps->size] = x; //size是最大有效数据就是最后一行,直接赋值
	ps->size++; //因为尾插了一个数据,所以要增加一个有效数据
}

内存扩容

在头文件 SeqList.h 里面写

void SeqListCapacity(SL* ps);  //内存不够,就扩容

在源文件 SeqList.c 里面写

如果一直插入内存就会面临一个问题,就会越界,这个时候就需要去扩容
ps->size是目前使用内存
ps->capacity是所拥有的内存
目前使用内存大于所拥有内存就需要扩容,不然就越界,程序挂掉

void SeqListCapacity(SL* ps) //扩容
{
   
	assert(ps); //断言

	if (ps->size >= ps->capacity) //内存如果不够就扩容
	{
   
		ps->capacity *= 2; //提升2被空间,防止不断申请内存
		ps->a = (SLDataType*)realloc(ps->a, sizeof(SLDataType)*ps->capacity);//申请添加内存

		if (NULL == ps->a) //扩容失败检查
		{
   
			printf("申请空间失败\n");
			exit(-1); //退出
		}
	}
}

尾删

在头文件 SeqList.h 里面写

void SeqListPopBack(SL* ps);//尾删

在源文件 SeqList.c 里面写

void SeqListPopBack(SL* ps) //尾删
{
   
	if (ps->size > 0) //不能小于零,否则变成-1就会出问题,因为如果下次要插入就等于没有插入
	{
   
		ps->size--;  //有效数据删除
	}
}

打印

写了这些代码,我们还需要看看实际效果

在头文件 SeqList.h 里面写

加上const防止修改,只需要打印就行了

void SeqListprint(const SL* ps); //打印

在源文件 SeqList.c 里面写

void SeqListprint(const SL* ps) //打印
{
   
	int i = 0;
	for (i = 0; i < ps->size; i++)
	{
   
		printf("%d ",ps->a[i
  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值