如何删除顺序表中的重复单词:

(开始看内容之前容朕说一句:如果你最后怎么都运行不了你想要的结果,①我敢保证大概率是你的下标越界你的下标越界了你的下标越界了。②在我这程序里面你肯定打少了p--,少了p--,少了p--,少了p--

在一个顺序表中,所有元素都是有序着排放着,所以在遍历重复的时候就需要灵活利用下标位置。

我们拿第一个单词元素为例子,用一个临时数组存放单词,方便后面用下标和strcmp函数进行比较单词是否重复。

从第一个单词元素往后遍历,下标为0,我们用一个变量c存放该下标,在往后遍历是否有重复的时候我们不能用这个变量,(这里看不懂的先不解释,我后面会说)。这时候我们继续定义一个变量p存放c+1c位置的后继,也就是c下标的下一个单词元素下标,这时候我们就进入遍历重复的操作,p不断通过自增的操作往后搜寻重复的单词元素

当遇到一个重复的单词元素,再定义一个变量gt存放当前p的下标,在该位置用gt来对顺序表进行删除操作,该位置往后的元素都把前趋覆盖掉,也就当前位置的后面每一个元素都往前移动一步,就实现了对该位置上元素的覆盖,也就是对该单词实行了删除操作。

如果p还没有到末尾,也就是第一个单词还没有把所有的元素比较完,p后面可能还要重复的单词,所以这时候回到p当前的位置,继续向前比较,若遇到相同单词继续重复上述删除操作,直到p到了顺序表的最末端就退出。

退出之后就表示第一个单词已经完全把和它重复的单词删除完毕,这时候就要用到c了,c还存放着是第一个单词元素下标0,我们对他进行自增操作,来到了第二个单词元素,这样我们又对他进行上述一系列操作,直到倒数第二个为止

为什么是倒数第二个??

原因1:你其实到了倒数第二个的时候p背赋值为c+1,也就是已经把末端和倒数第二个进行了比较了,最后一个得后面也没有后继,无法再继续比较了。

原因2:如果细心点就会发现我们的p是被赋值为c+1,如果我们直到c等于末端才结束,那造成了越界,调试的时候在该地方会提示你在该代码段会有内存泄漏,程序运行不出结果,但是编译不会出错,只有你调试的时候会提示你。

程序需要很严密的逻辑,不能对下标有任何模糊的使用,稍不注意就会造成下标的越界,代码段出错,还有一个需要重点关注的地方是当你把元素往前覆盖完成后,要回到该位置,所以我在完成覆盖操作之前把p--了,因为我一出去就要p++,如果不减一,出去之后就不是该位置,而是当前位置的后继。

为什么一定要回到这个位置呢??

因为你遇到相同单词的这个位置是被删除掉的,当前位置存放的已经不是你之前那个单词,是用后继覆盖掉的单词,万一这个单词还是重复的单词呢,你就删除不了了,因为你出去就p++,已经到了该位置的后继。

下面放函数代码

需要各位根据自己的程序进行改动,我仅提供方法,我用的变量名都是英语,可以翻译出来,大概能懂意思,上述中提到的变量p、c、gt我也用上了,方便各位阅读。

这是我宏定义的结构体和变量,以免看不懂我后面的代码意思。

!!但是这不能直接用的,因为在这之前我是已经把顺序表存好了单词和计算好了长度!!

/*顺序表*/

int F_link_len, F_maxword_len; //存放数组的顺序表的空间大小和最长单词的长度 

typedef struct _Elem{
char *word;//存放单词
int lenth;//后面用F_link_len计算好长度后直接赋值给lenth作为顺序表长度
}Elem; typedef struct _Elemlink{
Elem *array;//动态定义数组
int link_len;//数组长度
}Elemlink; Elemlink *Sqlink_Firefox = NULL;

这是删除顺序表中重复单词元素具体实现操作:

char cmp[F_maxword_len+1];//加一避免空间越界
int c = 0, p, start = -1, gt;//c一定要先赋值为0下标 while(1)
{
strcpy(cmp, Sqlink_Firefox->array[c].word);
//先对两个辅助变量赋值好
p = c+1;
while(1)
{ //如果是遇到最后一个才发现是相同的单词那就直接把数组长度减一
if(strcmp(cmp, Sqlink_Firefox->array[p+1].word) == 0 && p+1 == F_link_len - 1) F_link_len--; //表示找到相同的 ,先从该位置进行向前移动,之后回到p+1 的位置进行再次寻找是否有相同的
if(strcmp(cmp, Sqlink_Firefox->array[p].word) == 0 && p < F_link_len - 1)
{
gt = p;//记录从这个地方开始有重复,但是还要继续判断该位置后面的元素是否还有重复,所以先把下标记录下来
while(1)
{
strcpy(Sqlink_Firefox->array[gt].word, Sqlink_Firefox->array[gt+1].word);
if(gt < F_link_len-1) gt++;//继续移动位置
if(gt == F_link_len-1) break;//若到了最后一个位置就退出该循环
}
F_link_len--;//数组元素个数减一
p--;//因为下面我是p++,为了让p回到原本那个位置,我先减一再加一,就是原来遇到相同单词的那个位置
}
p++;
if(p >= F_link_len - 1) break;//表示已经全部遍历完成 ,同时判断进来的p是否已经到末尾了
} c++;
if(c == F_link_len-1) break; }

C语言:删除顺序表中重复的信息—(删除顺序表中重复的单词)的更多相关文章

  1. oracle中查询表的信息,包括表名,字段名,字段类型,主键,外键唯一性约束信息

    来源于网上整理 总结了一下oracle中查询表的信息,包括表名,字段名,字段类型,主键,外键唯一性约束信息,索引信息查询SQL如下,希望对大家有所帮助: 1.查询出所有的用户表select * fro ...

  2. PostgreSQL:查询元数据(表 、字段)信息、库表导入导出命令

    一.查询表.模式及字段信息 1.查询指定模式下的所有表 select tablename,* from pg_tables where schemaname = 'ods'; 2.查询指定模式下的表名 ...

  3. ArcGIS中删除“点”附带的对应“文本信息”

    现状: 用ArcMap打开对应的.mxd文件,导入KML数据后,几何类型“点” - 每一个点都附带对应的文本信息“Placemark”,如下图: 问题:ArcGIS中如何 删除“点”附带的对应“文本信 ...

  4. 如何删除GIT仓库中的敏感信息

    如何删除GIT仓库中的敏感信息 正常Git仓库中应该尽量不包含数据库连接/AWS帐号/巨大二进制文件,否则一旦泄漏到Github,这些非常敏感信息会影响客户的信息安全已经公司的信誉.公司可能其它还有相 ...

  5. Python之向日志输出中添加上下文信息

    除了传递给日志记录函数的参数(如msg)外,有时候我们还想在日志输出中包含一些额外的上下文信息.比如,在一个网络应用中,可能希望在日志中记录客户端的特定信息,如:远程客户端的IP地址和用户名.这里我们 ...

  6. 【转】Python之向日志输出中添加上下文信息

    [转]Python之向日志输出中添加上下文信息 除了传递给日志记录函数的参数(如msg)外,有时候我们还想在日志输出中包含一些额外的上下文信息.比如,在一个网络应用中,可能希望在日志中记录客户端的特定 ...

  7. Python 日志输出中添加上下文信息

    Python日志输出中添加上下文信息 除了传递给日志记录函数的参数(如msg)外,有时候我们还想在日志输出中包含一些额外的上下文信息.比如,在一个网络应用中,可能希望在日志中记录客户端的特定信息,如: ...

  8. [Android Pro] 查看 keystore文件的签名信息 和 检查apk文件中的签名信息

    1: 查看 keystore文件的签名信息 keytool -list -v -keystore keystoreName -storepass keystorePassword 2: 检查apk文件 ...

  9. 在Scrapy中如何利用Xpath选择器从HTML中提取目标信息(两种方式)

    前一阵子我们介绍了如何启动Scrapy项目以及关于Scrapy爬虫的一些小技巧介绍,没来得及上车的小伙伴可以戳这些文章: 手把手教你如何新建scrapy爬虫框架的第一个项目(上) 手把手教你如何新建s ...

  10. oracle中的rowid--伪列-删除表中的重复内容-实用

    1.rowid是一个伪列,是用来确保表中行的唯一性,它并不能指示出行的物理位置,但可以用来定位行. 2.rowid是存储在索引中的一组既定的值(当行确定后).我们可以像表中普通的列一样将它选出来. 3 ...

随机推荐

  1. 如何知道 window 的 load 事件已经触发

    背景 为了使页面加载更快,常常将一些不重要的第三方脚本在页面完成加载后进行懒加载. // 做一些不影响业务的事情 window.addEventListener('load', () => { ...

  2. OpenHarmony页面级UI状态存储:LocalStorage

      LocalStorage是页面级的UI状态存储,通过@Entry装饰器接收的参数可以在页面内共享同一个LocalStorage实例.LocalStorage也可以在UIAbility内,页面间共享 ...

  3. HarmonyOS Lottie组件,让动画绘制更简单

    原文:https://mp.weixin.qq.com/s/eC7g9ya4f_2AiNgteiyXcw,点击链接查看更多技术内容. 动画是UI界面的重要元素之一,精心设计的动画能使UI界面更直观,有 ...

  4. 简单写一个eventbus

    前言 闲暇之余,简单写一个eventbus. 正文 什么是eventbus? eventbus 是一个开源的发布订阅模式的框架,用于简化程序间不同组件的通信. 它允许不同组件间松耦合通信,组件之间不通 ...

  5. ElasticSearch 7.7 + Kibana的部署

    ElasticSearch目前最新版是7.7.0,其中部署的细节和之前的6.x有很多的不同,所以这里单独拉出来写一下,希望对用7.x的童鞋有一些帮助,然后部署完ES后配套的kibana也是7.7.0, ...

  6. 在Windows电脑上快速运行AI大语言模型-Llama3

    概述 近期 Meta 发布了最新的 Llama3 模型,并开源了开源代码.Meta Llama 3 现已推出 8B 和 70B 预训练和指令调整版本,可支持广泛的应用程序. 并且 Llama 3 在语 ...

  7. Thinkphp5.x全漏洞复现分析

    基础知识 命名空间和子命名空间 我们可以把namespace理解为一个单独的空间,事实上它也就是一个空间而已,子命名空间那就是空间里再划分几个小空间,举个例子: <?php namespace ...

  8. docker containerd runc containerd-shim等组件的关系

    早期 kubelet 创建容器工作原理 因为 docker 出生的比 k8s 早,所以 k8s 早期的容器运行时都是基于 docker 的,kubelet 通过 docker 的 api 创建容器.后 ...

  9. Serverless 架构下的 AI 应用开发:入门、实战与性能优化

    简介: 本章通过对 Serverless 架构概念的探索,对 Serverless 架构的优势与价值.挑战与困境进行分析,以及 Serverless 架构应用场景的分享,为读者介绍 Serverles ...

  10. 最佳实践|从Producer 到 Consumer,如何有效监控 Kafka

    简介: 对于运维人而言,如何安装维护一套监控系统,或如何进行技术选型,从来不是工作重点.如何借助工具对所需的应用.组件进行监控,发现并解决问题才是重中之重.随着 Prometheus 逐渐成为云原生时 ...