顺序表元素的多种删除方式——删除重复元素和删除掉所有相同元素
大家好,初来乍到请多关照~
最近老师给留的编程作业里有一道题让我相当困惑:题目是这个样子的:
任务描述
本关任务:
(1)使用将顺序表L中值为x的数据元素替换为y;
(2)此处假设线性表中的元素用于表示集合,不考虑线性表中元素的位置,移除线性表中的所有重复元素;不要使用额外的数组空间,必须在原地修改输入数组 并在使用 O(1) 额外空间的条件下完成。
第一个替换元素的代码很简单,直接遍历顺序表里的元素,如果相同将其赋值为目标元素。
以下为replace_seq函数的代码:
void replace_seq(PseqList L, int x, int y)
{//将顺序表L中值为x的数据元素替换为yfor (int i = 0; i < L->curNum; i++){if (L->element[i] == x){L->element[i] = y;}}
}
PseqList L是一个顺序表,以下为顺序表的相关定义:
typedef int DataType;
struct seqList
{//有3个数据成员int MAXNUM;//用于记录顺序线性表中能存放的最大元素个数的 整型 MAXNUM int curNum;//用于存放顺序线性表中数据元素的个数 整型 curNumDataType* element;//用于存放顺序线性表数据元素的连续空间的起始地址
};typedef struct seqList* PseqList;
typedef struct seqList* PNode;
当我看到第二问,刚开始,我以为他是这个意思:
所以我jio的:
如果要删除重复出现的元素话,那就用两个循环外循环从头 i=0 开始遍历,内循环从 i+1 开始遍历,一旦发现重复,则用删除元素的代码直接删除掉这个元素就好啦 (好轻松啊~♂)
以下为两个删除函数,按照下标位置删除和输入目标值删除重复元素
int delete_seq(PseqList L, int x)
{//在顺序表L中删除与参数x值相同的数据元素,返回删除数据元素的个数//可以使用之前已完成的操作int m = 0;for (int n = 0; n < L->curNum; n++){if (L->element[n] == x){deletePos_seq(L, n);m++; }}return m;
}int deletePos_seq(PseqList L, int pos)
{//在顺序表L中删除与下标pos处的数据元素,若pos非法,则返回-1;否则返回1if (pos<0 || pos>(L->curNum)){return -1;}else{for (int q = pos; q < L->curNum-1; q++){L->element[q] = L->element[q+1];}L->curNum = L->curNum - 1;return 1;}
}
所以那么我的第一个错误的想法实践应该为:
void delDuplicate_seq(PseqList L)
{//移除线性表中的所有重复元素;不要使用额外的数组空间,必须在原地修改输入数组 并在使用 O(1) 额外空间的条件下完成//使用常规删除即可,已修改测试用例for (int i = 0; i < L->curNum; i++)for (int k = i + 1; k < L->curNum; k++)if (L->element[i] == L->element[k])deletePos_seq(L, int k);
}
但是它的输出结果并不是我想的那样,当重复值为两个的时候它的运行结果总是正确的:
输入:1 2 3 3 2 1 4 4 5 5
输出:1 2 3 4 5
但是当重复值为三个以上的时候,它的运行结果出乎意料:
输入:2 2 2 3 3 3
输出:2 2 3 3
原来它只可以删除一次!
但是为什么呢?我不禁陷入了沉思......
因此我们要修改k的值,保证它在删除掉一个重复值之后退回到原来的元素位置,这样我们才可以保证它会遍历比较所有的元素。
void delDuplicate_seq(PseqList L)
{//移除线性表中的所有重复元素;不要使用额外的数组空间,必须在原地修改输入数组 并在使用 O(1) 额外空间的条件下完成//使用常规删除即可,已修改测试用例for (int i = 0; i < L->curNum; i++)for (int k = i + 1; k < L->curNum; k++)if (L->element[i] == L->element[k]){deletePos_seq(L, int k); k--;}}
输入:1 2 2 8 1 5 5 5 9 2
输出:1 2 8 5 9
这样我们就可以删除掉所有的重复值啦~
当时我兴高采烈的的点击提交时,我发现的的测试案例并没有通过,仔细一剖析案例,人傻了都....
原来是要删除掉所有的重复出现的元素!
悲伤,失望,懊悔瞬间涌上心头......(((φ(◎ロ◎;)φ)))
我被卡这里了!
但是我是不会服输哒!于是我便急匆匆的打开CSDN看看大佬们是怎么解决的,浏览过后我发现大多的删除案例都是删除重复的数字,可是要怎么删除第一次被重复的那个值呢?我思索了好久,题目规定是不可以用额外的数组空间的,(但是因为时间快要截止了,所以我当时就抱着试一试的想法去修改了一下)我打算要循环两个大循环,首先定义一个数组,在第一次循环时将被重复的值记录到一个数组中,同时利用temp值以便删除时的计数。不会进行删除操作。第二次循环会删掉重复的元素,运行到这里我们的结果仅仅是删除掉重复值,被重复值是仍然存在的,所以我们还要删除掉那个数组里保存的所有被重复元素,这样就会得到我们想要的结果。
void delDuplicate_seq2(PseqList L)
{//移除线性表中的所有重复元素;不要使用额外的数组空间,必须在原地修改输入数组 并在使用 O(1) 额外空间的条件下完成//使用常规删除即可,已修改测试用例int num = L->curNum;int a[20] = { };int temp = 0;for (int i = 0; i < L->curNum; i++){for (int k = i + 1; k < L->curNum; k++){if (L->element[i] == L->element[k]){ a[temp] = L->element[i];temp++;break;}}}for (int i = 0; i < L->curNum; i++){for (int k = i + 1; k < L->curNum; k++){if (L->element[i] == L->element[k]){deletePos_seq(L, k);k--;}}}for (int k = 0; k <num ; k++){for (int m = 0; m < temp; m++)delete_seq(L, a[m]);}
}
输入:1 1 1 1 1
输出:
输入:5 5 5 6 7 1 2 7 6 10
输出:1 2 10
测试是过了,但是我感觉我的方法很笨,(本来人就不是很聪明
顺序表元素的多种删除方式——删除重复元素和删除掉所有相同元素相关推荐
- mysql数据库有几种删除方式_sql有几种删除表数据的方式
有几种删除表数据的方式? truncate.delete和drop都可以删除数据. TRUNCATE TABLE删除表中的所有行,而不记录单个行删除操作. TRUNCATE TABLE 与没有 WHE ...
- form表单的多种提交方式及提交前验证
以下是本人总结处来的一些form的提交方式,网上还有别的提交方式,这里我总结了大小分为7类,其实就是三类的提交方式,若有哪里不对的,还请评论指出来,大家一起学习学习 1.无任何验证提交(最普通的提交) ...
- form表单的多种提交方式
在项目开发中自己总结的form表单的集中提交方式: 1,<input type="submit"> 提交按钮提交表单. 例: <!DOCTYPE html> ...
- python删除字符串中重复字符_删除字符串中重复字符python 用CAD怎么画DNA反向
用CAD怎么画DNA反向平行双螺旋结构绘螺旋线时,用选扭曲,确定顺时针. 画双头螺旋线时,第二根螺旋线底圆起点与第一根螺旋线底圆起点,可用角度分隔如180°.python去除文本中重复的字符串可有可无 ...
- linux 删除文件中重复,linux系统删除重复文件
fdupes:Linux中查找并删除重复文件的命令行工具fdupes是Linux下的一个工具,它由Adrian Lopez用C编程语言编写并基于MIT许可证发行,该应用程序可以在指定的目录及子目录中查 ...
- oracle查询重复保留一条-删除,Oracle查询重复数据并删除,只保留一条记录
前言 项目中,在"资源目录-在线编目"中,资源项子表存在多条重发数据,需要进行数据清理,删除重发的数据,最终只保留一条相同的数据. 操作的表名:R_RESOURCE_DETAILS ...
- 顺序表中删除最小值元素
2019.6.19 数据结构2.2.3 综合应用题(1) 题目: 从顺序表中删除具有最小值的元素(假设唯一)并由函数返回被删元素的值,空出的位置由最后一个元素填补,若顺序表为空则显示出错信息并退出运行 ...
- 1-2、数据结构线性表之顺序表的基本操作插入、删除、遍历、初始化
学习需要记录,更需要温习! 上一篇我们总结了什么是线性表,线性表的ADT类型,线性表的两种存储类型顺序存储结构和链式存储结构,今天正式进入线性表的顺序存储结构的总结和归纳,也就是数据结构的线性表的顺序 ...
- 【数据结构】—顺序表的插入、删除、查找操作
#include <stdio.h> #include <malloc.h> #include <stdlib.h> #define InitSize 10 //默 ...
- 数据结构学习笔记:顺序表的删除操作及其演化题目总结
目录 前言 例题 类似题目1 类似题目2 类似题目3 类似题目4 类似题目5 结语 前言 文章代码皆在Dev-C++ 5.11中测试,主要是总结一些方法,从而总结一些规律使自己进一步地深化学习内容,仅 ...
最新文章
- 如何区别一幅图像是否是黑白图像
- grunt live reload 配置记录
- ASP.NET Core 2.1 : 十五.图解路由(2.1 or earler)(转)
- codeforces#236_div2_A nuts 贪心
- F - 娜娜梦游仙境系列——多民族王国
- windows 10 家庭版 无法打开 gpedit.msc 解决方法
- background-size属性100% cover contain
- Optisystem软件与Matlab软件的联合数据读取
- 现在唯一可以得到卡巴斯基激活码的地方
- 手把手教使用阿里云短信接口发送短信验证码
- qq,微信抓句柄发送信息
- poi 移除图片_用poi替换ppt中的文字和图片
- 共享换电:车企筑垒,宁王拆墙
- work-stealing调度算法
- java检查中断_死神来了怎么判断之java线程中断
- ​“人工智能”初创公司所面临的问题
- 电脑微信关闭自动保存_微信自动保存图片怎么关闭
- Linux安全防护【云锁】
- 迭代扩展卡尔曼滤波学习
- 宽带计费认证系统的PPPoE认证技术
热门文章
- 不用微博SDK,直接使用 新浪微博 分享链接进行分享
- matlab内弹道程序计算,火炮内弹道求解与计算
- ECharts:免费,开源,超炫的可视化作品
- 编程中的数学理论——排列数组合数
- J-link V7.64C Warning : the connected probe appears to be a j-link clone报错
- c语言横纵坐标乘法,C语言 · 猜算式 · 乘法竖式
- STP理论02-BPDU(STP)
- 【修真院pm小课堂】详谈用户体验五要素
- 一个基本反相器的版图设计
- Ros noetic opencv4.2.0 cv_bridge 冲突 适配Opencv3.2.0完成自己的USB_Camera 跑通 Orb_slam2