用的二叉排序树,挺快的! #include<stdio.h> #include<stdlib.h> #include<string.h> typedef struct node//树节点 { char name[31]; float num; struct node * lchild; struct node * rchild; }node; int SearchBST( node* T,char in[], node *f, node *&p) //搜索二叉排序树 { if(!T){ p = f; return 0;} else if(strcmp(in,T->name)==0){ p = T;return 1;} else if(strcmp(in,T->name)<0){return SearchBST(T->lchild,in,T,p);} else if(strcmp(in,T->name)>0){return SearchBST(T->rchild,in,T,p);} } int InsertNode( node *root,char in[])//在二叉排序树上插入节点 { node *p=NULL,*s = NULL; if(!SearchBST(root,in,NULL,p)) { s = (node *)malloc(sizeof(node)); strcpy(s->name,in); s->num = 1;s->lchild = s->rchild = NULL; if(!p) p = s; else if(strcmp(in,p->name)>0)p->rchild = s; else p->lchild = s; return 1; } else { (p->num)++; return 0; } } void mids(node *root,int n) //中序遍历树使输出信息 { if(root) { mids(root->lchild,n); printf("%s %.4f/n",root->name,root->num/n*100.0f); mids(root->rchild,n); } } int main() { char in[31];int n=1; node* root = NULL; while(gets(in)) { if(!root) { root = (node *)malloc(sizeof(node)); strcpy(root->name,in); root->num = 1; root->lchild = root->rchild=NULL; } else { n++; InsertNode(root,in); } } mids(root,n); return 0; }