解决之前用结构体数组导致内存过剩问题,使用动态分配内存优化单词列表。

txt文本内容不允许出现其他字符形式,这个仅限于判断在txt网页文件已经删除了超链接等,文本里面只允许出现单词才能进行判断和进行单词统计去重。

删除超链接和不可视化内容的代码可参考我以前的这篇博客,只需要把结构体修改一下,和传入的参数修改一下就可以正常使用了。

删除超链接--点击博客

#include<stdio.h>
#include<string.h>
#include<ctype.h>
#include<stdbool.h>
#include<stdlib.h>
/*
/ ********************************************** /
This is Jackson.W's Experiment report.
Time: 2022.03.05
school num: 20203005129
/ ********************************************** /
*/
struct Wordc{
char s[20];
int num;
struct Wordc *next;
}; void wordcc(struct Wordc **wordc, FILE *fp1, FILE *fp2);//去除重复单词,生成单词表打印出来 void wbiao(struct Wordc *wordc, FILE *fp, int m); void Release_room(struct Wordc **wordc);//释放分配动态分配后的空间 int main()
{
int i;
system("mode con cp select=65001");
char ch;
char ch1[20], ch2[20];
FILE *fp1 = NULL;
FILE *fp2 = NULL;
struct Wordc *wordc_huohu = NULL; /*火狐:统计单词数目,除去重复单词, 打印出单词相同的单词表,并且将单词表复制给新的文本里面***/ fp1 = fopen("D:/new_huohu.txt", "r");
fp2 = fopen("D:/wordsclub_huohu.txt", "w");
wordcc(&wordc_huohu, fp1, fp2);
fclose(fp1);
fclose(fp2);
/****************************************************************/ Release_room(&wordc_huohu);
return 0;
} void wordcc(struct Wordc **wordc_delive, FILE *fp1, FILE *fp2)//去除重复单词,生成单词表打印出来
{ int i = 0,j = 0, m = 0;
int index = 0;//当前结果数组的最大下标
char ch;//读取流的字符
char copy[51];
int numwords = 0;
int num = 0;
int start = 0; struct Wordc *Head_W = NULL;//下面会存放结构体的头部地址
struct Wordc *temp_H = NULL;
while(!feof(fp1))
{
ch = fgetc(fp1);
if(isalpha(ch))
{
start = 1;//标志进来过这个语句,所以已经有一个字母开头,下面就可以利用这个条件进行判断
if(isupper(ch))
{
ch = tolower(ch);
}
copy[i++] = ch;
}
else if(!isalpha(ch) && start == 1)//符合条件就开始搜索是否有相同单词
{
copy[i] = '\0';//添加\0 变成字符串之后方便比较和其他操作
numwords++;
start = 0;
//printf("%s*******88\n", copy);
Head_W = *wordc_delive;//让指针指向单链表头,方便下面从头遍历其他单词
for(j = 0; j < m; j++)//判断重复单词
{
if(Head_W == NULL)
{
k = 1;
break;
} if(strcmp(copy, Head_W->s) == 0)
{
Head_W->num++;
k = 0;//表示有重复单词
break;
}
else
{
k = 1;//遍历所有元素,无影响,因为碰到上面有重复的才会break,这里即使等于1 了也不会出来,继续遍历
}
Head_W = Head_W->next;
}
if(k == 1)//表示有新单词
{ //这里需要动态分配一个新空间 ,然后让新空间节点指向头部地址
struct Wordc *newRoom = (struct Wordc*)malloc(sizeof(struct Wordc)), *temp_Room;
if(*wordc_delive == NULL)//若还没有单词在链表中,就直接让新空间的next指向NULL
{
*wordc_delive = newRoom;
newRoom->next = NULL;
}
else
{
temp_H = *wordc_delive;
while(temp_H->next != NULL)
{
temp_H = temp_H->next;//找到尾部
}
temp_H->next = newRoom;
newRoom->next = NULL;//尾插法
}
for(j = 0; j < i + 1; j++)
{
newRoom->s[j] = copy[j];//用新空间进行赋值单词字符
}
newRoom->num++;//新成员加一
m++;//记录单词数量
}
i = 0;
for(j = 0; j < 50; j++)
{
copy[j] = ' ';//清空copy内的字符内容
} }
}
system("mode con cp select=936");
printf("一共有%d个不同的单词\n" , m-1);
printf("总单词数量:%d\n", numwords); /*****************生成单词表的函数在这里**********************/
wbiao(*wordc_delive, fp2, m);
} void wbiao(struct Wordc *wordc, FILE *fp, int m)//将单词表写进文件里面
{
//system("mode con cp select=437");
int i ,j;
for(i = 0; i < m; i++)
{
fprintf(fp, "%s", wordc->s);//链表中已经把字符字符串化,所以直接每一个单词输出就行
fprintf(fp, " ");
if(wordc->next != NULL) wordc = wordc->next;
if(i % 10 == 0)
{
fprintf(fp, "\n"); }
} } void Release_room(struct Wordc **wordc)//释放分配动态分配后的空间
{
struct Wordc *temp;
while(1)
{
if(*wordc != NULL)
{
temp = *wordc;
*wordc = (*wordc)->next;
free(temp); }
}
}

C语言:生成单词列表----使用单链表实现的更多相关文章

  1. c语言,递归翻转一个单链表,c实现单链表

    目的:主要是练习c里面单链表的实现,递归思想复习; #include <stdlib.h> #include <stdio.h> typedef struct _Node{// ...

  2. 单链表 C语言 学习记录

    概念 链接方式存储 链接方式存储的线性表简称为链表(Linked List). 链表的具体存储表示为: 用一组任意的存储单元来存放线性表的结点(这组存储单元既可以是连续的,也可以是不连续的). 链表中 ...

  3. c语言进阶14-线性表之链表

    一.  线性表的链式存储结构 1.        顺序存储结构不足的解决办法 前面我们讲的线性表的顺序存储结构.它是有缺点的,最大的缺点就是插入和删除时需要移动大量元素,这显然就需要耗费时间.能不能想 ...

  4. RE.从单链表开始的数据结构生活(bushi

    单链表 单链表中节点的定义 typedef struct LNode{ int data;//数据域 struct LNode *next;//定义一个同类型的指针,指向该节点的后继节点 }LNode ...

  5. 不带头结点的单链表(基于c语言)

    本篇文章的代码大多使用无头结点的单链表: 相关定义: #include <stdio.h> #include <stdlib.h> #include <assert.h& ...

  6. 动态单链表的传统存储方式和10种常见操作-C语言实现

    顺序线性表的优点:方便存取(随机的),特点是物理位置和逻辑为主都是连续的(相邻).但是也有不足,比如:前面的插入和删除算法,需要移动大量元素,浪费时间,那么链式线性表 (简称链表) 就能解决这个问题. ...

  7. 数据结构算法C语言实现(二)---2.3线性表的链式表示和实现之单链表

    一.简述 [暂无] 二.头文件 #ifndef _2_3_part1_H_ #define _2_3_part1_H_ //2_3_part1.h /** author:zhaoyu email:zh ...

  8. 无头结点的单链表(C语言)

    1.单链表: 在顺序表中,用一组地址连续的存储单元来一次存放线性表的结点,因此结点的逻辑顺序与物理顺序是一致的.但链表却不同,链表是用一组任意的存储单元来存放 线性表的结点,这组存储单元可以是连续的, ...

  9. C语言数据结构-单链表的实现-初始化、销毁、长度、查找、前驱、后继、插入、删除、显示操作

    1.数据结构-单链表的实现-C语言 typedef struct LNode { int data; struct LNode* next; } LNode,*LinkList; //这两者等价.Li ...

  10. 数据结构—单链表(类C语言描写叙述)

    单链表 1.链接存储方法 链接方式存储的线性表简称为链表(Linked List). 链表的详细存储表示为: ① 用一组随意的存储单元来存放线性表的结点(这组存储单元既能够是连续的.也能够是不连续的) ...

随机推荐

  1. 初识urllib与requests

    urllib与requests 一.urllib的学习 学习目标 了解urllib的基本使用 1.urllib介绍 除了requests模块可以发送请求之外, urllib模块也可以实现请求的发送,只 ...

  2. #贪心#洛谷 6927 [ICPC2016 WF]Swap Space

    题目 分析 可以发现能将硬盘容量变大的优先,这种硬盘就是以格式化前的大小升序排序. 然后如果硬盘容量变小,那就是先填格式化后较大的硬盘(因为装完可以提供较大的空间) 代码 #include <c ...

  3. GitHub互赞快速涨星,最简单的涨星方法

    ​各位代码们,是不是厌倦了在GitHub上孤独地刷着自己的项目页面,眼巴巴地等待那星星数的涨幅?今天给大家安利一个超级实用的新玩意儿--涨星互助平台,一个让你的GitHub项目星星数飞起来的秘密基地! ...

  4. 李东山:如何让 OpenHarmony 支持低功耗蓝牙芯片 GR551x

    编者按:在 OpenHarmony 生态发展过程中,涌现了大批优秀的代码贡献者,本专题旨在表彰贡献.分享经验,文中内容来自嘉宾访谈,不代表 OpenHarmony 工作委员会观点. 李东山 深圳市汇顶 ...

  5. Spring源码 19 IOC getBean方法

    前面实现了 ClassPathXmlApplicationContext 的构造,接下来分析其调用的 getBean 方法. 以 getBean(UserDao.class) 为例. 1 Abstra ...

  6. Centos 8.0 minimal命令行安装图形化界面(超详细)

    Centos 8.0 安装图形化界面(超详细) 开始之前呢,请先查看您的Centos版本和是否有root账户权限. 一.安装Centos 图形化界面并重启 下载安装图形化界面 执行命令 yum gro ...

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

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

  8. 很强!4.7k star,推荐一款Python工具,可实现自动化操作!!

    1.介绍 在日常工作中,肯定会遇到一些重复性的工作,不管是点击某个按钮.写东西,打印东西,还是复制粘贴拷贝资料之类的,需要进行大量的重复操作.按键精灵大家都听说过,传统的方式,大家可以使用按键精灵将操 ...

  9. 力扣618(MySQL)-学生地理信息报告(困难)

    题目: 一所美国大学有来自亚洲.欧洲和美洲的学生,他们的地理信息存放在如下 student 表中 该表没有主键.它可能包含重复的行.该表的每一行表示学生的名字和他们来自的大陆. 一所学校有来自亚洲.欧 ...

  10. 力扣43(java)-字符串相乘(中等)

    题目: 给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式. 注意:不能使用任何内置的 BigInteger 库或直接将输入 ...