#define N 100
void insertstr(char str[]) //输入字符串 {
printf(\请输入一个字符串:\\n\ scanf(\}
int countstr(char str[],CNode *CharNode) 保存在CNode中 {
int i,j,a=0;
for(i=0;i CharNode[i].flag=-1; CharNode[i].num=0; CharNode[i].c='|'; } for(i=0;str[i]!='\\0';i++) { for(j=0;j } else if(CharNode[j].flag==-1) 第15页 共21页 //记录字符出现次数,并 } } { } a++; CharNode[j].c=str[i]; CharNode[j].num++; CharNode[j].flag=0; break; return a; } void dispCNode(CNode *CharNode,int n) { int i; printf(\输入的字符极其出现次数如下 :\\n\ for(i=0;i void CreateHT(HTNode ht[],int n) //构造哈弗曼树 { int i,j,k,lnode,rnode; double min1,min2; //分别存放lnode和rnode的两个结点位置 第16页 共21页 if(CharNode[i].flag!=-1) { } printf(\printf(\ for(i=0;i<2*n-1;i++) //所有结点的相关域置-1 ht[i].parent=ht[i].lchild=ht[i].rchild=-1; for(i=n;i<2*n-1;i++) { min1=min2=32767; lnode=rnode=-1; for(k=0;k<=i-1;k++) if(ht[k].parent==-1) { if(ht[k].weight } else if(ht[k].weight } ht[i].weight=ht[lnode].weight+ht[rnode].weight; ht[i].lchild=lnode; ht[i].rchild=rnode; 结点 ht[lnode].parent=i; ht[rnode].parent=i; } } 第17页 共21页 //ht[i]作为双亲 void CreateHCode(HTNode ht[],HCode hcd[],int n) //求哈弗曼编码 { int i,f,c; HCode hc; for(i=0;i f=ht[i].parent; while(f!=-1) { if(ht[f].lchild==c) hc.cd[hc.start--]='0'; else hc.cd[hc.start--]='1'; c=f; f=ht[f].parent; } hc.start++; hcd[i]=hc; } } int DispHCode(HTNode ht[],HCode hcd[],int n) { int i,k; int j; int MAX=0; printf(\输出哈弗曼编码:\\n\ for(i=0;i 第18页 共21页 //输出哈弗曼编码 { } return MAX; } void insertstr1(char str1[]) //输入哈弗曼编码 { int i; for(i=0;i str1[i]='\\0'; //初始化str1[] j=0; printf(\for(k=hcd[i].start;k<=n;k++) { } printf(\ printf(\j++; if(j>=MAX) MAX=j; printf(\请输入一串需要译码的哈弗曼编码:\\n\ scanf(\} int strcompare(HCode hcd[],char temp[],int a,int n) //字符串比较函数 { int i,j=hcd[a].start; char str[30]=\ for(i=0;j<=n;i++,j++) { 第19页 共21页