前言

主要分为两个实现部分,按个人需求浏览

可以在目录中找到对应位置进行浏览。
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文件的单词导入链表&&删除链表重复单词的更多相关文章

  1. C语言向txt文件写入当前系统时间(Log)

    程序实现很简单,涉及到的只有两个知识点. 1.文件最最基本的打开关闭: 2.系统时间的获取. 代码是在VS2019环境下编写的,部分函数在其他编译器中会无法识别.这个就只能需要自己去查找对应的函数简单 ...

  2. C语言读写txt文件

    写入和读取txt文件 #include<stdio.h> #include<string.h> int main( int argc, char *argv[] ) { int ...

  3. Go语言实现:【剑指offer】删除链表中重复的结点

    该题目来源于牛客网<剑指offer>专题. 给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中没有重复出现的数字. 示例 1: 输入: 1->2->3->3- ...

  4. mysql使用load导入txt文件所遇到的问题及解决方法

    导入txt文件,有导入向导这种方式: 另外可以使用load的方式导入.最开始使用以下代码插入: load data local infile 'F:\\Data\\predict_data.txt' ...

  5. python应用:TXT文件的读写

    python读写TXT文件不需要导入包 python中常用的读写方式: 文件打开模式 描述 r 以只读模式打开文件,并将文件指针指向文件头:如果文件不存在会报错 w 以只写模式打开文件,并将文件指针指 ...

  6. 文件内容统计:对任意给定的.txt文件进行内容的字符数、行数、单词数进行统计

    项目源码地址:https://gitee.com/xjtsh/projects 功能实现: wc.exe -c file.c     //返回文件 file.c 的字符数 wc.exe -w file ...

  7. TiDB Lightning导入超大型txt文件实践

    背景 TiDB 提供了很多种数据迁移的方式,但这些工具/方案普遍对MySQL比较友好,一旦涉及到异构数据迁移,就不得不另寻出路,借助各种开源或商业的数据同步工具.其实数据在不同系统的流转当中,有一种格 ...

  8. 用DataGridView导入TXT文件,并导出为XLS文件

    使用 DataGridView 控件,可以显示和编辑来自多种不同类型的数据源的表格数据.也可以导出.txt,.xls等格式的文件.今天我们就先介绍一下用DataGridView把导入txt文件,导出x ...

  9. mysql中导入txt文件

    1 windows 下 mysql导入txt文件(使用mysql的workbench) load data local infile 'path' into table table_name fiel ...

  10. SQL LOADER 的用法 TXT文件导入非常之快

    前提,需要本地安装ORACLE 客户端 控制文件 cms.ctl load dataCHARACTERSET UTF8infile 'oracle.txt'APPEND INTO TABLE JR f ...

随机推荐

  1. #线性dp,排列组合#洛谷 2476 [SCOI2008]着色方案

    题目 分析(弱化版) 最暴力的想法就是直接维护每种颜色的个数dp, 弱化版有一个很突出的地方就是 \(c_i\leq 5\), 也就是说可以将相同个数的颜色合并按照个数dp, 设 \(dp[c1][c ...

  2. #zkw线段树#洛谷 3792 由乃与大母神原型和偶像崇拜

    题目 给你一个长为 \(n\) 的序列 \(a\) 每次两个操作: 修改 \(x\) 位置的值为 \(y\) 查询区间 \([l,r]\) 是否可以重排为值域上连续的一段 分析 直接维护区间最大值和最 ...

  3. C# 中一维数组和二维数组详解

    String[][]是二维数组.例如:String[][] str=new String[4][4],这是创建了一个有bai4行4列元素的数组. String[]代表一维数组.例如:String[]  ...

  4. 最新CAMX-python融合技术应用与大气污染来源解析方法

    大气污染问题既是局部.当地的,也是区域的,甚至是全球的.本地的污染物排放除了对当地造成严重影响外,同时还会在动力输送作用下,极大地影响下风向地区的大气环境状况.数值模式模拟是分析大气污染物时空分布和成 ...

  5. 基于istio实现单集群地域故障转移

    本文分享自华为云社区<基于istio实现单集群地域故障转移>,作者:可以交个朋友. 一 背景 随着应用程序的增长并变得更加复杂,微服务的数量也会增加,失败的可能性也会增加.微服务的故障可能 ...

  6. 学习Source Generators之了解Source Generators的应用场景

    前面的文章我们都初步学习了Source Generators的使用方式以及做了一些简单的代码生成工具. 但是Source Generators除了做自动代码生成之外,还能有别的应用场景,本文来了解一下 ...

  7. Worker 进行多线程任务开发

    概念介绍 在 OpenHarmony 中,UI 线程负责处理 UI 事件和用户交互,而 Worker 线程用于处理耗时操作,以提高应用程序的响应速度和用户体验. Worker 线程是与主线程并行的独立 ...

  8. Django框架——csrf跨站请求伪造、csrf校验、csrf相关装饰器、auth认证、auth认证相关模块及操作

    csrf跨站请求伪造 钓鱼网站:模仿一个正规的网站 让用户在该网站上做操作 但操作的结果会影响到用户正常的网站账户 但是其中有一些猫腻 eg:英语四六级考试需要网上先缴费 但是你会发现卡里的钱扣了但是 ...

  9. 学习 XQuery:XML数据查询的关键

    XQuery 是 XML 数据的查询语言,类似于 SQL 是数据库的查询语言.它被设计用于查询 XML 数据. XQuery 示例 for $x in doc("books.xml" ...

  10. 力扣9(java)-回文数(简单)

    题目: 给你一个整数 x ,如果 x 是一个回文整数,返回 true :否则,返回 false . 回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数. 例如,121 是回文,而 123 不 ...