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 ...
随机推荐
- CTFshow pwn49 wp
PWN49 用ida打开我们发现是静态编译的,所以先要通过libc库来打是不可能的了,程序里面有一个栈溢出点,找一下有没有system函数,发现并没有 那么我们找一下有没有mprotect函数如果有这 ...
- #模拟#洛谷 5957 [POI2017]Flappy Bird
题目 分析 小鸟所在坐标的奇偶性一定相同, 考虑每次维护一个可行区间表示小鸟在当前列可以进入的纵坐标区间, 那么它有\(x_i-x_{i-1}\)的纵坐标最大改变差,然后根据奇偶性以及限制区间缩小范围 ...
- Java 容器详解:使用与案例
Java容器是一套工具,用于存储数据和对象.可以与C++的STL类比.Java容器也称为Java Collection Framework (JCF).除了存储对象的容器之外,还提供了一套工具类,用于 ...
- Git安装和配置教程:Windows/Mac/Linux三平台详细图文教程,带你一次性搞定Git环境
Git是一款免费.开源的分布式版本控制系统,广泛应用于软件开发领域.随着开源和云计算的发展,Git已经成为了开发者必备的工具之一.本文将为大家介绍Git在Windows.Mac和Linux三个平台上的 ...
- SQline安装
SQLite 安装 SQLite 的一个重要的特性是零配置的,这意味着不需要复杂的安装或管理.本章将讲解 Windows.Linux 和 Mac OS X 上的安装设置. 在 Windows 上安装 ...
- Django Admin:自动选择当前用户
--转载自:林肯李 该文章写的很好,特转载留待后期备用 背景 在开发 CMS 时,经常需要标记谁创建了记录.Django 为我们提供了一个很好的管理界面.但是当我们只使用默认值时,用户需要自己选择他们 ...
- VMware Workstation之虚拟机NAT模式
[摘要] 三台虚拟机配置成NAT模式,实现三台虚拟机互通并可以访问互联网. 一.虚拟机配置为NAT,实现访问互联网和宿主机 1.虚拟网络编辑器配置 VMnat8为NAT的虚拟网卡,NAT模式可以基于D ...
- ICMP 概念
前言 打算从新整理网络这一块,那么我先把概念整理下来. 正文 ICMP是ip的一个组成.他传递差错报文以及其他需要注意的信息.主要用于反馈一些网络传输的问题.因为ip协议很容易丢包,那么icmp可以告 ...
- deepspeed 训练多机多卡报错 ncclSystemError Last error
最近在搞分布式训练大模型,踩了两个晚上的坑今天终于爬出来了 我们使用 2台 8*H100 遇到过 错误1 10.255.19.85: ncclSystemError: System call (e.g ...
- easyx的使用,鼠标交互(3.0)
本文从B站学习,借鉴: 学习视频地址:鼠标操作(旧版)_哔哩哔哩_bilibili