一篇文章弄懂顺序表的增删查的代码实现(C++代码讲解)

我是一个农村人,最喜欢来写C站,虽然没多少人会看,但我写的很用心

顺序表:顺序结构表示出来的线性表,线性表是逻辑结构,顺序表是线性表对应的存储结构

实现顺序表的增删查,可以分为以下几步:

第一步:首先要有顺序表,就用结构体存储数据;

/*第一步:定义结构体*/
#define MaxSize 50    //确定表的总空间大小
typedef int ElemType;    //数据类型是int,但是重命名了,方便之后更改数据类型,比如说要存储字符类型的数据,就可以直接将这里的int改成char
typedef struct {
	ElemType data[MaxSize];
	int length;    //表中存放的元素个数
}SqList;

第二步:顺序表的创建与初始化:

我随机放入了三个数据。

int main()
{
	SqList L;    //创建顺序表L
/*确定元素个数和长度*/
	L.data[0] = 1;
	L.data[1] = 2;
	L.data[2] = 3;
	L.length = 3;
    return 0;
}

第三步:编写插入操作的函数:

插入操作的理解:需要移动的数据元素从第i个开始到最后一个数据,都要向后移动一位;最后一个位置的数据对应的下标是[length-1],移动到length的位置;倒数第二个数据移动到[length-1]的位置......第i个数据对应的下标是[i-1],这个数据移动到后一个位置,即[i];变量j是对应数据的下标,将[j-1]位置赋给[j],就完成了一次移动;一直到[i-1]的值赋给[i],i-1是下标,对应的就是第i个位置,此时第i个位置刚好空出来,然后将我们要插入的值插入进去。不能理解的话可以自己画画图,最后一点要注意的是要避免越界情况的存在。

函数编写的详细过程在以下代码块中,因为是bool类型,在主函数中我们用一个bool类型的变量接收结果,再使用if判断是否插入成功。

bool ListInsert(SqList &L,int i,ElemType e)
{
    /*i的插入范围只能在第一个元素的位置和最后一个元素的后面*/
    if (i<1 || i>L.length+1) {
		return false;
	}
    /*length的长度刚好是MaxSize的时候则不能再插入数据*/
    if (L.length >= MaxSize) {
		return false;
	}
    /*第i个数据的之后的每个数据都要向后移动*/
    for (int j = L.length; j >= i; j--) {
		L.data[j] = L.data[j - 1];
	}
    /*插入数据*/
    L.data[i - 1] = e;
    /*修改length长度*/
    L.length++;
	return true;
}

第四步:编写打印函数

void Print_List(SqList &L)
{
	for (int i = 0; i < L.length; i++) {
		printf("%d ", L.data[i]);
	}
	printf("\n");
}

第五步:编写删除函数

有了插入函数理解的经验,删除函数比插入函数更容易理解,前面依然是判断删除的数据是否合理,这个数据i只能是删除第一个位置或者是最后一个位置,i的范围就是1~length;

删除了第i个位置(也就是下标是[i-1]的位置)的元素之后,将下标是[i]的元素赋到这个位置:L.data[j - 1] = L.data[j];所以初始值就是i,终值就是最后一个元素的位置length处(下标是[length-1])

bool ListDelete(SqList& L, int i)
{
	//判断i是否合法
	if (i<1 || i>L.length) {
		return false;
	}
	//移动
	for (int j = i; j < L.length; j++) {
		L.data[j - 1] = L.data[j];
	}
	L.length--;
	return true;
}

第六步:编写查找函数

这个就是普通的遍历然后判断是否相等,很简单

int ListSearch(SqList& L, ElemType i)
{
	for (int j = 0; j < L.length; j++) {
		if (L.data[j] == i) {
			return j;
		}
	}
	return -1;
}

总代码在下面:

#include<stdio.h>
#include<stdlib.h>

/*第一步:定义结构体*/
#define MaxSize 50
typedef int ElemType;
typedef struct {
	ElemType data[MaxSize];
	int length;
}SqList;

/*第四步:编写插入函数*/
bool ListInsert(SqList &L, int i, ElemType e)
{
	//不合理数据
	if (i<1 || i>L.length+1) {
		return false;
	}
	//插入就会超出空间
	if (L.length >= MaxSize) {
		return false;
	}
	//移动
	for (int j = L.length; j >= i; j--) {
		L.data[j] = L.data[j - 1];
	}
	//插入
	L.data[i - 1] = e;
	L.length++;
	return true;
}

/*第七步:编写删除函数*/
bool ListDelete(SqList& L, int i)
{
	//判断i是否合法
	if (i<1 || i>L.length) {
		return false;
	}
	//移动
	for (int j = i; j < L.length; j++) {
		L.data[j - 1] = L.data[j];
	}
	L.length--;
	return true;
}

/*第九步:编写查找函数*/
int ListSearch(SqList& L, ElemType i)
{
	for (int j = 0; j < L.length; j++) {
		if (L.data[j] == i) {
			return j;
		}
	}
	return -1;
}

/*第五步:编写打印函数*/
void Print_List(SqList &L)
{
	for (int i = 0; i < L.length; i++) {
		printf("%d ", L.data[i]);
	}
	printf("\n");
}

int main()
{
	/*第二步:结构体的创建和初始化*/
	SqList L;
	L.data[0] = 1;
	L.data[1] = 2;
	L.data[2] = 3;
	L.length = 3;
	//Print_List(L);
	/*第三步:插入操作*/
	bool ret = ListInsert(L, 2, 60);
	if (ret) {
		printf("插入成功\n");
		Print_List(L);		//1 60 2 3
	}
	else {
		printf("插入失败\n");
	}
	/*第六步:删除操作*/
	bool del = ListDelete(L, 2);
	if (del) {
		printf("删除成功\n");
		Print_List(L);//1 2 3
	}
	else {
		printf("删除失败\n");
	}
	/*第八步:查找操作*/
	int sear = ListSearch(L, 1);
	if (sear!=-1) {
		printf("找到了,数据下标是%d\n",sear);
	}
	else {
		printf("没找到\n");
	}
	return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值