哈夫曼树的编码和译码

来源:互联网 发布:微信开发 php java 编辑:程序博客网 时间:2024/05/01 16:38
<pre name="code" class="cpp">#include<stdio.h>#define maxnum 1000.0#define maxsize 100typedef struct{    char ch;    float weight;    int lchild,rchild,parent;}hufftree;typedef struct{    char coder[maxsize];    int start;    char c;}huffcode;hufftree tree[maxsize];huffcode code[maxsize];void huffman(hufftree tree[],int m,int n){    int i,j;    int p1,p2;    float small1,small2;    for(i=0;i<m;i++)    {        tree[i].lchild=-1;        tree[i].parent=0;        tree[i].rchild=-1;        tree[i].weight=0.0;    }     printf("请输入前%d个结点的字符及权值,中间用空格隔开\n",n);     for(i=0;i<n;i++)     {         printf("输入第%d个字符为和权值",i+1);          getchar();         scanf("%c %f",&tree[i].ch,&tree[i].weight);     }     for(i=n;i<m;i++)     {         p1=0;p2=0;         small1=small2=maxnum;         for(j=0;j<i;j++)            if(tree[j].parent==0)                if(tree[j].weight<small1)                     {                         small2=small1;                         small1=tree[j].weight;                         p2=p1;                         p1=j;                     }                else if(tree[j].weight<small2)                     {                         small2=tree[j].weight;                         p2=j;                     }            tree[p1].parent=i;            tree[p2].parent=i;            tree[i].lchild=p1;            tree[i].rchild=p2;            tree[i].weight=tree[p1].weight+tree[p2].weight;     }}void huffmancode(hufftree tree[],huffcode code[],int m,int n){    int i,j,c,p;    huffcode temp;    for(i=0;i<n;i++)    {        temp.start=n;        temp.c=tree[i].ch;        c=i;        p=tree[i].parent;        while(p!=0)        {            temp.start--;            if(tree[p].lchild==c)                temp.coder[temp.start]='0';            else                temp.coder[temp.start]='1';            c=p;            p=tree[p].parent;        }        code[i]=temp;    }     printf("输出每个字符的哈夫曼编码:\n");     for(i=0;i<n;i++)     {         printf("%c: ",code[i].c);         for(j=code[i].start;j<n;j++)             printf("%c",code[i].coder[j]);         putchar('\n');     }}void transcode(hufftree tree[],int m,int n){    int i,j=0;    char codes[maxsize];    char end='e';    i=m-1;    printf("输入发送的编码(以'e'为结束标志):");    //gets(codes);    scanf("%s",codes);    printf("译码后的字符为");    while(codes[j]!='e')    {        if(codes[j]=='0')            i=tree[i].lchild;        else            i=tree[i].rchild;        if(tree[i].lchild==-1)        {            printf("%c ",tree[i].ch);            i=m-1;        }        j++;    }}int main(){int n=maxsize;int m=maxsize;    printf("                      哈夫曼的编码以及译码\n");    printf("输入字符个数:");    scanf("%d",&n);    printf("________________________________________\n");    m=2*n-1;    huffman(tree,m,n);    huffmancode(tree,code,m,n);    printf("________________________________________\n");    transcode(tree,m,n);    return 0;}


                                             
0 0
原创粉丝点击