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

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. OpenHarmony 官网文档有哪些上新?下篇:设备开发文档上新

    为了方便社区开发者更易获取 OpenAtom OpenHarmony(以下简称"OpenHarmony")相关文档,暨上篇应用开发文档上新内容,SIG Docs  小组同步准备了设 ...

  2. 深入理解 Java 修饰符与封装:访问权限、行为控制与数据隐藏

    Java 修饰符 Java 修饰符 用于控制类.属性.方法和构造函数的访问权限和行为.它们可以分为两组: 访问修饰符: public: 意味着代码对所有类可访问. private: 意味着代码只能在声 ...

  3. std::thread 二:互斥量(lock() & unlock())

    mutex  互斥量的作用是保护共享数据 *:有 lock()  就一定要有  unlock() #include <iostream> #include <thread> # ...

  4. HarmonyOS创作激励计划启动:助力技术创作突破边界

      即日起推出HarmonyOS创作激励计划,成功投稿并入选的文章将在HarmonyOS开发者公众号上线,9大技术社区同步宣发,不仅有丰厚稿酬,还有机会赢取创作奖品! 活动时间 即日起-2024年12 ...

  5. JackSon反序列化通杀

    前言 Springboot一般都会自带JackSon这个依赖包,JackSon跟Fastjson有相同的功效 简单复现 package com.example.jakeson.demo; import ...

  6. WEB 版的报表工具有没有意义?

    这个问题得从两个方面看. 如果这个 web 版的报表工具指的是现在的自助报表,也就是 BI.多维分析,那它是有意义的, 而且各厂商们都已经做的挺好,可以让业务人员通过简单的拖拽进行各种数据分析,生成自 ...

  7. springboot多模块项目启动经历

    springboot多模块使用 @ 目录 springboot多模块使用 前言 大佬把项目权限给我了,我就先下下来看看学习一下 一.识别 二.maven配置 1.安装maven 三.加载刷新 总结 前 ...

  8. 力扣574(MySQL)-当选者(中等)

    题目: 表: Candidate 表: Vote id 是自动递增的主键,CandidateId 是 Candidate 表中的 id. 问题:请编写 sql 语句来找到当选者的名字,上面的例子将返回 ...

  9. 转载 | 基于函数计算自定义运行时快速部署一个 springboot 项目

    简介: 本文转自函数计算征集令优秀征文,活动火热进行中,欢迎大家报名参加! 什么是函数计算? 函数计算是事件驱动的全托管计算服务.使用函数计算,您无需采购与管理服务器等基础设施,只需编写并上传代码.函 ...

  10. 监控最佳实践--redis及业务接口

    简介: 监控最佳实践--redis及业务接口 1. 背景 1.1 问题 2020-12-04,客户侧redis集群版监控DB0 CPU突增至100%,导致数据库无法正常服务,经排查客户侧业务上存在2M ...