拖延症又犯了,不想写作业,但是冥冥之中想到了一句话:与其感慨路难行,不如马上出发。出自dota英雄骷髅弓箭手——克林克兹。于是就这样把我从泥潭中捞了出来。
——————————————————————————————————————————————————————
由于涉及到以后效率评判的问题,重新写了下代码。主要思想是利用二叉排序树结点存储英文单词,然后中序遍历树,将树的信息读取到结构体中,按照单词的频率排序并输出结果。
下面来说一下各部分代码:
1.树的节点的结构体,word用来储存单词的字符信息,考虑到几乎没有单词超过50字符长度,所以长度max设置为50,count是单词个数,*left和*right是指向左右儿子节点的指针。
1 stru啊ct tnode{asdas 2 char word[MAX]; 3 int count; 4 struct tnode *left,*right; 5 };
2.准备用来存储结点内容的表的结构体,理所当然,w要拷贝tnode中word的内容,所以长度也是50。
1 typedef struct word{ 2 int num; 3 char w[50]; 4 }List;
3. cmp()函数,比较两个字符的大小,为以后的qsot做准备。
1 int cmp(const void *a,const void *b) 2 { 3 List *p1 = (List*)a; 4 List *p2 = (List*)b; 5 if(p1->num!=p2->num) 6 return p2->num-p1->num; 7 else 8 return strcmp(p1->w,p2->w); 9 }
4.treeword()函数,作用是构建一个word树,传入一个结点指针(通常是根节点)和一个字符串指针,将word插入树的适当位置(与根节点作对比,若字符小于根节点字符,继续向做遍历,否则向右,直到访问到空指针,生成新的叶子节点),若指向的是树中原有的单词,则对应结点的num增加,若没有按照前面流程生成叶子节点。
1 struct tnode* treewords(struct tnode *p,char *w) 2 { 3 int cond; 4 if(p==NULL){ 5 p=(struct tnode*)malloc(sizeof(struct tnode)); 6 strcpy(p->word,w); 7 p->count=1; 8 p->left=p->right=NULL; 9 } 10 else if((cond=strcmp(w,p->word))==0) 11 p->count++; 12 13 else if(cond<0) 14 p->left=treewords(p->left,w); 15 16 else 17 p->right=treewords(p->right,w); 18 return (p); 19 }
5.treeprint()函数,传入一个节点指针(通常为根节点),然后将其作为根节点中序遍历整个子树。期间arr储存所有节点指针,并得到curr,节点的数目。
1 void treeprint(struct tnode *p) 2 { 3 if(p!=NULL){ 4 5 treeprint(p->left); 6 arr[curr++]=p; 7 treeprint(p->right); 8 9 } 10 }
6,主函数,较复杂,先贴出整个代码:
1 int main() 2 { 3 char word[MAX]; 4 char *fname ; 5 FILE *fin; 6 FILE *fout; 7 char c; 8 int i,k,n; 9 struct tnode *root; 10 root=NULL; 11 12 13 printf("文件输入请按一,标准输入请按二:"); 14 int sflag; 15 scanf("%d",&sflag); 16 17 if(sflag==1) 18 { 19 printf("请输入文件名称: "); 20 scanf("%s",fname); 21 fin = fopen(fname,"r"); 22 fout = fopen("result.txt","w"); 23 } 24 else 25 { 26 fin = stdin; 27 fout = stdout; 28 } 29 30 while((c=fgetc(fin))!=EOF){ 31 ungetc(c,fin); 32 for(i=0;(c=fgetc(fin))!=' '&&c!=' '&&c!=EOF;i++) 33 { 34 if((c>='A'&&c<='Z')||(c>='a'&&c<='z')) 35 { 36 c=tolower(c); 37 word[i]=c; 38 }else 39 break; 40 } 41 word[i]='