回 帖 发 新 帖 刷新版面

主题:小妹拜求哈夫曼算法!!!!!!!

各位英雄好汉:
    由于马上就要上机检查了,只怪鄙人愚钝,无法定期将作业完成,只好来找各位帮忙了.
     具体问题描述如下:
     打开一篇英文文章,统计该文章中每一个字符出现的次数,然后以它们作为权值,对每一个字符进行编码,编码完成后再对其编码进行译码.
    最好写上详细的注释说明,不然小妹又要发傻了.[em10]

回复列表 (共8个回复)

沙发

各位大虾们
怎么就不给我这一弱女子一点点的安慰呢
我幼小的心灵已经经不起这种折磨了
快来帮帮我吧[em12]

板凳

再没人回消息我就只有撒手人寰了啊
55555555555555555555555555555555555555

3 楼

你是OIer吗?
如果是,一个这样简单的问题,
应该自己解决。
如果实在不行,
再跟我联系。
QQ:285219619

4 楼

也可到我的BLOG上找

5 楼

//***************************************************************
此程序根据用户输入的结点值和权重建立哈夫曼树,然后输出哈夫曼编
****************************************************************/
#include <stdio.h>
#define MAX 21
typedef struct
{
    char data; /*结点值*/
    int weight; /*权值*/
    int parent; /*父结点*/
    int left; /*左结点*/
    int right;/*右结点*/
}huffnode;

typedef struct
{
    char cd[MAX];
    int start;
}huffcode;

main()
{
    huffnode ht[2*MAX];
    huffcode hcd[MAX],d;
    int i,k,f,l,r,n,c,m1,m2;

    printf("输入元素个数:");
    scanf("%d",&n);

    for (i=1;i<=n;i++)
    {
        getchar();
        printf("第%d个元素=>\n\t结点值:",i);
        scanf("%c",&ht[i].data);
        printf("\t权重:");
        scanf("%d",&ht[i].weight);
    }

    for (i=1;i<=2*n-1;i++)  
        ht[i].parent=ht[i].left=ht[i].right=0;

    for(i=n+1;i<=2*n-1;i++)/*构造哈夫曼树*/
    {
        m1=m2=32767;
        l=r=0;             /*l和r是最小权重的两个结点位置*/
        for(k=1;k<=i-1;k++)
            if  (ht[k].parent==0)
                if(ht[k].weight<m1)
                {
                    m2=m1;
                    r=l;
                    m1=ht[k].weight;
                    l=k;
                }
                else if (ht[k].weight<m2)
                {
                    m2=ht[k].weight;
                    r=k;
                }

                ht[l].parent=i;
                ht[r].parent=i;
                ht[i].weight=ht[l].weight+ht[r].weight;
                ht[i].left=l;
                ht[i].right=r;
    }
    for(i=1;i<=n;i++)    /*根据哈夫曼树求哈夫曼编码*/
    {
        d.start=n+1;
        c=i;
        f=ht[i].parent;

        while(f!=0)
        {
            if(ht[f].left==c)
                d.cd[--d.start]='0';
            else
                d.cd[--d.start]='1';
            c=f;
            f=ht[f].parent;
        }
        hcd[i]=d;
    }

    printf("输出哈夫曼编码: \n");
    for(i=1;i<=n;i++)
    {
        printf("%c: ",ht[i].data);
        for(k=hcd[i].start;k<=n;k++)
            printf("%c",hcd[i].cd[k]);
        printf("\n");
    }
}

6 楼

程序能运行
能不能给程序注释一下啊
很多看不懂啊

7 楼

为了感谢你,让我注册了这个网沾,真麻烦,不过还算好,可以对你说声谢谢了!谢谢你,这个程序直接能运行!!呵呵.....

8 楼


可惜我现在才看见
不然给你一个不错的代码
下次吧
 M M

我来回复

您尚未登录,请登录后再回复。点此登录或注册