C语言数据结构专题--顺序表(2:拓展 )

前言

上一节我们讲解了顺序表的原理以及它最基本功能的实现,那么本节我们书接上文,继续的往后学习,更加深入的了解顺序表(没有看过我写的顺序表1的小伙伴麻烦点击我的主页去看1)

在顺序表的指定位置插入数据

首先,我们首先需要确定这个函数需要什么参数,ps指针肯定是不可或缺的,然后我们需要一个变量去存入我们想要插入数据的位置,我们将其命名为pos;最后我们需要一个类型为 SLDataType 的变量 x ,我们在 x 变量中存入要插入的数据

在开始插入之前我们需要判断一下,ps指针一定不能是空指针;还有插入数据的位置 pos 必须是一个大于 0 的数,而且 pos 要小于有效空间 size

到这里我们就可以写出代码如下:

//在指定位置前插入数据
void SLInsert(SL* ps, int pos, SLDataType x)
{
	assert(ps);
	assert(pos >= 0 && pos < ps->size);



}

在正式的代码开始编写前,我们先来理一下这个代码的基本逻辑:

举个例子:

若数组中的空间为 6 ,数组中的有效空间个数为 4 ,我们需要在下标为 3 的地方插入 x = 6

0123

                               0                   1                    2                   3               4            5

                                                                         pos                                size

要想在 pos 前插入一个数据,那么 pos 及其以后的数据需要整体向后挪动一位,此时 pos 位置空出来了,我们需要在 pos 的位置插入数据 x = 6,同时我们要把 size 的值+1,我们并不需要遍历数组中的全部元素

我们此时就可以开始代码的编写了:

//在指定位置前插入数据
void SLInsert(SL* ps, int pos, SLDataType x)
{
	assert(ps);
	assert(pos >= 0 && pos < ps->size);
	SLCheckCapacity(ps);
	//pos后数据整体后挪
	for (int i = ps->size; i > pos; i--)
	{
		ps->arr[i] = ps->arr[i - 1];
	}
	
	ps->arr[pos] = x;
	ps->size++;

}

我们来编写一下测试代码,检查一下代码的运行是否成功

我们设插入数据为 6 ,插入到下标为 3 的位置:

void SLTest02()
{
	SL s1;
	SLInit(&s1);
	测试尾插代码
	SLPushBack(&s1, 1);
	SLPushBack(&s1, 2);
	SLPushBack(&s1, 3);
	SLPushBack(&s1, 4);
	SLPrint(s1);
	//测试指定位置前插入
	SLInsert(&s1, 3, 6);
	SLPrint(s1);

	SLDestory;


}

int main()
{
	SLTest02();
	return 0;
}

运行没有错误,我们在顺序表指定位置前插入数据的代码编写成功

在顺序表的指定位置删除数据

在删除前。我们同样需要对 ps 和 pos进行判断,判断的方法与插入数据相同

我们假设数组的 size 大小为 5,数组里的有效空间为 6 ,我们需要删除的数据下标为 3 

01234

                              0                  1                  2                 3                 4               5

                                                                     pos                                  size

在删除后,我们需要把 pos 后面的数据整体向前挪动一位,同时需要把 size--

​
//删除指定位置的数据
void SLErase(SL* ps, int pos)
{
	assert(ps);
	assert(pos >= 0 && pos < ps->size);
	
	for (int i = pos; i < ps->size - 1; i++)
	{
		ps->arr[i] = ps->arr[i + 1];
	}

	ps->size--;
}

​

代码写完后,我们再次进行测试;若原数组里面有4个元素。分别为1、2、3、4,我此时需要删除数据 4 ,他的下标为 3

void SLTest02()
{
	SL s1;
	SLInit(&s1);
	测试尾插代码
	SLPushBack(&s1, 1);
	SLPushBack(&s1, 2);
	SLPushBack(&s1, 3);
	SLPushBack(&s1, 4);
	SLPrint(s1);
	//测试删除指定位置数据
	SLErase(&s1, 3);
	SLPrint(s1);

	SLDestory;


}

int main()
{
	SLTest02();
	return 0;
}

我们可以看到,代码的实现相当完美,这样我们就顺利的完成了删除指定位置的数据的任务

顺序表的查找

我们在编写顺序表的查找前。首先需要明确查找需要用到的参数: 

ps 指针肯定是必不可少的,然后我们需要一个变量为 x ,里面存的是想要查找到的数据

int SLFind(SL* ps, SLDataType x);

查找的逻辑非常简单,我们可以很快速的写出代码:

//顺序表的查找
int SLFind(SL* ps, SLDataType x)
{
	assert(ps);
	for (int i = 0; i < ps->size; i++)
	{
		if (ps->arr[i] == x)
		{
			//此时已经找到了
			return i;
		}
	}
	//没有找到
	return -1;
}

我们在来测试一下我们写的代码:设数组里面有 1、2、3 三个元素,我们要查找出元素 1 在数组中的下标是多少

void SLTest02()
{
	SL s1;
	SLInit(&s1);
	测试尾插代码
	SLPushBack(&s1, 1);
	SLPushBack(&s1, 2);
	SLPushBack(&s1, 3);
	SLPushBack(&s1, 4);
	SLPrint(s1);
	//测试删除指定位置数据
	SLErase(&s1, 3);
	//查找数组中的元素1的下标
	SLPrint(s1);
	int find = SLFind(&s1, 1);
	if (find < 0)
	{
		printf("没有找到\n");
    }

	else 
	{
		printf("找到了,下表为%d\n", find);
	}

	SLDestory;


}

int main()
{
	SLTest02();
	return 0;
}

倘若我们需要找数据 8 ,因为此时数组里面没有数据为 8 的元素,若代码编写成功,将会提示出找不到数据的信息:

我们来修改一下代码:

void SLTest02()
{
	SL s1;
	SLInit(&s1);
	测试尾插代码
	SLPushBack(&s1, 1);
	SLPushBack(&s1, 2);
	SLPushBack(&s1, 3);
	SLPushBack(&s1, 4);
	SLPrint(s1);
	//测试删除指定位置数据
	SLErase(&s1, 3);
	//查找数组中的元素1的下标
	SLPrint(s1);
	int find = SLFind(&s1, 8);
	if (find < 0)
	{
		printf("没有找到\n");
    }

	else 
	{
		printf("找到了,下表为%d\n", find);
	}

	SLDestory;


}

int main()
{
	SLTest02();
	return 0;
}

代码完美运行,我们关于顺序表的查找功能编写也就到此结束了

结尾

关于顺序表的实现的内容到这里就全部结束了,下一节将为大家带来顺序表的应用--通讯录的编写,谢谢大家的浏览

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值