C语言:生成单词列表----使用单链表实现

动态内存优化与单词统计
该博客介绍了如何使用动态内存分配解决结构体数组导致的内存过剩问题,针对txt文本进行单词统计并去除重复,实现单词列表的生成及打印。同时提供了删除超链接的代码参考。

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

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);
			
		}
	}
}


说明 此版本仅仅为测试版,是我一时兴起写了半个小时的产物。。。所以许多方面未能完善,希望大家多多提意见,也希望有人能继续编写。 此程序根据“杨鹏17天背词法”及“艾宾浩斯记忆曲线”编写,可以帮用户生成一个“*天背单词计划”,各个list都会在一定天数内重复1~5次,有助于用户牢固、快速背单词,是背四六级、托福、gre单词的居家旅行必备良品~ 编写缘由 最近在拿新东方的托福红宝书背词,>_<有些单词背完了忘、忘完了背,最后是背下来了,但是花费的时间实在不少,十分纠结。况且我还是最近闲的,如果是处在艰难备考期的同志们遇到背单词的问题肯定更是急得跳脚了吧……于是胡乱背的我开始在网上搜“单词记忆法”这种东西,然后就搜到了“杨鹏17 天gre的表格”,顿时觉得如获至宝,该表格根据大众记忆曲线挑出了最好的复习时间,能让人用尽量少的时间记牢单词,解放了许多在词海中苦苦遨游数个月的考生。可是,gre对我来说级别太高,我还是先背背大学四级、托福比较实际,于是我又开始搜……结果只搜到根据“toefl词汇 词根+联想-俞敏洪 35list版本”的表格,= =十分懊恼,只好自己拿excel根据最基本的记忆法开始列计划表。结果,列了两行就发疯乱套了= =这样,才想到写个小程序,自定义“每日背list数”、“单词书list总数”(网上搜到的表格基本都是按35个list写的,但是我买的书是45个 list= =……)方便自己日后列表、方便大众背单词
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

竹等寒

谢过道友支持,在下就却之不恭了

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值