前言

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

可以在目录中找到对应位置进行浏览。
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#CF1110D Jongmah

    题目 分析 考虑三个 \((i,i+1,i+2)\) 可以用 \((i,i,i)\) 和 \((i+1,i+1,i+1)\) 和 \((i+2,i+2,i+2)\) 代替, 所以这样的三元组本质上最多 ...

  2. #树状数组,概率,离散,双指针#洛谷 6834 [Cnoi2020]梦原

    题目 分析 如果是序列(\(k=1\))也就是积木大赛 那也就是\(\sum_{i=1}^n\max\{a_i-a_{i-1},0\}\) 那关键就是要处理与父节点之间的关系,如果父节点的值小于该节点 ...

  3. clang的lto特性的资料

    clang对lto的支持,如下文章介绍的清晰.易懂. ThinLTO llvm+clang 添加 LTO(Link Time Optimization) 支持 编译优化之 - 链接时优化(LTO)入门 ...

  4. 一文总结ACE代码框架

    一.前言 ACE_Engine框架是OpenAtom OpenHarmony(简称"OpenHarmony")的UI开发框架,为开发者提供在进行应用UI开发时所必需的各种组件,以及 ...

  5. OpenHarmony系统使用gdb调试init

      前言 OpenAtom OpenHarmony(简称"OpenHarmony")适配新的开发板时,启动流程init大概率会出现问题,其为内核直接拉起的第一个用户态进程,问题定位 ...

  6. RabbitMQ 06 工作队列模式

    工作队列模式结构图: 这种模式非常适合多个工人等待任务到来的场景.任务有多个,一个一个丢进消息队列,工人也有很多个,就可以将这些任务分配个各个工人,让他们各自负责一些任务,并且做的快的工人还可以多完成 ...

  7. hive窗口分析函数使用详解系列二之分组排序窗口函数

    1.综述 我们讨论面试中各大厂的SQL算法面试题,往往核心考点就在于窗口函数,所以掌握好了窗口函数,面对SQL算法面试往往事半功倍. 已更新第一类聚合函数类,点击这里阅读 hive窗口函数聚合函数类 ...

  8. MMDeploy部署实战系列【第六章】:将编译好的MMdeploy导入到自己的项目中 (C++)

    MMDeploy部署实战系列[第六章]:将编译好的MMdeploy导入到自己的项目中 (C++) 这个系列是一个随笔,是我走过的一些路,有些地方可能不太完善.如果有那个地方没看懂,评论区问就可以,我给 ...

  9. leetcode:3. 无重复字符的最长子串

    3. 无重复字符的最长子串 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb" 输出: 3  解释: 因为无重复字符的最长子 ...

  10. 本地使用ts配置

    1.需要安装的依赖 "dependencies": { "html-webpack-plugin": "^5.5.0", "ts- ...