顺序表操作

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

  • 10
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值