问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

C语言统计一篇文件里出现最多的三个单词

发布网友 发布时间:2022-04-07 10:38

我来回答

3个回答

热心网友 时间:2022-04-07 12:07

以前写过一个统计一篇文章中单词出现频率的程序,这里正好可以用(只输出前三个单词):
//统计单词出现频率
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Node{
int c; //单词w程序次数
char w[20]; //单词
struct Node *next;
struct Node *pre;
};
char s[]=" ,;.?!:(\"\\)['|]{/}@#$&*+-=<~`_>0123456789\12"; //单词分隔符

//在head中查找单词pw,找到flag=1,返回该结点指针;否则flag=0,返回链表尾结点指针,
struct Node *Find(struct Node *head, char *pw, int *falg);
//输出统计结果
void Print(struct Node *head);
//统计一行
void Count(struct Node *head, char *pl);
//释放链表
void Distroy(struct Node *head);

int main(){
struct Node *h;
FILE *pf;
char s[1024];
char filename[]="c:\\test.TXT";
pf=fopen(filename,"r");
if(!pf){
printf("打开文件时出错\n");
return 1;
}
h=(struct Node *)malloc(sizeof(struct Node));
h->next=h->pre=0;
h->w[0]='\0';
h->c=0;
while(fgets(s,513,pf)!=0){
Count(h, s);
}
fclose(pf);
Print(h);
Distroy(h);
return 0;
}

struct Node *Find(struct Node *head, char *pw, int *flag){
struct Node *p=head, *q=head;
while( p!=0 && strcmp(p->w, pw)!=0 ){
q=p;
p=p->next;
}
if(p==0){
*flag=0;
return q;
}else{
*flag=1;
return p;
}
}

void Print(struct Node *head){
struct Node *p=head;
int c=0;
while(p && c<3){
printf("%s: %d\n", p->w, p->c);
p=p->next;
c++;
}
}

void Count(struct Node *head, char *pl){
struct Node *p, *q;
char *pw, tw[20];
int f, tc;
strlwr(pl); //将字符串pl中的字母变为小写
pw=strtok(pl,s); //提前字符串pl中的首个单词
while(pw!=0){
q=Find(head, pw, &f);
if(f==1){ //找到该单词,出现次数加一
q->c++;
}else{ //没找到该单词,将该单词插入链表
if(q==head && q->w[0]=='\0'){ //原链表为空,这是第一个单词
strcpy(q->w, pw);
q->c=1;
q->next=q->pre=0;
}else{ //链表不空,将该单词插入链表尾部
p=(struct Node *)malloc(sizeof(struct Node));
p->next=0;
p->pre=q;
strcpy(p->w, pw);
p->c=1;
q->next=p;
}
} //没找到该单词
//调整单词次序
p=q;
while(p!=head && p->c > (p->pre)->c)
p=p->pre;
//交换p和q两结点的数据(单词及出现次数)
if(p!=q){
strcpy(tw, p->w);
strcpy(p->w, q->w);
strcpy(q->w, tw);
tc=p->c;
p->c=q->c;
q->c=tc;
}
pw=strtok(0,s); //提前字符串pl中的下一个单词
}
}

void Distroy(struct Node *head){
struct Node *p=head, *q;
while(p){
q=p;
p=p->next;
free(q);
}
}追问你这也太复杂了,我就想用数组

热心网友 时间:2022-04-07 13:25

因为代码实现略长,不易展示,所以,只提供方法:

按以上过程实现代码,可以达到单词统计的效果。

如果需要对标点符号的处理,可在读取一个单词后,进行标点符号的检查与处理,再确定是否将数据加到单词数组中。

热心网友 时间:2022-04-07 15:00

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

const int MAXSIZE = 128; // 每个单词不超过128个字符

typedef struct node {
char word[MAXSIZE];
int size;
struct node *next;
}*List,*pNode;

List Init() {
List head;
head = (pNode)malloc(sizeof(struct node));
head->size = 0;
head->word[0] = '\0';
head->next = NULL;
return head;
}

char *toLower(char s[]) { // 小写变大写
int i = 0;
while(s[i]) {
if(s[i] >= 'A' && s[i] <= 'Z')
s[i] += 'a' - 'A';
++i;
}
return s;
}

void Add(List head,char s[]) { // 添加到链表中
pNode p = head;
char t[MAXSIZE];
strcpy(t,toLower(s));
while(p->next) {
if(strcmp(p->next->word,t) == 0) {
++p->next->size;
return;
}
p = p->next;
}
p->next = (pNode)malloc(sizeof(struct node));
strcpy(p->next->word,t);
p->next->size = 1;
p->next->next = NULL;
}

void Sort(List head) { // 根据各个词的数量排序(大到小)
pNode p,q,qt;
char ct[MAXSIZE];
int it;
for(p = head; p->next; p = p->next) {
qt = p;
for(q = p->next; q->next; q = q->next) {
if(strlen(qt->next->word) < strlen(q->next->word))
qt = q;
}
if(p != qt) {
strcpy(ct,p->next->word);
strcpy(p->next->word,qt->next->word);
strcpy(qt->next->word,ct);
it = qt->next->size;
qt->next->size = p->next->size;
p->next->size = it;
}
}
}

void Show(List head, int n,FILE *fp) { // 显示前n个
int i;
pNode p = head->next;
for(i = 0; p; ++i) {
fprintf(fp,"%s\n",p->word);
if(i < n) printf("%3d : %s\n",p->size,p->word);
p = p->next;
}
}

int main() {
char word[MAXSIZE];
List head = Init();
FILE *fin = fopen("data.txt","rt");
FILE *fout = fopen("result.dat","wt");
List list = Init();
if(fin == NULL || fout == NULL) {
printf("不能打开数据文件。\n");
return 1;
}
while(fscanf(fin,"%s",word) == 1)
Add(head,word);
fclose(fin);
Show(head,3,fout);
fclose(fout);
return 0;
}追问抄的滚蛋

追答不会借鉴人家的,你有什么好方法?

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
苹果电脑电池充不进电苹果电脑充不进去电是怎么回事 苹果电脑不充电没反应苹果电脑充电指示灯不亮充不了电怎么办 狗狗更加忠诚护家、善解人意,养一只宠物陪伴自己,泰迪能长多大... 描写泰迪狗的外形和特点的句子 国外留学有用吗 花钱出国留学有用吗 !这叫什么号 百万医疗赔付后是否可以续保 前一年理赔过医疗险还能续保吗? 医疗住院险理赔后还能购买吗? ts7pro手表如何打开蓝牙 南京有哪几个古城门? 南京有哪些玩水的地方 南京玄武区有什么好玩的? 南京有多少个古城门 南京名胜 南京玄武湖有几个门 如果介绍南京,一定要介绍哪些地方呢 奇异果一个多少钱? 南京有城墙古老建筑的适合拍照的地方主要有哪些? 南京有哪些好玩的? 和平门的介绍 银河奇异果年费多少? 我微信绑定的信用卡,在延吉能微信扫码消费信用卡吗,哪个烟店能信用卡消费买烟? 微信绑定信用卡以后 扫一扫支付的话不能用信用卡是吗 信用卡能不能绑定微信,扫码付钱? 我的微信绑定了信用卡,我去超市可以用信用卡扫一扫付钱吗 养仙人掌,做好这3点,根系健壮,叶片肥厚油绿 微信扫一扫可以用信用卡支付吗?? 信用卡显示过期卡绑定微信可以扫吗 智能手表怎么打开蓝牙 蓝牙手表 怎么开机 百度网盘? noerden牛丁智能手表怎么开蓝牙? dotlink智能蓝牙手表怎么用 千牛淘宝我发货了,点了无物流信息发货,怎么办 香辣蟹的做法。 为什么我打开香港和澳门的网页会产生乱码? PHP我要用count统计文本里的单词数的总数再将总数插入数据库 什么是绿色中期票据? 双方同意协调,协议书怎么写 怎么自助解封 微信官方解封自助服务 地方性微信公众号取名?地方性微信公众号取名? 关于地方的微信公众号名 从广西到甘肃兰州需要疫情的什么资料? 老乡你好,请问,你确定支付宝里的琴岛通电子卡在永昌公交车上可以用?你用过?怎么网上用人说不能用? 现在乘火车从河南信阳到甘肃嘉峪关出行码会变色吗 从甘肃景泰坐火车到呼和用核酸检测吗? 甘肃乘火车去三门峡市需要核酸检测报告吗? 现在从深圳回甘肃需要隔离吗