Huffman编码问题

fantasyfans 2009-04-10 06:48:20
#include<iostream.h>
#include<iomanip.h>
#include<string.h>
const MAX=1000;
int i,j;
class Node
{
public:
char data;
int weight;
int parent;
int lchild;
int rchild;
};
void Huffman (char ch[MAX],int weit[MAX],int NUM)
{
int TNUM,LTH;
TNUM=NUM*2-1;//整个哈夫曼树节点的个数
LTH=NUM-1;//编码的最大长度
Node nodes[MAX]; //用对象数组存储哈夫曼树
int one,two,a,b;
int hc[MAX][MAX]; //用于存储编码
int m,n;
//初始化数组
for(i=0;i<NUM;i++)
{
nodes[i].data=ch[i];
nodes[i].weight=weit[i];
nodes[i].parent=-1;
nodes[i].lchild=-1;
nodes[i].rchild=-1;
}
for(i=NUM;i<TNUM;i++)
{
nodes[i].data='@';
nodes[i].weight=-1;
nodes[i].parent=-1;
nodes[i].lchild=-1;
nodes[i].rchild=-1;
}

//建立哈夫曼树
for(i=NUM;i<TNUM;i++)
{
a=b=-1;
one=two=100000; //最大权数
for(j=0;j<i;j++)
{
if(nodes[j].parent==-1)
{
if(nodes[j].weight<=two)
{
one=two;
two=nodes[j].weight;
a=b;
b=j;
}
else if(nodes[j].weight>two&&nodes[j].weight<=one)
{
one=nodes[j].weight;
a=j;
}
}
}//for语句得到 parent=-1(即尚没有父结点)且weight最小的两个结点
nodes[a].parent=i;
nodes[b].parent=i;
nodes[i].lchild=a;
nodes[i].rchild=b;
nodes[i].weight=nodes[a].weight+nodes[b].weight;
}

//初始化hc
for(i=0;i<LTH;i++)
{
for(j=0;j<NUM;j++)
{
hc[j][i]=7;
}
}

//编码
for(i=0;i<NUM;i++)
{
j=LTH-1;
for(m=i,n=nodes[i].parent;m!=-1;m=n,n=nodes[n].parent)
{
if(nodes[n].lchild==m)
{
hc[i][j]=0;
}
else
{
hc[i][j]=1;
}
j--;
}
}


//输出编码
cout<<"Result:"<<endl;
cout<<setw(6)<<"char"<<setw(10)<<"frequency"<<setw(16)<<"huffmancode\n";
for(i=0;i<NUM;i++)
{
cout<<setw(6)<<ch[i]<<setw(8)<<weit[i];
cout<<" ";
for(j=0;j<LTH;j++)
{
if(hc[i][j]!=7)
{
cout<<hc[i][j];
}
}
cout<<endl;
}
cout<<"Done."<<endl;
}
/*********************************************************************/
void main()
{
char key='y';
char a[MAX];//用来存放输入的字符串
char ch[MAX];//用来存放所输入字符串中不重复的字符的数组
int weit[MAX];//用来存放对应于ch数组个每个字符权值的数组(ps:ch数组和weit数组是一一对应的关系)
int length;//计算输入字符串的长度
int NUM=0;//不同字母的个数
while(key=='y'||key=='Y')
{
cout<<"请输入您要进行Huffman编码的字符串:"<<endl;
cin>>a;
length=strlen(a);
//将输入的字符串进行处理,把完全不相同的字符放入ch数组中
bool x;
for(i=0;i<length;i++)
{
x=true;
for(int g=0;g<MAX;g++)
if(ch[g]==a[i])
{
x=false;
break;
}
if(x)
{
ch[NUM]=a[i];
NUM++;
}
}
//计算出ch数组中字符出现的频率(即权值)
for(i=0;i<NUM;i++)
{
int dota=0;
for(j=0;j<length;j++)
{
if(ch[i]==a[j])
dota++;
}
weit[i]=dota;
}
Huffman(ch,weit,NUM);
cout<<"是否继续进行Huffman编码 Y(继续)or N(退出)"<<endl;
cin>>key;
}
}

麻烦大家帮忙看下代码,可以运行,但是当一输入字符串就发生错误,谁能耐心的看一下,感激涕零。。
...全文
268 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
huanzhile 2011-12-24
  • 打赏
  • 举报
回复
还有LZ应该多结贴,这样才有人来光顾。我想有很多人是被你的结贴率·······
huanzhile 2011-12-24
  • 打赏
  • 举报
回复
在我的编译器上报的是"stack Overflow"错误,是字符数组开大了,将const MAX常量改小一点(譬如100)就可以了,至于为什么数组会开大,这应该是局部变量所导致的。以下是百度到的看法:
在main函数里边定义OS要为他分配堆栈空间,
而用全局变量的话用的是堆空间,
而且堆栈空间比较小,
堆空间可以利用整个内存的空余部分
不单单是字符串数组,
定义一些大数组时也应该这样
seashell126 2011-12-19
  • 打赏
  • 举报
回复
怎么都没人回答呢?我也想知道问题在哪

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧