在看到这个题目后,首先确定编写语言,用C语言编写。因为C语言中有很多关于字符串操作的函数可以利用。因为单词和次数是一一对应的,我采用了结构体。将其设为结构体的属性,再设置一个结构体指针。打开文件后,读入字符串,如果这个字符串没出现过,就新建一个结构体指针,对应的次数置1,如果出现过,则对应的次数+1.这样单词就存储在了链表中。排序是比较困难的,因为排序的过程中还要时刻和对应的单词保持相对应,我采用的先比较出最大的,标记其对应的单词,然后以此类推,在每次比较出最大的之后将其对应的次数属性置0,这样不会对下一次的比较产生影响。最后只要对应着输出就好了。以下是比较关键的代码以及源代码:
while(!feof(fp))//读取文件中的单词,并统计每个单词的数量 { char *p=(char*)malloc(20*sizeof(char)); fscanf(fp,"%s",p); if(Head==NULL) //单词没出现过,则把对应的单词数置1 { 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(strcmp(pp->w,p)==0) //单词已出现过,则对应的单词数+1 { int count = pp->k; count++; pp->k = count; break; } 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; } } } 以上是统计文本文档中每个单词的数量,并存储在链表中。
for(i=0;i<10;i++) { q=Head; while(q!=NULL) //每次都选出剩下的次数中最大的 { if(q->k>a[i]) a[i]=q->k; else q=q->next; } q=Head; while(q!=NULL) { if(a[i]==q->k) //每次选出最大的之后,将对应的次数置0,为了不影响下次的比较 { q->k=0; printf("次数:%d\t",a[i]); puts(q->w); break; } else q=q->next; } } 以上是对每个单词的次数进行排序,选出出现次数最高的十个单词,并输出对应的次数。
源代码:
#include#include #include #include struct word{ char w[20]; int k; struct word *next;};int main(){ FILE *fp; int i; int a[10]; struct word *Head=NULL; struct word *q; for(i=0;i<10;i++) a[i]=0; if((fp=fopen("wangdan.txt","r"))==NULL) { printf("无法打开此文件\n"); exit(0); } 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(strcmp(pp->w,p)==0) { int count = pp->k; count++; pp->k = count; break; } 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; } } } for(i=0;i<10;i++) { q=Head; while(q!=NULL) { if(q->k>a[i]) a[i]=q->k; else q=q->next; } q=Head; while(q!=NULL) { if(a[i]==q->k) { q->k=0; printf("次数:%d\t",a[i]); puts(q->w); break; } else q=q->next; } } return 0; }
以上就是解题的经过,总的来说程序的思路还是比较清晰,易懂,在排序的时候代码比较多,方法不够好,影响了程序运行速度,还有待改进。通过本次做题呢,感觉自己进步很大,开始的时候结构体和指针都没有学好,而这次通过复习,加深了我的理解,又多了一种编程的思路。同时对C语言的运用也有了进步,平时动手编程的时候太少,作为一个工科学生,就应该多练习,多实践,去体会编程的乐趣。