数据结构【顺序表的插入与删除(静态分配)】【二】

顺序表的插入与删除(静态分配)

顺序表的插入(静态分配)
逻辑结构图示

在这里插入图片描述

  • 由图可知,在顺序表的某个位置插入数据,后面的数据需要依次向后移动一个位置,然后把所需要插入的数据插入到所指定的位置
头文件以及定义初始值
#include <stdio.h>
#define Maxsize 10 //数组所存放的数据最大数量
定义顺序表
typedef struct {
	int data[Maxsize];//用静态的数组存放数据
	int length; //顺序表的长度
}SeqList;
初始化顺序表
void InitList(SeqList* L) {
	L->length = 0;
}
  • 因为此次代码是基于静态数组来存放的,所以不需要开辟空间,只需要对顺序表的长度进行初始化
插入元素
// 插入元素
int ListInsert(SeqList* L, int i, int e) {
    //判断插入位置是否合法
	if (i<1 || i>L->length + 1)
	{
		return 0;
	}
	if (L->length>=Maxsize)
	{
		return 0;
	}
    //顺序表元素依次向后移动一位
	for (int j = L->length; j >= i; j--)
	{
		L->data[j] = L->data[j - 1];
	}
	L->data[i - 1] = e; //传进来的是数组的第几个元素,插入的时候是按照下标插入,所以这里一定要注意减1
	L->length++; //数组内元素个数加1,长度加1
	return 1;
}
原理图

在这里插入图片描述

测试代码
int main()
{
	SeqList L;
	InitList(&L);
	//向顺序表中插入几个元素
	int i = 0;
	for (i = 0; i < 7; i++)
	{
		L.data[i] = i + 1;
		L.length++;
	}
	//查看顺序表中的数据
	for (i = 0; i < L.length; i++)
	{
		printf("%d ", L.data[i]);
	}
	int result = ListInsert(&L, 3, 10);
	if (result)
	{
		printf("\n可以插入元素,插入后的元素遍历结果\n");
	}
	for (i = 0; i < L.length; i++)
	{
		printf("%d ", L.data[i]);
	}
	return 0;
}
运行结果

在这里插入图片描述

完整代码
//定义一个顺序表
#define Maxsize 10
typedef struct {
	int data[Maxsize];//用静态的数组存放数据
	int length;
}SeqList;
void InitList(SeqList* L) {
	L->length = 0;
}
// 插入元素
int ListInsert(SeqList* L, int i, int e) {
	if (i<1 || i>L->length + 1)
	{
		return 0;
	}
	if (L->length>=Maxsize)
	{
		return 0;
	}
	for (int j = L->length; j >= i; j--)
	{
		L->data[j] = L->data[j - 1];
	}
	L->data[i - 1] = e;
	L->length++;
	return 1;
}
int main()
{
	SeqList L;
	InitList(&L);
	//向顺序表中插入几个元素
	int i = 0;
	for (i = 0; i < 7; i++)
	{
		L.data[i] = i + 1;
		L.length++;
	}
	//查看顺序表中的数据
	for (i = 0; i < L.length; i++)
	{
		printf("%d ", L.data[i]);
	}
	int result = ListInsert(&L, 3, 10);
	if (result)
	{
		printf("\n可以插入元素,插入后的元素遍历结果\n");
	}
	for (i = 0; i < L.length; i++)
	{
		printf("%d ", L.data[i]);
	}
	return 0;
}
顺序表的删除(静态分配)
逻辑结果图示

在这里插入图片描述

3.2头文件以及定义初始值
#include <stdio.h>
#define MaxSize 10
定义顺序表(静态分配)
typedef struct {
	int data[MaxSize];
	int lengh;
} seqList;
初始化顺序表
void InitList(seqList* L)
{
	L->lengh = 0;
}
顺序表元素的删除操作
int deleteList(seqList* L, int i, int* e)
{
	//判断删除位置是否合法
	if (i<1 || i>L->lengh)
	{
		return 0;
	}
	//将将要删除元素赋值给e
	*e = L->data[i - 1];
	int j = 0;
	for (j = i; j < L->lengh; j++)
	{
		L->data[j - 1] = L->data[j];
	}
	L->lengh--;
	return 1;
}
原理图

在这里插入图片描述

测试代码
int main()
{
	//声明一个顺序表
	seqList L;
	//初始化顺序表
	InitList(&L);
	//插入10个数据
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		L.data[i] = i + 1;
		L.lengh++;
	}
	//查看顺序表
	printf("删除前的结果如下:顺序表的长度为:%d\n", L.lengh);
	for (i = 0; i < L.lengh; i++)
	{
		printf("%d ", L.data[i]);
	}
	//删除数据表中某个位置的某个元素 删除第三个位置的元素并返回该元素
	int e = -1;
	int result = deleteList(&L,3,&e);
	//判断是否删除成功
	if (result)
	{
		//返回1表示删除成功
		printf("\n删除元素成功,删除的元素为:%d\n", e);
	}
	else
	{
		printf("\n删除元素位置不合法,删除失败");
	}

	//遍历删除后的结果
	printf("删除后的结果如下:顺序表的长度为:%d\n",L.lengh);
	for (i = 0; i < L.lengh; i++)
	{
		printf("%d ", L.data[i]);
	}
	return 0;
}
运行结果

在这里插入图片描述

完整代码
#include <stdio.h>
#define MaxSize 10
typedef struct {
	int data[MaxSize];
	int lengh;
} seqList;
void InitList(seqList* L)
{
	L->lengh = 0;
}
int deleteList(seqList* L, int i, int* e)
{
	//判断删除位置是否合法
	if (i<1 || i>L->lengh)
	{
		return 0;
	}
	//将将要删除元素赋值给e
	*e = L->data[i - 1];
	int j = 0;
	for (j = i; j < L->lengh; j++)
	{
		L->data[j - 1] = L->data[j];
	}
	L->lengh--;
	return 1;
}
int main()
{
	//声明一个顺序表
	seqList L;
	//初始化顺序表
	InitList(&L);
	//插入10个数据
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		L.data[i] = i + 1;
		L.lengh++;
	}
	//查看顺序表
	printf("删除前的结果如下:顺序表的长度为:%d\n", L.lengh);
	for (i = 0; i < L.lengh; i++)
	{
		printf("%d ", L.data[i]);
	}
	//删除数据表中某个位置的某个元素 删除第三个位置的元素并返回该元素
	int e = -1;
	int result = deleteList(&L,3,&e);
	//判断是否删除成功
	if (result)
	{
		//返回1表示删除成功
		printf("\n删除元素成功,删除的元素为:%d\n", e);
	}
	else
	{
		printf("\n删除元素位置不合法,删除失败");
	}

	//遍历删除后的结果
	printf("删除后的结果如下:顺序表的长度为:%d\n",L.lengh);
	for (i = 0; i < L.lengh; i++)
	{
		printf("%d ", L.data[i]);
	}
	return 0;
}

本次的博客内容就到这里了,如果本篇博客对您有帮助的话还请一键三连,您的支持就是我的最大动力啊!!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值