中易网

C语言,修改代码使只显示出现次数最多的10个单词及其出现次数

答案:2  悬赏:10  
解决时间 2021-02-16 09:44
可以读出文件中出现所有单词的出现次数并显示,求只显示出现次数最多的10个单词及其出现次数,请在原代码上修改
现代码如下:
#include
#include
#include
#include
struct Word {
char w[20];
int k;
struct Word *next;
};
int main(int argc, char *argv[])
{
FILE *fp = fopen("input.txt","r");
struct Word *Head = NULL;
while (!feof(fp)) {
char *p = (char *)malloc(20*sizeof(char));
fscanf(fp, "%s", p);
if(Head == NULL){
struct Word *temp = (struct Word *)malloc(sizeof(struct Word));
strcpy(temp->w, p);
temp->k = 1;
temp->next = NULL;
Head = temp;
} else {
struct Word *pp = Head;
while (pp != NULL) {
if (strcasecmp( pp->w, p) == 0){
++pp->k;
break;
} else {
pp = pp->next;
}
}
if (pp == NULL){
struct Word *temp = (struct Word *)malloc(sizeof(struct Word));
strcpy(temp->w, p);
temp->k = 1;
temp->next = Head;
Head = temp;
}
}
}
struct Word *q = Head;
while (q != NULL) {
printf("%s ", q->w);
printf("%d\n", q->k);
q = q->next;
}
return 0;
}
最佳答案
#include
#include
struct
{
char str[99]; //单词
int n;  //出现次数
}a[99]={"",0},t; //初始化
int main()
{
FILE *fp;
    unsigned i,j,times=0;
fp=fopen("test.txt","r");
if(fp==NULL)return 1;
for(i=0;i<99;i++)
{
fscanf(fp,"%s",a[i].str);//输入字符串存储到结构体中
a[i].n++; //计算出现次数
for(j=0;j if(strcmp(a[i].str,a[j].str)==0) //如果和前面的相同
{
if(a[j].n!=0)a[j].n++; //不为0的加一
a[i].n=0; //置为0
}
times++; //计算字符串个数
if(fgetc(fp)==EOF)break;
}
for(i=0;i for(j=0;j if(a[j].n {       //交换结构体
t=a[j];
a[j]=a[j+1];
a[j+1]=t; 
}
for(i=0;i<10;i++) //输出前十个出现次数最多
printf("%s  %d\n",a[i].str,a[i].n);
return 0;
}
全部回答
帮你写了一个,看看吧。根据自己的实际情况再改改,如果有必要的话: #include <stdio.h> #include <string.h> #define m 1000 #define n 20 void main() {     char str1[m][n];//单词字串结果存放数组     char str2[m];//输入串或者用char *str2也可,这样可以     int strc[m];//单词字串计数数组.对应每个单词串,拥有一个计算器     int i=0,j=0,k=0,t=0,x=0;     gets(str2);//接受行输入     t=strlen(str2)+1;//计算该行中总字符数     printf("输入字串为:%s\n",str2);          while(j<t)       {         for(;str2[j]==32;j++);//如果串中是空格,则拼命跳过,不计         while(k<n&&str2[j]!=32) //不是空格,且没有超出题目中的要求: 每个字串长度小于n.如果大于n,自动截除.                 str1[i][k++]=str2[j++];  //将输入行字串分割存放到结果数组中            str1[i][k]='\0'; //如果该串原来大于20,会被自动截除         strc[i]=1;   //计数         for(x=0;x<i;x++) //与前面的串比较             if(strncmp(str1[i],str1[x],n)==0)//调用库函数,不分大小写与前面的串相比,相同则返回0.                 {                 strc[x]++; //相同,计数器数组增加                 i--; //该串为重复串,总串数不增加                     break; //跳出for循环             }                 i++;   //无重复串,则总字串数增加             k=0;     }          printf("结果:\n");       t=0;     for(;t<i;t++)//不超出总串数         printf("%s,%d\n",str1[t],strc[t]);    }
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
传真机显示DOCUMENT JAMMED怎样解决
你好,学长,我想考北外的国际汉硕,想要最近
如海超市白峰连锁店在什么地方啊,我要过去处
农家小厨香辣馆这个地址在什么地方,我要处理
君威2014款怎么样
你们城市的垃圾洒水车放什么歌?
胜民平价超市这个地址在什么地方,我要处理点
求一个关于等待对方的网名
360安全卫士下载成功后安装都失败
从日本能向中国邮酒吗?
怎么修改电脑的登录密码,我的系统是XP的,
新一佳服装超市在哪里啊,我有事要去这个地方
乐都县开锁电话?????????
自行车发电。 需要什么东西
篮球技能学习曲线评价
推荐资讯
没有成都户口可以买房吗?有哪些楼l盘不限购
我被骗汇款10000元!现在已经报警了!能找回
我家新养了两只小猫,一个月左右,我发现我好
光伏发电造成台区负线损是什么原因
为什么我登网上银行是输完密码浏览器会无响应
比喻牛的成语有哪些
五得利超精面粉合格证在袋子哪里
小闫饭店地址有知道的么?有点事想过去
批州秋皮沟建龙山庄这个地址在什么地方,我要
女主是朝日奈的继妹,柯南的朋友,有一只寄生兽
为什么不断有大单卖出,是主力在出货吗
荆门公交卡在哪里办
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?