C语言:将txt文件的单词导入链表&&删除链表重复单词
文章目录
前言
主要分为两个实现部分,按个人需求浏览
可以在目录中找到对应位置进行浏览。
1:将文件单词导入链表
2:删除链表重复的单词内容
首先明确几个任务
我们下面用链表存储txt文件中单词作为内容进行去重,学会了这个操作之后应该对其他内容形式的存储也会得心应手,只要修改一下存储的内容形式是什么就可以,主要是代码思想的重要性。
下面的几个任务对应的函数我在文章后面都会详细解释。
①需要一个寻找txt文件中最长单词的函数。
( 可以跳转置下面博客链接,在本篇文章中我就不再赘述了,里面写得比较详细。##如何找到txt文件中最长单词## )
③需要一个导入文件单词函数
④需要一个去除重复单词内容的函数
先过一遍如何操作的流程。
第一步:首先找到文件中最长单词的长度
第二步:按照该长度进行分配空间,就可以把每一个单词都装下
(这个方法比较耗费空间,留白给大家自行优化喔~)
第三步:分配工作完成后就可以直接把文件中的所有单词导入到单链表中
第四步:把单链表中重复的单词删除掉
①全局变量和结构体代码部分
以下是全局变量 ↓
- 如果你不想定义全局变量,那么你需要在函数参数里面添加多几个参数,在用函数的时候把这些变量传进来进行操作,这样也可以实现。
//用于Find_MAXword函数,具体的解释跳转我的另一篇博客
char FindMAXword[50];
/*辅助功能,用来临时存放最长的单词,
因为在函数内部定义想要返回数组就会造成内存泄漏*/
int C_link_len, C_maxword_len;
//存放数组的顺序表的空间大小和最长单词的长度
/*单词单链表*/
struct Wordc{
char *s;
int num;
struct Wordc *next;
};
struct Wordc *L2 = NULL;
②实现:将文件单词导入链表
a: 寻找txt文件中最长单词的函数
b: 导入文件单词函数
#以下用到的函数包含在ctype.h函数里面,用之前记得包含该头文件#
isalpha函数:判断字符是否为函数
isupper函数:判断是否为大写字母
tolower函数:把字母转换为小写字母
具体代码思想:
if 遇到是字母就继续录入,一个一个字符进行录入,进入后如果是大写字母就将该字符进行转换成为小写字母。
start是表示你现在是进行ing录入单词,当遇到不是单词的时候就else if,这里的start就发挥了作用,如果不是等于1的话就不会进入,这样的好处是防止了txt文件中有一些内容根本就不是字母形式,以防录入不必要的信息,进入else if 后首先把start赋值为-1,因为这时候已经是代表一个单词的录入完成了,要对下一个单词进行录入。
接下来就可以正常的进行开辟链表节点空间,这里是基本的尾插法,就不作详细解释了。
比较重要的点: 咱的表头是链表指针,所以传进来的第一个链表参数就必须是二级指针。
void saveword_to_L2(struct Wordc **L2, FILE *fp)//保存到链表中
{
char ch;
struct Wordc *newWord;
struct Wordc *temp = (*L2);
int index = 0, n = 0, start = -1;
while(!feof(fp))
{
ch = fgetc(fp);
if(isalpha(ch))
{
if(isupper(ch))
{
ch = tolower(ch);
}
start = 1;
temp->s[n] = ch;
n++;
}
else if(start == 1)
{
start = -1;
temp->s[n] = '\0';//变成字符串单词
newWord = (struct Wordc*)malloc(sizeof(struct Wordc));
newWord->s = (char*)malloc(sizeof(char)*C_maxword_len+1);//不能漏了这一步
temp->next = newWord;
newWord->next = NULL;
temp = newWord;//移动到尾部
n = 0;
}
}
}
③实现:删除链表重复的单词内容
看我我博客的人看到这个代码块肯定窃喜了,因为这和学生信息的增删的部分代码思想是一模一样的。但是我在这还是要再解释一下哈。
1:首先我们需要一个前趋指针和后继指针,就是分别用来存放链表中某一个节点的前面的空间和后面一个空间的地址,所以叫前趋和后继,很显然,头指针是没有前趋,尾指针没有后继。
2:我们还需要另一个临时指针用来遍历当前位置下,后面的所有链表空间,简单的来说:你在排队的时候你想看看排在你后面的人有没有你认识的,但是你现在在排队肯定不能出来,所以你需要另一个人来帮你看,这个临时指针就起到这样一个作用。
3:上面说排队找朋友,我们这个找肯定就是找到要删除的那个空间节点了,所以下面说一下删除链表节点要注意的事情。
第一点:要先把该删除的空间的前趋和后继先连接起来,因为不能破坏链表的结构,所以pre和cur->next这个前趋后继节点就起到了这样一个作用,接下里就是直接把该位置cur的空间删除掉。
- 记住你删除这个节点后要回到你现在排队的位置,因为你不知道后面还有没有,这个临时指针只能告诉你一个重复的空间。
gt = temp;也就是起到了这样一个作用。*
同样的在传入链表的时候需要传入二级指针。
void Delete_Linklist_recur(struct Wordc **L2)
{
char *ch;
int c = 1;
struct Wordc *temp = (*L2);
struct Wordc *pre;
struct Wordc *cur = temp->next;
struct Wordc *gt;
while(temp!=NULL)
{
gt = temp;
while(gt->next != NULL)
{
pre = gt;
cur = gt->next;
gt = gt->next;
if(strcmp(temp->s,cur->s)==0 )
{
pre->next = cur->next;
free(cur);
gt = temp;
}
}
temp = temp->next;
}
}
结尾
- 这几个函数的具体实现功能大概就是这些,全局变量和结构体这些声明一定不能漏掉,这些是构成函数的基本要素。
(再次叮嘱↓)
- 如果你不想定义全局变量,那么你需要在函数参数里面添加多几个参数,在用函数的时候把这些变量传进来进行操作,这样也可以实现。
C语言:将txt文件的单词导入链表&&删除链表重复单词的更多相关文章
- C语言向txt文件写入当前系统时间(Log)
程序实现很简单,涉及到的只有两个知识点. 1.文件最最基本的打开关闭: 2.系统时间的获取. 代码是在VS2019环境下编写的,部分函数在其他编译器中会无法识别.这个就只能需要自己去查找对应的函数简单 ...
- C语言读写txt文件
写入和读取txt文件 #include<stdio.h> #include<string.h> int main( int argc, char *argv[] ) { int ...
- Go语言实现:【剑指offer】删除链表中重复的结点
该题目来源于牛客网<剑指offer>专题. 给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中没有重复出现的数字. 示例 1: 输入: 1->2->3->3- ...
- mysql使用load导入txt文件所遇到的问题及解决方法
导入txt文件,有导入向导这种方式: 另外可以使用load的方式导入.最开始使用以下代码插入: load data local infile 'F:\\Data\\predict_data.txt' ...
- python应用:TXT文件的读写
python读写TXT文件不需要导入包 python中常用的读写方式: 文件打开模式 描述 r 以只读模式打开文件,并将文件指针指向文件头:如果文件不存在会报错 w 以只写模式打开文件,并将文件指针指 ...
- 文件内容统计:对任意给定的.txt文件进行内容的字符数、行数、单词数进行统计
项目源码地址:https://gitee.com/xjtsh/projects 功能实现: wc.exe -c file.c //返回文件 file.c 的字符数 wc.exe -w file ...
- TiDB Lightning导入超大型txt文件实践
背景 TiDB 提供了很多种数据迁移的方式,但这些工具/方案普遍对MySQL比较友好,一旦涉及到异构数据迁移,就不得不另寻出路,借助各种开源或商业的数据同步工具.其实数据在不同系统的流转当中,有一种格 ...
- 用DataGridView导入TXT文件,并导出为XLS文件
使用 DataGridView 控件,可以显示和编辑来自多种不同类型的数据源的表格数据.也可以导出.txt,.xls等格式的文件.今天我们就先介绍一下用DataGridView把导入txt文件,导出x ...
- mysql中导入txt文件
1 windows 下 mysql导入txt文件(使用mysql的workbench) load data local infile 'path' into table table_name fiel ...
- SQL LOADER 的用法 TXT文件导入非常之快
前提,需要本地安装ORACLE 客户端 控制文件 cms.ctl load dataCHARACTERSET UTF8infile 'oracle.txt'APPEND INTO TABLE JR f ...
随机推荐
- #交互,鸽笼原理#CF1776C Library game
题目 有一个长度为 \(m\) 的书架,以及 \(n\) 个长度 \(a_1,a_2,\dots,a_n\) Alessia 和 Bernardo 从书架上取书.每次由 Alessia 选择一个之前没 ...
- 王莉:将开发文档英文化和本地化,我们努力让OpenHarmony走向全球
编者按:在 OpenHarmony 生态发展过程中,涌现了大批优秀的代码贡献者,本专题旨在表彰贡献.分享经验,文中内容来自嘉宾访谈,不代表 OpenHarmony 工作委员会观点. 王莉 华为技术有限 ...
- openGauss中如何管理表空间
openGauss 中如何管理表空间 在 openGauss 中,表空间是一个目录,在物理数据和逻辑数据间提供了抽象的一层,为所有的数据库对象分配存储空间,里面存储的是它所包含的数据库的各种物理文件. ...
- echarts X轴类目名太长时隐藏,hover时显示全部
echarts图表X轴 在柱状图中,X轴类目名如果数据太长: echarts会默认进行隐藏部分字段: 如果我们想让每一个类目名都显示出来,需要进行额外的处理 X轴类目名太长时,默认只显示一部分类目名 ...
- 论文解读:Cellpose在细胞分割领域的应用
细胞分割与Cellpose 基于显微镜图像的单细胞分析是目前生命科学领域的前沿和热点问题.细胞分割能对成像图片进行批量处理,将其形态.位置.RNA 表达和蛋白质表达等信息赋予识别出的每个细胞.比如: ...
- centos7搭建vsftpd环境详解[亲测成功]
centos7搭建vsftpd环境详解(亲测) 标签: centos7vsftpd 分类: linux相关(关于centos)(2) 版权声明:本文为博主原创文章,未经博主允许不得转载. 初学L ...
- 重新整理 .net core 实践篇————防跨站脚本攻击[四十]
前言 简单整理一下跨站脚本攻击. 正文 攻击原理是这样子的: 这种攻击被攻击的面挺多的,比如说只要有一个可以让用户输入的注入脚本就都是一个问题. 给网站注入脚本 然后用户访问给网站注入的脚本 脚本里面 ...
- vue watch的this 到底是什么?
正文 watch: { value: (newV, oldV) => { this.a = newV; } } 加入该vue对象中,data 有: { data:{ a:5 } } 那么请问,如 ...
- c# 模拟web请求formdata webrequest
前言 在写代码中,我们常常需要去书写代码去请求一些东西,那么是不是可以模拟像web formdata一样请求. 正文 下面代码为模拟的: public string SendRequest(strin ...
- 重新整理数据结构与算法(c#)——KMP破解[二十七]
前言 很多人把KMP和暴力破解分开,其实KMP就是暴力破解,整个高大上的名字,难道还不是去试错匹配吗? KMP是这样子的,比如说: 绿色部分是我要匹配的. 按照一般写法是这样子的: ABABA 去匹配 ...