首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

这段huffman代码哪错了,该怎么处理

2012-02-25 
这段huffman代码哪错了1楼#includeiostream.h#includeiomanip.h#includestring.hconst MAX1000int

这段huffman代码哪错了


1楼
#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;
}
}
麻烦大家帮忙看下代码,可以运行,但是当一输入字符串就发生错误,谁能耐心的看一下,感激涕零。。希望有好心人能抽空看看


[解决办法]
代码相应的地方改一下吧,用动态数组就能避免这样的问题了:

C/C++ code
...void Huffman (char *ch,int *weit,int NUM)  {      int TNUM,LTH;    TNUM=NUM*2-1;//整个哈夫曼树节点的个数    LTH=NUM-1;//编码的最大长度    Node nodes[MAX]; //用对象数组存储哈夫曼树      int one,two,a,b;    int **hc = new int* [MAX];    for (i = 0; i < MAX; i++)    {        hc[i] = new int[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;      }  ... 

热点排行