C语言读取文件中所有单词出现的次数并输出到屏幕和文件中

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

typedef struct Sword{
	char word[200];
	int num;
	struct Sword * next;
}Sword;
void add(Sword * Head,char * str);
void display(Sword * Head,FILE * fp);
void release(Sword * Head);

int main(void){
	FILE * fp;
	char filename [] ="D:\\codesoftware\\Dev_C\\C_code\\file.txt";//打开读的文件位置 自定义 
	char str[200];  //暂存一个单词的数组 
	Sword * Head; 
	Head = (Sword *)malloc(sizeof(Sword)); //头指针 
	memset(Head,0,sizeof(Sword));
	if((fp = fopen(filename,"r"))==NULL){ //读 初始化 
		printf("Can  not open file");
		exit(0);
	}
	while(fscanf(fp,"%s",str) != EOF){  //读文件 
		add(Head,str);      //添加到链表 
	}
	fclose(fp);          //关闭读 
	if((fp = fopen(filename,"a"))==NULL){ //追加初始化 
		printf("can not open file");
		exit(0);
	}
	display(Head,fp);     //将各个单词统计结果显示到屏幕和文件中 
	fclose(fp);     //关闭读 
	release(Head); //释放空间 
	return 0;	
}
	void add(Sword * Head,char * str){ //添加单词和统计个数 
		Sword * tw;
		Sword * p = Head;
		while(1){
			if(strcmp(p->word,str)==0){ //判断是否和当前单词相同 
				p->num++;            //相同此单词个数++ 
				return;
			}else{               //不同 遍历下个元素 看是否后后面的元素相同 
				if(p->next != NULL){
					p = p->next;
				}else{      //与链表上所有的都不同 新建一个节点 
					tw = (Sword *)malloc(sizeof(Sword));//动态分配内存空间 
					memset(tw,0,sizeof(Sword));
					sprintf(tw->word,"%s",str);//将单词 保存 
					tw->num++;            //单词数++ 
					p->next = tw;        //p的下一个节点为tw 就是连到链表上 
					return;
				}
			}
		}
	}
	
	void display(Sword * Head,FILE * fp){ //统计单词和出现次数输出到屏幕和文件中  
		Sword * show;
		for(show = Head->next;show != NULL;show = show->next){ //show指向第一个元素 然后往后遍历 
			printf("%s  %d\n",show->word,show->num);
			fprintf(fp,"%s  %d\n",show->word,show->num);
		}
	}
	
	void release(Sword * Head){ //释放空间 
		Sword * tw;
		Sword * pre = Head;
		while(pre != NULL){ //只要不为空  
			tw = pre->next; //tw暂存next 
			free(pre);     //释放当前节点所占内存空间 
			pre = tw;
		}
	}

  • 7
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值