标题:哈夫曼树编码中的一些问题,求助
只看楼主
林小拉
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2012-12-27
结帖率:50%
已结贴  问题点数:10 回复次数:7 
哈夫曼树编码中的一些问题,求助
void huffmancode(Huffman &h,HuffCode &code,int leaves)
{
    int i,j,p,c;
    HCode hf;
    char x[leaves][LEN];
    code=(HuffCode)malloc((leaves)*sizeof (HCode));
    for(i=0;i<leaves;i++)
    {
        c=i;
        p=h[i].parent;
        hf.start=LEN-1;
        while(p!=-1){
            if(h[p].LChild==c){
                hf.bit[hf.start]=0;
            }
            else
            {
                hf.bit[hf.start]=1;
            }
            --hf.start;
            c=p;
            p=h[c].parent;
        }
        cout<<h[i].ch<<"("<<h[i].weight<<"):";

        for(j=hf.start+1;j<LEN;j++){
            code[i].bit[j]=hf.bit[j];
            cout<<code[i].bit[j];
            x[i][j]=code[i].bit[j]+'0';
            cout<<x[i][j];
        }

        cout<<"\t";
        code[i].start=hf.start+1;

    }

    for(int m=0;m<leaves;m++)
    for(int n=0;n<LEN;n++)
      cout<<x[m][n];
    for(int k=0;k<leaves;k++)
      puts(x[k]);         //为什么这里输出是乱码?
}
搜索更多相关主题的帖子: void leaves 
2013-01-16 22:46
林小拉
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2012-12-27
得分:0 
以下是全部代码
#include<iostream>
#include<string>
#include<cstdio>
#include<cstdlib>
using namespace std;
#define LEN 8
typedef double DataType;
typedef struct
{
    char ch;
    int parent;
    int LChild;
    int RChild;
    DataType weight;
}HNode,*Huffman;
typedef struct
{
    int start;         //存放编码的起始位置(从高位向低位,从右向左)
    int bit[LEN];      //存放huffman编码
}HCode,*HuffCode;
void createHuffmanTree(Huffman &h,int leaves,DataType *weight,char *ch)
{
    int i,j;
    int l=2*leaves-1;
    h=(Huffman)malloc((l+1)*sizeof(HNode));
    for(i=0;i<leaves;i++)          //初始化
    {
        h[i].parent=-1;
        h[i].LChild=-1;
        h[i].RChild=-1;
        h[i].weight=0;
        h[i].ch=0;
    }
    for(i=0;i<leaves;i++)       //给叶子赋权重
    {
        h[i].weight=*(weight+i);
        h[i].ch=*(ch+i);
    }
    for(i=0;i<leaves-1;i++)
    {
        DataType m1,m2;
        int m1_pos,m2_pos;
        m1=m2=65536;
        m1_pos=m2_pos=0;
        for(j=0;j<leaves+i;j++)
    {
         if(h[j].weight<m1&&h[j].parent==-1)
         {
            m2=m1;
            m1=h[j].weight;
            m2_pos=m1_pos;
            m1_pos=j;
         }
         else if(h[j].weight<m2&&h[j].parent==-1)
         {
            m2=h[j].weight;
            m2_pos=j;
         }
    }
    h[leaves+i].parent=-1;
    h[leaves+i].LChild=m1_pos;
    h[leaves+i].RChild=m2_pos;
    h[m1_pos].parent=leaves+i;
    h[m2_pos].parent=leaves+i;
    h[leaves+i].weight=m2+m1;
    }
}
void huffmancode(Huffman &h,HuffCode &code,int leaves)
{
    int i,j,p,c;
    HCode hf;
    char x[leaves][LEN];
    code=(HuffCode)malloc((leaves)*sizeof (HCode));
    for(i=0;i<leaves;i++)
    {
        c=i;
        p=h[i].parent;
        hf.start=LEN-1;
        while(p!=-1){
            if(h[p].LChild==c){
                hf.bit[hf.start]=0;
            }
            else
            {
                hf.bit[hf.start]=1;
            }
            --hf.start;
            c=p;
            p=h[c].parent;
        }
        cout<<h[i].ch<<"("<<h[i].weight<<"):";

        for(j=hf.start+1;j<LEN;j++){
            code[i].bit[j]=hf.bit[j];
            cout<<code[i].bit[j];
            x[i][j]=code[i].bit[j]+'0';
            cout<<x[i][j];
        }

        cout<<"\t";
        code[i].start=hf.start+1;

    }

    for(int m=0;m<leaves;m++)
    for(int n=0;n<LEN;n++)
      cout<<x[m][n];
    for(int k=0;k<leaves;k++)
      puts(x[k]);
}

void main(){
   Huffman h;
 HuffCode code;
   int leaves;
   cout<<"请输入结点数leaves:"<<endl;
   cin>>leaves;
   char ch[leaves];
   cout<<"请输入字符"<<endl;
     for(int i=0;i<leaves;i++){
    cin>>ch[i];
    }
    DataType weight[leaves];
   cout<<"请输入每个字符对应的权值"<<endl;
   for(int i=0;i<leaves;i++){
    cin>>weight[i];
    }
createHuffmanTree(h,leaves,weight,ch);
cout<<"输出各个权值的编码:"<<endl;
huffmancode(h,code,leaves);
 }




2013-01-16 22:47
锋了
Rank: 7Rank: 7Rank: 7
来 自:向日葵幼儿园
等 级:黑侠
威 望:2
帖 子:306
专家分:586
注 册:2012-10-27
得分:0 
你这个是C++的哦,应该到C++板块去猜好。。。我指点问题哦

你一个引用何来的分配内存?你知道指针跟引用的却别没有
void huffmancode(Huffman &h,HuffCode &code,int leaves)
     code=(HuffCode)malloc((leaves)*sizeof (HCode));???
后面的没看到,在论坛发帖最好不要把全部代码发出来,发哪里不明白或问题所发生的地方就可以了
试想如果是你你会看这么长的代码吗

2013-01-16 23:08
林小拉
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2012-12-27
得分:0 
求助啊!!!
2013-01-16 23:08
林小拉
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2012-12-27
得分:0 
回复 3楼 锋了
我是新手嘛,以后不会了。。。不过我问的你没有答。。。我只想问,为什么用puts输出二维数组的每一行。会出现乱码?
2013-01-16 23:10
锋了
Rank: 7Rank: 7Rank: 7
来 自:向日葵幼儿园
等 级:黑侠
威 望:2
帖 子:306
专家分:586
注 册:2012-10-27
得分:10 
实在看不下去啊。。。。要费神才行
你这里是想做什么?
x[i][j]=code[i].bit[j]+'0';
如果是想在字符串后面添加结束符的话是这样
x[i][j]=code[i].bit[j]+'\0';
少了”\“。
2013-01-16 23:23
林小拉
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2012-12-27
得分:0 
回复 6楼 锋了
我是把int转成char
2013-01-16 23:31
锋了
Rank: 7Rank: 7Rank: 7
来 自:向日葵幼儿园
等 级:黑侠
威 望:2
帖 子:306
专家分:586
注 册:2012-10-27
得分:0 
我在3楼讲的那个问题你改没有
2013-01-17 12:44



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-396830-1-1.html




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

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