C语言:生成单词列表----使用单链表实现
解决之前用结构体数组导致内存过剩问题,使用动态分配内存优化单词列表。
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语言:生成单词列表----使用单链表实现的更多相关文章
- c语言,递归翻转一个单链表,c实现单链表
目的:主要是练习c里面单链表的实现,递归思想复习; #include <stdlib.h> #include <stdio.h> typedef struct _Node{// ...
- 单链表 C语言 学习记录
概念 链接方式存储 链接方式存储的线性表简称为链表(Linked List). 链表的具体存储表示为: 用一组任意的存储单元来存放线性表的结点(这组存储单元既可以是连续的,也可以是不连续的). 链表中 ...
- c语言进阶14-线性表之链表
一. 线性表的链式存储结构 1. 顺序存储结构不足的解决办法 前面我们讲的线性表的顺序存储结构.它是有缺点的,最大的缺点就是插入和删除时需要移动大量元素,这显然就需要耗费时间.能不能想 ...
- RE.从单链表开始的数据结构生活(bushi
单链表 单链表中节点的定义 typedef struct LNode{ int data;//数据域 struct LNode *next;//定义一个同类型的指针,指向该节点的后继节点 }LNode ...
- 不带头结点的单链表(基于c语言)
本篇文章的代码大多使用无头结点的单链表: 相关定义: #include <stdio.h> #include <stdlib.h> #include <assert.h& ...
- 动态单链表的传统存储方式和10种常见操作-C语言实现
顺序线性表的优点:方便存取(随机的),特点是物理位置和逻辑为主都是连续的(相邻).但是也有不足,比如:前面的插入和删除算法,需要移动大量元素,浪费时间,那么链式线性表 (简称链表) 就能解决这个问题. ...
- 数据结构算法C语言实现(二)---2.3线性表的链式表示和实现之单链表
一.简述 [暂无] 二.头文件 #ifndef _2_3_part1_H_ #define _2_3_part1_H_ //2_3_part1.h /** author:zhaoyu email:zh ...
- 无头结点的单链表(C语言)
1.单链表: 在顺序表中,用一组地址连续的存储单元来一次存放线性表的结点,因此结点的逻辑顺序与物理顺序是一致的.但链表却不同,链表是用一组任意的存储单元来存放 线性表的结点,这组存储单元可以是连续的, ...
- C语言数据结构-单链表的实现-初始化、销毁、长度、查找、前驱、后继、插入、删除、显示操作
1.数据结构-单链表的实现-C语言 typedef struct LNode { int data; struct LNode* next; } LNode,*LinkList; //这两者等价.Li ...
- 数据结构—单链表(类C语言描写叙述)
单链表 1.链接存储方法 链接方式存储的线性表简称为链表(Linked List). 链表的详细存储表示为: ① 用一组随意的存储单元来存放线性表的结点(这组存储单元既能够是连续的.也能够是不连续的) ...
随机推荐
- 【版本发布公告】HMS Core6.5.0来啦
新 能 力 3D Engine 3D Engine提供高性能.高画质.高扩展性的实时3D引擎,并提供便捷高效的可视化开发工具.开发者可基于华为的3D Studio开发工具,通过图形和渲染.动画.UI等 ...
- 无监督多视角行人检测 Unsupervised Multi-view Pedestrian Detection
无监督多视角行人检测 Unsupervised Multi-view Pedestrian Detection 论文url:https://arxiv.org/abs/2305.12457 论文简述 ...
- TextIn.com API使用心得
我们参加了本次大学生创新创业服务外包大赛,在项目中大量使用到了合合信息所提供的api进行相关功能实现,所以在这里写一篇博客分享一下我们在项目的实际推进中关于TextIn.com API使用心得 我们的 ...
- 【未测试】CentOS 6.5快速部署HTTP WEB服务器和FTP服务器
CentOS 6.5快速部署HTTP WEB服务器和FTP服务器 [题记]本文使用CentOS 6.5minimal快速搭建HTTP服务器和仅供授权用户登陆的FTP服务器.意在使用授权FTP用户通过登 ...
- Launching Teamviewer remotely through SSH
Launching Teamviewer remotely through SSH When you need to manage your Server remotely, but you can ...
- spring boot 手动value和自动注入配置的区别[五]
前言 前面两篇中,写道我们注入配置的方式,是通过是注解的方式完成,如下: @ConfigurationProperties(prefix ="person") 这意味着: 我们写一 ...
- linux 连接wifi
前言 我使用树莓派的时候实际过的. 正文 第一步扫描wifi: iwlist wlan0 scan 然后配置: vim /etc/wpa_supplicant/wpa_supplicant.conf ...
- 深入解析Rivest Cipher 4:理论与实践
第一章:引言 密码学简介: 密码学是研究如何保护通信和信息安全的学科.它涉及加密算法.解密算法.密钥管理等内容,旨在确保信息在传输和存储过程中不被未经授权的人所获取或篡改.密码学可以分为对称加密和非对 ...
- HarmonyOS NEXT应用开发—城市选择案例
介绍 本示例介绍城市选择场景的使用:通过AlphabetIndexer实现首字母快速定位城市的索引条导航. 效果图预览 使用说明 分两个功能 在搜索框中可以根据城市拼音模糊搜索出相近的城市,例如输入& ...
- 使用日志上下文聚合插件使能上下文查询及Livetail
简介: 日志上下文浏览是排查业务故障时常用的方式,但受限于Logtail插件系统的设计,在Logtail 1.2.1版本前,如果用户使用Logtail插件来处理日志或采集容器的标准输出,那么用户将无法 ...