修改上一题目
上次写到用数组来存放每个单词,但是考虑到数组是连续的,应用起来不灵活,所以改换成了用栈来存放,定义一个结构体,存放单词,同时记录单词的个数,当进行一个单词的压栈时,首先进行比较,栈里存在这个单词就让个数加一,否则把单词压栈,把所有的单词压栈后再进行排序,把频率最高的十个单词输出,这里并不是把所有单词进行排序,而是找出频率高的十个单词,提高速率,但是个人觉得这个代码不精简,希望各位多提意见,共同探讨,以下为个人代码和输出。
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <malloc.h> typedef struct StackNode{ int num; char s[30]; struct StackNode *next; }StackNode,*LinkStack; int InitStack(LinkStack &S){ S=NULL; return 1; } int Push(LinkStack &S,char str[]){ LinkStack p; p=new StackNode; p->num=1; for(int w=0;w<30;w++) {p->s[w]=str[w]; } p->next=S; S=p; return 1; } void Paixu(LinkStack &S) { LinkStack q,p; for(int e=0;e<10;e++){ q=S; p=S; while(q){ if(p->num<q->num) p=q; q=q->next;} printf(" %s \t%d\n",p->s,p->num); p->num=0; } } int main() { LinkStack S,p,q; FILE *fp; int n=1,j=0,k; char ch,str[30],infile[20]; printf("请输入文件名称:"); scanf("%s",infile); if ((fp=fopen(infile,"r"))==NULL) {printf("无法打开此文件!\n"); exit(0);} InitStack(S); while(!feof(fp) && ch!=10) {p=S; int i=0,a=0; ch=fgetc(fp); while(ch!=' '&&!feof(fp)&&ch!=10) {str[i]=ch;
i++;
ch=fgetc(fp); } if(i!=0){ str[i]='\0'; while(p) { if(strcmp(p->s,str)==0) {p->num+=1;a=1;} p=p->next; } if(a==0) Push(S,str);}
} printf("***********单词统计结果*************\n"); printf(" 单词 频率 \n"); Paixu(S); printf("***********谢谢!*******************\n"); fclose(fp); return 0; }