大家好,初来乍到请多关照~

最近老师给留的编程作业里有一道题让我相当困惑:题目是这个样子的:

任务描述

本关任务:

(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

测试是过了,但是我感觉我的方法很笨,(本来人就不是很聪明

顺序表元素的多种删除方式——删除重复元素和删除掉所有相同元素相关推荐

  1. mysql数据库有几种删除方式_sql有几种删除表数据的方式

    有几种删除表数据的方式? truncate.delete和drop都可以删除数据. TRUNCATE TABLE删除表中的所有行,而不记录单个行删除操作. TRUNCATE TABLE 与没有 WHE ...

  2. form表单的多种提交方式及提交前验证

    以下是本人总结处来的一些form的提交方式,网上还有别的提交方式,这里我总结了大小分为7类,其实就是三类的提交方式,若有哪里不对的,还请评论指出来,大家一起学习学习 1.无任何验证提交(最普通的提交) ...

  3. form表单的多种提交方式

    在项目开发中自己总结的form表单的集中提交方式: 1,<input type="submit"> 提交按钮提交表单. 例: <!DOCTYPE html> ...

  4. python删除字符串中重复字符_删除字符串中重复字符python 用CAD怎么画DNA反向

    用CAD怎么画DNA反向平行双螺旋结构绘螺旋线时,用选扭曲,确定顺时针. 画双头螺旋线时,第二根螺旋线底圆起点与第一根螺旋线底圆起点,可用角度分隔如180°.python去除文本中重复的字符串可有可无 ...

  5. linux 删除文件中重复,linux系统删除重复文件

    fdupes:Linux中查找并删除重复文件的命令行工具fdupes是Linux下的一个工具,它由Adrian Lopez用C编程语言编写并基于MIT许可证发行,该应用程序可以在指定的目录及子目录中查 ...

  6. oracle查询重复保留一条-删除,Oracle查询重复数据并删除,只保留一条记录

    前言 项目中,在"资源目录-在线编目"中,资源项子表存在多条重发数据,需要进行数据清理,删除重发的数据,最终只保留一条相同的数据. 操作的表名:R_RESOURCE_DETAILS ...

  7. 顺序表中删除最小值元素

    2019.6.19 数据结构2.2.3 综合应用题(1) 题目: 从顺序表中删除具有最小值的元素(假设唯一)并由函数返回被删元素的值,空出的位置由最后一个元素填补,若顺序表为空则显示出错信息并退出运行 ...

  8. 1-2、数据结构线性表之顺序表的基本操作插入、删除、遍历、初始化

    学习需要记录,更需要温习! 上一篇我们总结了什么是线性表,线性表的ADT类型,线性表的两种存储类型顺序存储结构和链式存储结构,今天正式进入线性表的顺序存储结构的总结和归纳,也就是数据结构的线性表的顺序 ...

  9. 【数据结构】—顺序表的插入、删除、查找操作

    #include <stdio.h> #include <malloc.h> #include <stdlib.h> #define InitSize 10 //默 ...

  10. 数据结构学习笔记:顺序表的删除操作及其演化题目总结

    目录 前言 例题 类似题目1 类似题目2 类似题目3 类似题目4 类似题目5 结语 前言 文章代码皆在Dev-C++ 5.11中测试,主要是总结一些方法,从而总结一些规律使自己进一步地深化学习内容,仅 ...

最新文章

  1. 如何区别一幅图像是否是黑白图像
  2. grunt live reload 配置记录
  3. ASP.NET Core 2.1 : 十五.图解路由(2.1 or earler)(转)
  4. codeforces#236_div2_A nuts 贪心
  5. F - 娜娜梦游仙境系列——多民族王国
  6. windows 10 家庭版 无法打开 gpedit.msc 解决方法
  7. background-size属性100% cover contain
  8. Optisystem软件与Matlab软件的联合数据读取
  9. 现在唯一可以得到卡巴斯基激活码的地方
  10. 手把手教使用阿里云短信接口发送短信验证码
  11. qq,微信抓句柄发送信息
  12. poi 移除图片_用poi替换ppt中的文字和图片
  13. 共享换电:车企筑垒,宁王拆墙
  14. work-stealing调度算法
  15. java检查中断_死神来了怎么判断之java线程中断
  16. ​“人工智能”初创公司所面临的问题
  17. 电脑微信关闭自动保存_微信自动保存图片怎么关闭
  18. Linux安全防护【云锁】
  19. 迭代扩展卡尔曼滤波学习
  20. 宽带计费认证系统的PPPoE认证技术

热门文章

  1. 不用微博SDK,直接使用 新浪微博 分享链接进行分享
  2. matlab内弹道程序计算,火炮内弹道求解与计算
  3. ECharts:免费,开源,超炫的可视化作品
  4. 编程中的数学理论——排列数组合数
  5. J-link V7.64C Warning : the connected probe appears to be a j-link clone报错
  6. c语言横纵坐标乘法,C语言 · 猜算式 · 乘法竖式
  7. STP理论02-BPDU(STP)
  8. 【修真院pm小课堂】详谈用户体验五要素
  9. 一个基本反相器的版图设计
  10. Ros noetic opencv4.2.0 cv_bridge 冲突 适配Opencv3.2.0完成自己的USB_Camera 跑通 Orb_slam2