首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >数据结构 || 顺序表

数据结构 || 顺序表

作者头像
用户10271432
发布2022-12-19 14:30:22
发布2022-12-19 14:30:22
5570
举报

🧗‍♂️本专栏将不断更新数据结构相关的代码演示,喜欢可以关注一下作者。 🛹本文是对数据结构的顺序表的删除指定若干个元素算法的演示。

文章目录


前言

书本上中的DeleteK算法是

代码语言:javascript
复制
Status DeleteK(SqList&a,int i ,int k){
	if(i<1||k<0||i+k>a.length)return INFEEASIBLE;
	else{
		for(count = 1;count<k;count++){
			//删除一个元素
			for(j = a.length;j>=i+1;j--){
				a.elem[j-1] = a.elem[j]; 
			} 
			a.length--;
		}
	} 
	return OK;
}

本文的主要目的是修改书本上的代码,因为书中要求的是修改代码。

1.代码存在逻辑错误,即算法的设计思路不能完美实现删除的需求。 2.算法的效率很低,会浪费很多的时间。


一、顺序表的删除元素

1.1 书中的算法

代码语言:javascript
复制
	for(count = 1;count<k;count++){
			//删除一个元素
			for(j = a.length;j>=i+1;j--){
				a.elem[j-1] = a.elem[j]; 
			} 
			a.length--;
		}

a.elem[j-1] = a.elem[j] //算法出错的位置

1.2举例说明

假定我们初始的顺序表中的元素为 1 2 3 4 5 DeleteK函数中传递的参数为DeleteK(L,1,2)

得到的初始顺序表如下

第一步count = 1,执行for循环操作后,顺序表就长成了这样,再接着执行for循环的操作的话,我们

期望得到的是,这样的一个顺序表

但是实际上得到的是这样子的一个顺序表。原因是为什么呢?请读者自己思考哦!😂😂😂😂

我们先来测试一下,来证明我们所说的没有问题。 输入一个1 2 3 4 5,得到一个顺序表1 2 3 4 5 输入想要删除的第i个元素的后k个元素,i,k。 输出最后的顺序表,如图所示

2.1 删除算法的改进

代码语言:javascript
复制
Status DeleteK(SqList &a,int i ,int k){
	//本过程中顺序存储结构的线性表a中删除第i个元素起的k个元素
	if(i<1||k<0||i+k>a.length)return INFEASIBLE;//参数不合法
	else{
		int j = i+k-1;
		for(i;i<=j;i++){
			//删除第一个元素
			a.elem[i] = a.elem[i+k];
		}
		a.length = a.length-k;
	} 
	return OK;
} 

二、代码

全部代码

代码语言:javascript
复制
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
#define INFEASIBLE -1
#define OVERFLOW -2
#define ERROR 0
#define OK 1
typedef  int ElemType;
typedef int Status;

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

typedef struct {
	ElemType *elem;		    //存储空间基址
	int length;				//当前长度
	int listsize;			//当前分配的存储容量 
}SqList;					//顺序表类型

Status InitList_Sq(SqList &L){
	//构造一个空的线性表
	L.elem = (ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
	if(!L.elem)exit(OVERFLOW);		//存储分配失败
	L.length = 0;					//空格长度为0 
	L.listsize = LIST_INIT_SIZE; 	//初始存储容量
	return OK; 
} //InitList_Sq

Status DeleteK(SqList &a,int i ,int k){
	//本过程中顺序存储结构的线性表a中删除第i个元素起的k个元素
	if(i<1||k<0||i+k>a.length)return INFEASIBLE;//参数不合法
	else{
		int j = i+k-1;
		for(i;i<=j;i++){
			//删除第一个元素
			a.elem[i] = a.elem[i+k];
		}
		a.length = a.length-k;
	} 
	return OK;
} 

int main(){
	SqList L;
	InitList_Sq(L); 
	int n; 
	int x;
	int k; 
	printf("请输入链表的长度");
	scanf("%d",&n);
	printf("请输入链表中的元素:"); 
	for(int i = 0;i<n;i++){
		scanf("%d",&L.elem[i]);
		L.length++;
	}
	printf("初始化L的长度%d\n",L.length);
	printf("请输入你想要删除的是第几个元素之后的多少个元素");
	scanf("%d %d",&x,&k);
	DeleteK(L,x,k);	
	for(int i = 0;i<n;i++){
		printf("%d ",L.elem[i]);
	}
	printf("删除后L的长度%d\n",L.length);
	for(int i = 0;i<L.length;i++){
		printf("%d ",L.elem[i]);
	}
}

总结

顺序表实际上就类似于c语言的数组,通过本文的学习,学会了制作一个简单的算法来正确删除指定位置的元素。希望你可以学到哦

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-10-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 前言
  • 一、顺序表的删除元素
  • 1.1 书中的算法
  • 1.2举例说明
  • 2.1 删除算法的改进
  • 二、代码
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档