| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 435 人关注过本帖
标题:哈弗曼编码
只看楼主 加入收藏
ztxzhc001
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2008-12-13
结帖率:66.67%
收藏
已结贴  问题点数:20 回复次数:3 
哈弗曼编码
程序代码:
#include "stdio.h"
#define MAXVALUE 10000
typedef struct  
{
    int weight;
    int lchild;
    int rchild;
    int flag;
    int parent;
}HuffNode;

typedef struct  
{
    int weight;
    int len;
    char code[100];
}Code;


void Create(int weight[],HuffNode huff[],int n)
{
    for(int i=0;i<2*n-1;i++)                   //n个叶子结点有2n-1个结点
    {
        huff[i].weight=(i<n)?weight[i]:0;
        huff[i].lchild=-1;
        huff[i].rchild=-1;
        huff[i].flag=0;
        huff[i].parent=-1;

    }
}

void Huffman(HuffNode huff[],int n)
{
    int m1,m2;
    int x1,x2;

    for(int i=0;i<n;i++)
    {
        m1=m2=MAXVALUE; 
        x1=-1;
        x2=-1;
    
        for(int j=0;j<n+i;j++)
        {
            if(huff[j].flag==0)
            {
                if(huff[j].weight<m2)
                {
                    m1=m2;
                    x1=x2;
                    
                    m2=huff[j].weight;
                    x2=j;
                }
                else if(huff[j].weight<m1)
                {
                    m1=huff[j].weight;
                    x1=j;
                }
            }
        }
        huff[n+i].weight=huff[x1].weight+huff[x2].weight;
        huff[n+i].lchild=x1;
        huff[n+i].rchild=x2;
        huff[x1].parent=n+i;
        huff[x2].parent=n+i;
        huff[x1].flag=1;
        huff[x2].flag=1;
    }
}


void HuffCode(HuffNode huff[],int n,Code code[])
{

    int parent;
    int child;
    Code cd;
    int t;
    

    
    
    for(int i=0;i<n;i++)
    {
        code[i].weight=huff[i].weight;
        code[i].len=0;    
        
        child=i;
        cd.len=0;
        parent=huff[child].parent;
        t=0;
        while (parent!=-1)
        {
            cd.code[cd.len++]=(huff[parent].lchild==child)?'1':'0';
            child=parent;
            
            parent=huff[child].parent;
        }

        for(int j=0;j<cd.len;j--)
        {
            code[i].code[j]=cd.code[t];
            t++;
            
        }
        code[i].len=cd.len;
    }

}

void Print(Code code[],int n)
{
    printf("Output Code:");
    for(int i=0;i<n;i++)    
        printf("%s",code[i].code);
}

void main()
{
    int weight[5]={27,3,76,99,12};
    HuffNode huff[100];
    Code code[100];
    Create(weight,huff,5);
    Huffman(huff,5);
    HuffCode(huff,5,code);
}
搜索更多相关主题的帖子: 哈弗曼 编码 
2009-07-14 12:32
ztxzhc001
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2008-12-13
收藏
得分:0 
回复 楼主 ztxzhc001
编译无错。运行有错误。
大概在HuffCode函数段。 麻烦帮看看。谢谢。
2009-07-14 12:33
rofor
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:68
专家分:165
注 册:2009-6-12
收藏
得分:20 
我只听过某江湖郎中讲过一次,根本没实现过,虽然这个比较有用.

I'm rofor.
for(;;;);  :-)
RoFoR [AT] YaHoO [DoT] CN
2009-07-14 12:43
ztxzhc001
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2008-12-13
收藏
得分:0 
.....
作业。 和学位挂钩得考试要考。。
我能不学么。。
2009-07-14 12:44
快速回复:哈弗曼编码
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.012228 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved