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

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. 【版本发布公告】HMS Core6.5.0来啦

    新 能 力 3D Engine 3D Engine提供高性能.高画质.高扩展性的实时3D引擎,并提供便捷高效的可视化开发工具.开发者可基于华为的3D Studio开发工具,通过图形和渲染.动画.UI等 ...

  2. 无监督多视角行人检测 Unsupervised Multi-view Pedestrian Detection

    无监督多视角行人检测 Unsupervised Multi-view Pedestrian Detection 论文url:https://arxiv.org/abs/2305.12457 论文简述 ...

  3. TextIn.com API使用心得

    我们参加了本次大学生创新创业服务外包大赛,在项目中大量使用到了合合信息所提供的api进行相关功能实现,所以在这里写一篇博客分享一下我们在项目的实际推进中关于TextIn.com API使用心得 我们的 ...

  4. 【未测试】CentOS 6.5快速部署HTTP WEB服务器和FTP服务器

    CentOS 6.5快速部署HTTP WEB服务器和FTP服务器 [题记]本文使用CentOS 6.5minimal快速搭建HTTP服务器和仅供授权用户登陆的FTP服务器.意在使用授权FTP用户通过登 ...

  5. Launching Teamviewer remotely through SSH

    Launching Teamviewer remotely through SSH When you need to manage your Server remotely, but you can ...

  6. spring boot 手动value和自动注入配置的区别[五]

    前言 前面两篇中,写道我们注入配置的方式,是通过是注解的方式完成,如下: @ConfigurationProperties(prefix ="person") 这意味着: 我们写一 ...

  7. linux 连接wifi

    前言 我使用树莓派的时候实际过的. 正文 第一步扫描wifi: iwlist wlan0 scan 然后配置: vim /etc/wpa_supplicant/wpa_supplicant.conf ...

  8. 深入解析Rivest Cipher 4:理论与实践

    第一章:引言 密码学简介: 密码学是研究如何保护通信和信息安全的学科.它涉及加密算法.解密算法.密钥管理等内容,旨在确保信息在传输和存储过程中不被未经授权的人所获取或篡改.密码学可以分为对称加密和非对 ...

  9. HarmonyOS NEXT应用开发—城市选择案例

    介绍 本示例介绍城市选择场景的使用:通过AlphabetIndexer实现首字母快速定位城市的索引条导航. 效果图预览 使用说明 分两个功能 在搜索框中可以根据城市拼音模糊搜索出相近的城市,例如输入& ...

  10. 使用日志上下文聚合插件使能上下文查询及Livetail

    简介: 日志上下文浏览是排查业务故障时常用的方式,但受限于Logtail插件系统的设计,在Logtail 1.2.1版本前,如果用户使用Logtail插件来处理日志或采集容器的标准输出,那么用户将无法 ...