logo资料库

对任意输入的一段英文,为每个字符编制其相应的赫夫曼编码;并利用该编码为任意输入的0、1序列进行解码..docx

第1页 / 共3页
第2页 / 共3页
第3页 / 共3页
资料共3页,全文预览结束
#include #include #include typedef struct { char ch; int weight; int parent,lchild,rchild; }HTnode,*Huffmantree; typedef char **Huffmancode; int main() { //------------构造赫夫曼树及赫夫曼编码------------------- //---------Huffmancoding--------------------------------- //动态分配数组存储赫夫曼编码表 Huffmantree HT; Huffmancode HC; char *cd,s[100],g[100]; int n,mm,m,i,j=0,f,start,c,s1=0,s2=0,temp1,temp2; int w[26]; int a[26]={0}; printf("请输入一段字符:"); gets(s); n=strlen(s); //HT=(Huffmantree )malloc((m+1)*sizeof(HTnode));//0 号单元未用 for(i=0;i0),构造赫夫曼树 HT,并求出 n 个字符的赫夫曼编码 HC n=j; m=2*j-1; HT=(Huffmantree )malloc((m+1)*sizeof(HTnode));//0 号单元未用 for(i=0,j=0;i<26;i++) if(a[i]!=0) { HT[j+1].ch=i+'a'; j++; }
for(i=1,j=0;i<=n;++i,++j) { HT[i].weight=w[j]; HT[i].parent=HT[i].lchild=HT[i].rchild=0; //n 个叶子赋初值 } for(;i<=m;++i) HT[i].weight=HT[i].parent=HT[i].lchild=HT[i].rchild=0; //除叶子外的节点赋初 值 for(i=n+1;i<=m;i++) { //建赫夫曼树 //在 HT[1..i-1]选择 parent 为 0 且 weight 最小的两个节点,其序号为别为 s1,s2. temp1=temp2=100; for(j=1;j<=i-1;j++) if(HT[j].parent==0) if(HT[j].weight
start=n-1; for(c=i,f=HT[i].parent;f!=0;c=f,f=HT[f].parent) //编码结束符位置 //从叶子到根逆向求编码 if(HT[f].lchild==c) cd[--start]='0'; else cd[--start]='1'; HC[i]=(char *)malloc((n-start)*sizeof(char)); strcpy(HC[i],cd+start); //从 cd 复制编码到 HC //为第 i 个字符编码分配空间 } free(cd); printf("\nnum bianma\n"); for(i=1;i<=n;i++) printf("%-5d%s\n",i,HC[i]); //--------------Huffmancoding----------------------------------------------------- printf("\n 请输入一段 0-1 编码\n"); gets(g); printf("\n 解码后为:"); mm=m; for(i=0;i<=(signed)strlen(g);) { if(HT[mm].lchild==0&&HT[mm].rchild==0) { printf("%c",HT[mm].ch); mm=m; //continue; } else { if(g[i]=='0') { mm=HT[mm].lchild; i++; } else { mm=HT[mm].rchild; i++; } } } printf("\n"); return 0; }
分享到:
收藏