24小时热门版块排行榜    

北京石油化工学院2026年研究生招生接收调剂公告
查看: 2071  |  回复: 8

viking1992

新虫 (初入文坛)

[求助] 编程废又来求助关于哈弗曼树的C++代码……

其实明天就要交了!!虽然哈弗曼的原理都没有搞清楚但是实在是没有办法啊!!!
求高人指点为什么我的程序编译通过可是什么都显示不出啊!!!断点调试显示从建立对象就开始error啊!!!
CODE:
#include
#include
using namespace std;

struct HNode
{
        int weight;
        int parent;
        int LChild;
        int RChild;
};

struct HCode
{
        char data;
        char code[100];
};

class Huffman
{
private:
        HNode *HTree;
        HCode *HCodeTable;

public:
        Huffman(){};
        int includes(char ch); //判断当前字符是否包含在已经识别的字符中
    void frequency(char *s);  //计算频率
        void outputfrequency();  //输出输入字符的频数
        void CreateHTree(int a[],int n);
        void CreateHCodeTable(char b[],int n);
        void Encode(char *s,char *d);
        void Decode(char *s,char *d);
        void Reverse(char a[]);
       
};
    int num[100];    //存放字符个数
        int top=-1;     //C的顶部指针
    int length=-1;   //输入的字符长度
    int count=0;       //不重复的字符的个数
        char c[100];     //存储已经识别的字符
    char ch;        //当前字符
    char input[100];    //输入的字符


int Huffman::includes(char ch)
{
        for(int i=0;i<=top;i++)
  if(c[i]==ch)   
   return i;
return -1;
}

void Huffman::frequency(char *s)
{
        for(int j=0;j<=length;j++)
{
  ch=s[j];   
  int i=includes(ch);
  if(i==-1)     //不存在
  {
   top++;
   c[top]=ch;   
   num[top]=1;  
   count++;
  }
  else         //已经存在
   num[i]++;
}
}

void Huffman::outputfrequency()
{
        for(int i=0;i {
  cout< }
}



void Huffman::CreateHTree(int a[],int n)
{
        HTree=new HNode[2*n-1];
        for (int i=0;i         {
                HTree[i].weight=a[i];
                HTree[i].RChild=-1;
                HTree[i].LChild=-1;
                HTree[i].parent=-1;
        }
        int x=a[0],y=a[1];
        for (i=0;i<2*n-1;i++)
        {
                for(int k=0;k                 {
                        if(HTree[k].parent==-1&&HTree[k].weight                                 x=HTree[k].weight;
                        else if(HTree[k].parent==-1&&HTree[k].weight                                 y=HTree[k].weight;
                }
                HTree[x].parent=HTree[y].parent=i;
                HTree[i].weight=HTree[x].weight+HTree[y].weight;
                HTree[i].LChild=x;
                HTree[i].RChild=y;
                HTree[i].parent=-1;
        }
}

void Huffman::Reverse(char a[])
{
        for (int i=0;i<(count-1)/2;i++)
        {
                a[i]=a[count-i-1];
        }
}

void Huffman::CreateHCodeTable(char b[],int n)
{
        HCodeTable= new HCode[n];
        for(int i=0;i         {
                HCodeTable[i].data=b[i];
                int child=i;
                int parent= HTree[i].parent;
                int k=0;
                while(parent!=-1)
                {
                        if(child==HTree[parent].LChild)
                                HCodeTable[i].code[k]='0';
                        else
                HCodeTable[i].code[k]='1';
                        k++;
                        child=parent;
                        parent=HTree[child].parent;
                }
                HCodeTable[i].code[k]='\0';
                Reverse(HCodeTable[i].code);             //
        for (int j=0;j                 {
                        cout<                 }
        }
}


void Huffman::Encode(char *s,char *d)
{
        int k=0;
        while(*d!='\0')
        {
                int i=0,j=0;
                while(HCodeTable[i].data != *d)
                        i++;
        while(HCodeTable[i].code[j] != '\0')
                        s[k++]=HCodeTable[i].code[j++];
                d++;
        }
       
}

void Huffman::Decode(char *s,char *d)
{
        int k=0;
        while (*s!='\0')
        {
                int parent=2*count-1-1;
                while(HTree[parent].LChild!=-1)
                {
                        if (*s=='0')
                          parent=HTree[parent].LChild;
                        else
                                parent=HTree[parent].RChild;
                        s++;
                }
                d[k]=HCodeTable[parent].data;
                k++;
        }
    for (int i=0;i         {cout<<"result:"<        
         
}

void main()
{
        Huffman h;
        cout<<"input:"<         char tempch;
    cin>>tempch;
    while(tempch!='\0')
        {
      input[length++]=tempch;
      cin>>tempch;
        }
      cout<           h.frequency(input);
          cout<<"characters and frequency:"<           h.outputfrequency();
          h.CreateHTree(num,count);
          h.CreateHCodeTable(c,count);

}

求高人帮我修改一下吧程序要求是统计输入的字符串每个字符的出现频率并建立哈夫曼树,输出每个字符的编码,字符串编码,译码结果。。。。。。。。。。不需要真的用bit压缩和计算压缩比……只要一个概念就OK………………我真的在线等的~~~~~~~~~

[ Last edited by 微尘、梦想 on 2011-11-28 at 18:26 ]
回复此楼

» 猜你喜欢

» 本主题相关价值贴推荐,对您同样有帮助:

幽人竹桑園 歸臥寂無喧 物情今已見 ?拇擞麩o言
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

viking1992

新虫 (初入文坛)

中间那个表情符号怎么去掉……………………= =
幽人竹桑園 歸臥寂無喧 物情今已見 ?拇擞麩o言
2楼2011-11-28 17:04:50
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

libralibra

至尊木虫 (著名写手)

骠骑将军

【答案】应助回帖


jjdg(金币+1): 感谢参与 2011-11-29 01:37:40
引用回帖:
2楼: Originally posted by viking1992 at 2011-11-28 17:04:50:
中间那个表情符号怎么去掉……………………= =

插入代码的方法是
[code ]代码写在这里[/code]
matlab/VB/python/c++/Java写程序请发QQ邮件:790404545@qq.com
3楼2011-11-28 17:07:00
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

viking1992

新虫 (初入文坛)

微尘、梦想:编辑内容 2011-11-28 18:32


[ Last edited by 微尘、梦想 on 2011-11-28 at 18:32 ]
4楼2011-11-28 17:14:17
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

微尘、梦想

木虫 (知名作家)

【答案】应助回帖

错了~

[ Last edited by 微尘、梦想 on 2011-11-28 at 18:42 ]
任风云变幻,我笑对人生!
5楼2011-11-28 18:36:15
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

viking1992

新虫 (初入文坛)

引用回帖:
5楼: Originally posted by 微尘、梦想 at 2011-11-28 18:36:15:
错了~
[ Last edited by 微尘、梦想 on 2011-11-28 at 18:42 ]

我的重點不在這裡啊……那兩個表情不影響閱讀的………………
幽人竹桑園 歸臥寂無喧 物情今已見 ?拇擞麩o言
6楼2011-11-28 18:50:32
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

微尘、梦想

木虫 (知名作家)

【答案】应助回帖

引用回帖:
6楼: Originally posted by viking1992 at 2011-11-28 18:50:32:
我的重點不在這裡啊……那兩個表情不影響閱讀的………………

简单看了下,一开始input:之后,那个while(tempch!='\o')会产生无限循环吧,好像'\o'字符无法通过键盘输进去吧,我改成了while(tempch!='1'),能运行是能运行了,但运行结果乱七八糟的,我也不知道你想得到什么结果哈~
任风云变幻,我笑对人生!
7楼2011-11-28 19:01:57
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

微尘、梦想

木虫 (知名作家)

【答案】应助回帖

★ ★ ★
余泽成(金币+3): 2011-12-02 17:33:54
余泽成: 谢谢参与应助! 2011-12-02 17:34:03
这是运行结果:
任风云变幻,我笑对人生!
8楼2011-11-28 19:06:15
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

潜龙伏虎

银虫 (小有名气)

【答案】应助回帖

这个才学呀!还不怎么熟,有点纠结。
9楼2011-12-01 17:08:08
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 viking1992 的主题更新
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[考研] 086000生物与医药求调剂 +3 老天眷顾之人 2026-03-31 3/150 2026-04-05 22:24 by syh9288
[考研] 377求调剂 +6 by.ovo 2026-04-05 6/300 2026-04-05 22:18 by dongzh2009
[考研] 生物与医药273求调剂 +5 荔题南墙 2026-04-05 5/250 2026-04-05 22:04 by imissbao
[考研] 262求调剂 +7 天下第一文 2026-04-04 8/400 2026-04-05 21:31 by 激流勇渡
[考研] 301求调剂 +5 细胞相关蛋白 2026-04-02 9/450 2026-04-05 20:14 by lys0704
[考研] 080200学硕,机械工程专业277分,求带走! +7 瓶子PZ 2026-03-31 7/350 2026-04-05 17:49 by liucky
[考研] 0703总分331求调剂 +10 ZY-05 2026-04-04 13/650 2026-04-05 11:03 by xiayan13521
[考研] 考研调剂 +3 mcbbc 2026-04-04 3/150 2026-04-05 10:03 by barlinike
[考研] 278求调剂 +3 依旧! 2026-04-02 4/200 2026-04-04 20:27 by 蓝云思雨
[考研] 怎么删帖子啊 +3 缝曦1000 2026-04-04 3/150 2026-04-04 14:20 by 土木硕士招生
[考研] 调剂0855-288 +5 x熊二a 2026-04-03 5/250 2026-04-04 00:19 by 猪会飞
[考研] 266分,一志愿电气工程,本科材料,求材料专业调剂 +9 哇呼哼呼哼 2026-04-02 9/450 2026-04-03 12:05 by 1753564080
[考研] 专硕 351 086100 也是考的材科基 本科也是材料 +8 202451007219 2026-04-02 8/400 2026-04-03 09:50 by 蓝云思雨
[考研] 279求调剂 +5 傅文秋 2026-04-02 5/250 2026-04-02 18:10 by 笔落锦州
[考研] 081200-11408-276学硕求调剂 +3 崔wj 2026-04-02 3/150 2026-04-02 15:06 by cal0306
[考研] 279求调剂 +7 莫xiao 2026-04-01 7/350 2026-04-01 22:05 by 客尔美德
[考研] 311求调剂 +10 李芷新1 2026-03-31 10/500 2026-04-01 14:38 by chenqifeng666
[考研] 08工科,295,接受跨专业调剂 +6 lmnlzy 2026-03-31 6/300 2026-04-01 11:02 by 逆水乘风
[考研] 0855机械初试280求调剂 +3 kazenotori 2026-03-31 3/150 2026-04-01 10:08 by JourneyLucky
[考研] 370求调剂 +3 080700调剂 2026-03-30 3/150 2026-03-31 01:09 by A_Zhe
信息提示
请填处理意见