| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1470 人关注过本帖
标题:一个关于哈夫曼编码的问题,运行结果不正确,看了好几天了,不知道哪里有问 ...
取消只看楼主 加入收藏
丶木清丶
Rank: 2
等 级:论坛游民
帖 子:7
专家分:22
注 册:2017-11-27
收藏
 问题点数:0 回复次数:0 
一个关于哈夫曼编码的问题,运行结果不正确,看了好几天了,不知道哪里有问题。
输入一个英文字符串,对该字符串中各字符个数进行统计取得各字符的出现次数;以其出现次数作为关键字建立哈夫曼树并进行编码,最后输出各个字符对应的码值。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAXSIZE 30

/*记录字符串的数据结构*/
typedef struct
{
    int len;
    char *string;                   //需要记录的字符串
    char elem[MAXSIZE];             //该字符串所拥有的元素
    int count[MAXSIZE];             //该字符串相应元素的个数
}record;

/*哈夫曼树的数据结构*/
typedef struct
{
     int weight;                             //用来存放各个结点的权值
     int parent;  //指向双亲,孩子结点的指针
     int LChild;
     int RChild;
}HTNode,*HuffmanTree;          //动态分配数组,存储哈弗曼树

typedef char**HuffmanCode;    //动态分配数组,存储哈夫曼编码

void swap(int *x,int *y)
{
    int temp=*x;
    *x=*y;
    *y=temp;
}

void select(HuffmanTree *ht,int n,int *s1,int *s2)
{
    int min1=(*ht)[1].weight,min2=(*ht)[2].weight;
    *s1=1,*s2=2;
    if(min1>min2)
    {
        *s1=2;
        *s2=1;
        swap(&min1,&min2);
    }
    for(int i=3;i<=n;i++)
    {
        if((*ht)[i].weight<min1)
        {
            min2=min1;
            min1=(*ht)[i].weight;
            *s2=*s1;
            *s1=i;
        }
        else if((*ht)[i].weight<min2)
        {
            min2=(*ht)[i].weight;
            *s2=i;
        }
    }
}
void CrtHuffmanTree(HuffmanTree *ht,HuffmanCode *hc,int *w,int n)
{
    int m,i,s1,s2,start,c,p;
    char *cd;
    m=2*n-1;
    *ht=(HTNode *)malloc((m+1)*sizeof(HTNode));
    for(i=1;i<=n;i++)
    {
        (*ht)[i].weight=w[i];
        (*ht)[i].LChild=0;
        (*ht)[i].parent=0;
        (*ht)[i].RChild=0;
    }
    for(i=n+1;i<=m;i++)
    {
        (*ht)[i].LChild=0;
        (*ht)[i].parent=0;
        (*ht)[i].RChild=0;
        (*ht)[i].weight=0;
    }
    for(i=n+1;i<=m;i++)
    {
        select(ht,i-1,&s1,&s2);
        (*ht)[s1].parent=i;
        (*ht)[s2].parent=i;
        (*ht)[i].LChild=s1;
        (*ht)[i].RChild=s2;
        (*ht)[i].weight=(*ht)[s1].weight+(*ht)[s2].weight;
    }//哈夫曼树建立完毕

    *hc=(HuffmanCode)malloc((n+1)*sizeof(char *));
    cd=(char *)malloc(n*sizeof(char));
    cd[n-1]='\0';
    for(i=1;i<=n;i++)
    {
        start=n-1;
        for(c=i,p=(*ht)[i].parent;p!=0;c=p,p=(*ht)[p].parent)
            if((*ht)[p].LChild==c)
                cd[--start]='0';
            else
                cd[--start]='1';
        (*hc)[i]=(char *)malloc((n-start)*sizeof(char));
        strcpy((*hc)[i],&cd[start]);
    }
    free(cd);
}

void trans(record *s,char *p)
{
    int i=0,k=0,j,flag=0;
    s->len=0;
    while(*(p+i)!='\0')
    {
        for(j=1;j<=k;j++)
        {
            flag=0;
            if(*(p+i)==s->elem[j])
            {
                flag=1;
                s->count[j]++;
                break;
            }
        }
        if(flag==0)              
        {
            k++;
            s->len++;
            s->elem[k]=*(p+i);
            s->count[k]=1;
        }
        i++;
    }
}

int main()
{
    char a[20]="abbcccdddd";
    record s;
    HuffmanTree ht;
    char ** hc;
    trans(&s,a);
    CrtHuffmanTree(&ht,&hc,s.count,s.len);
    printf("%s\n",*(hc+1));
    return 0;
}
搜索更多相关主题的帖子: 哈夫曼 int char parent for 
2017-11-28 12:52
快速回复:一个关于哈夫曼编码的问题,运行结果不正确,看了好几天了,不知道哪里 ...
数据加载中...
 
   



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

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