修改上一题目

上次写到用数组来存放每个单词,但是考虑到数组是连续的,应用起来不灵活,所以改换成了用栈来存放,定义一个结构体,存放单词,同时记录单词的个数,当进行一个单词的压栈时,首先进行比较,栈里存在这个单词就让个数加一,否则把单词压栈,把所有的单词压栈后再进行排序,把频率最高的十个单词输出,这里并不是把所有单词进行排序,而是找出频率高的十个单词,提高速率,但是个人觉得这个代码不精简,希望各位多提意见,共同探讨,以下为个人代码和输出。

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

posted @ 2014-03-02 14:46  蔡迎盈2014  阅读(231)  评论(1编辑  收藏  举报