读书人

下面这个程序为何通不过?该怎么解决

发布时间: 2012-03-30 17:32:10 作者: rapoo

下面这个程序为何通不过?
想请教一下高人:
能给我分析一下下面这个程序通不过的原因吗?(在VC++6.0中编译)
是不是哪个分配内存空间的地方搞错了?
#include <iostream>
#include <iomanip>
#include <string>
using namespace std;
template <class T>
struct HufNode
{
T w;
int parent;
int lchild;
int rchild;
};
template <class T>
class HuffmanTree
{
public:
HuffmanTree(){HT=NULL;return;}
void CreateTree(int,T[]);
void print();
void decode();
private:
int num;
char** *HC;
HufNode <T> *HT;
};
template <class T>
void HuffmanTree <T> ::CreateTree(int n,T w[])
{
HufNode <T> *p;
int k,i,j,m;
int start;
char *cd;
num=n;
m=2*n-1;
if(n <=1)
return;
HT=new HufNode <T> [m];
p=HT;
for(k=0;k <m;k++)
{
(p+k)-> parent= -1;
(p+k)-> lchild= -1;
(p+k)-> rchild= -1;
}
for(k=0;k <n;k++)
(p+k)-> w=w[k];
for(k=n;k <m;k++)
{
select(p,k,&i,&j);
(p+i)-> parent=k;
(p+j)-> parent=k;
(p+k)-> lchild=i;
(p+k)-> rchild=j;
(p+k)-> w=((p+i)-> w+(p+j)-> w);
}
*HC=(char**)(new char[n+1]);
cd=(char*)new char[n];
cd[n-1]= '\0 ';
for(k=1;k <=n;++k)
{
start=n-1;
for(i=k,j=((p+k)-> parent);j!=0;i=j,j=((p+k)-> parent))
{
if(((p+k)-> lchild)==i)
cd[--start]= '0 ';
else
cd[--start]= '1 ';
(*HC)[i]=(char *)(new char[n-start]);
strcpy((*HC)[i],&cd[start]);
}
}
for(k=1;k <=n;k++)
cout < <*(*HC)[k];
delete cd;
return;
}
template <class T>
static select(HufNode <T> *p,int k,int *i,int *j)
{
T w;
int n;
n=0;
while((n <k)&&((p+n)-> parent!=-1))
n=n+1;
w=(p+n)-> w;
*i=n;
while(n <k)
{
if((((p+n)-> w) <w)&&((p+n)-> parent==-1))
{
*i=n;
w=(p+n)-> w;
}
n=n+1;
}
n=0;
while((n <k)&&((p+n)-> parent!= -1)||(n==(*i)))
n=n+1;
w=(p+n)-> w;
*j=n;
while(n <k)
{
if(((p+n)-> w <w)&&(n!=(*i))&&((p+n)-> parent== -1))
{
*j=n;
w=(p+n)-> w;
}
n=n+1;
}
if((*i)> (*j))
{
n=(*j);
*i=(*j);
*j=n;
}
return 0;
}
template <class T>
void HuffmanTree <T> ::print()
{
HufNode <T> *p;
int k;
p=HT;
cout < < "k " < <setw(7) < < "WEIGHT " < <setw(7) < < "PARENT " < <setw(7) < < "LCHILD " < <setw(7) < < "RCHILD " < <endl;
for(k=0;k <2*num-1;k++)
cout < <k < <setw(7) < <(p+k)-> w < <setw(7) < <(p+k)-> parent < <setw(7) < <(p+k)-> lchild < <setw(7) < <(p+k)-> rchild < <endl;
return;
}
template <class T>
void HuffmanTree <T> ::decode()
{


int i=num;
char b;
cout < < "input codes! ";
while((b=getchar())!=EOF)
{
if(b== '0 ')
i=HT[i].lchild;
else if(b== '1 ')
i=HT[i].rchild;
if(HT[i].lchild==0)
{
cout < <HT[i].w;
i=num;
}
}
}
int main()
{
int w[8],n=8,i;
HuffmanTree <int> b;
for(i=0;i <n;i++)
cin> > w[i];
b.CreateTree(8,w);
b.decode();
return 0;
}

谢谢!

[解决办法]
这样可以编译过去了
template <class T>
struct HufNode
{
T w;
int parent;
int lchild;
int rchild;
};
template <class T>
class HuffmanTree
{
public:
HuffmanTree(){HT=NULL;return;}
void CreateTree(int,T[]);
void print();
void decode();
private:
int num;
char** *HC;
HufNode <T> *HT;
};
template <class T>
void HuffmanTree <T> ::CreateTree(int n,T w[])
{
HufNode <T> *p;
int k,i,j,m;
int start;
char *cd;
num=n;
m=2*n-1;
if(n <=1)
return;
HT=new HufNode <T> [m];
p=HT;
for(k=0;k <m;k++)
{
(p+k)-> parent= -1;
(p+k)-> lchild= -1;
(p+k)-> rchild= -1;
}
for(k=0;k <n;k++)
(p+k)-> w=w[k];
for(k=n;k <m;k++)
{
select(p,k,&i,&j);
(p+i)-> parent=k;
(p+j)-> parent=k;
(p+k)-> lchild=i;
(p+k)-> rchild=j;
(p+k)-> w=((p+i)-> w+(p+j)-> w);
}
*HC=(char**)(new char[n+1]);
cd=(char*)new char[n];
cd[n-1]= '\0 ';
for(k=1;k <=n;++k)
{
start=n-1;
for(i=k,j=((p+k)-> parent);j!=0;i=j,j=((p+k)-> parent))
{
if(((p+k)-> lchild)==i)
cd[--start]= '0 ';
else
cd[--start]= '1 ';
(*HC)[i]=(char *)(new char[n-start]);
strcpy((*HC)[i],&cd[start]);
}
}
for(k=1;k <=n;k++)
cout < <*(*HC)[k];
delete cd;
return;
}
template <class T>
static int select(HufNode <T> *p,int k,int *i,int *j)
{
T w;
int n;
n=0;
while((n <k)&&((p+n)-> parent!=-1))
n=n+1;
w=(p+n)-> w;
*i=n;
while(n <k)
{
if((((p+n)-> w) <w)&&((p+n)-> parent==-1))
{
*i=n;
w=(p+n)-> w;
}
n=n+1;
}
n=0;
while((n <k)&&((p+n)-> parent!= -1)||(n==(*i)))
n=n+1;
w=(p+n)-> w;
*j=n;
while(n <k)
{
if(((p+n)-> w <w)&&(n!=(*i))&&((p+n)-> parent== -1))
{
*j=n;
w=(p+n)-> w;
}
n=n+1;
}
if((*i)> (*j))
{
n=(*j);
*i=(*j);
*j=n;
}
return 0;
}

template <class T>
void HuffmanTree <T> ::print()
{
HufNode <T> *p;
int k;
p=HT;
cout < < "k " < <setw(7) < < "WEIGHT " < <setw(7) < < "PARENT " < <setw(7) < < "LCHILD " < <setw(7) < < "RCHILD " < <endl;
for(k=0;k <2*num-1;k++)
cout < <k < <setw(7) < <(p+k)-> w < <setw(7) < <(p+k)-> parent < <setw(7) < <(p+k)-> lchild < <setw(7) < <(p+k)-> rchild < <endl;
return;
}
template <class T>
void HuffmanTree <T> ::decode()


{
int i=num;
char b;
cout < < "input codes! ";
while((b=getchar())!=EOF)
{
if(b== '0 ')
i=HT[i].lchild;
else if(b== '1 ')
i=HT[i].rchild;
if(HT[i].lchild==0)
{
cout < <HT[i].w;
i=num;
}
}
}


int main(int argc, char* argv[])
{

int w[8],n=8,i;
HuffmanTree <int> b;
for(i=0;i <n;i++)
cin> > w[i];
b.CreateTree(8,w);
b.decode();

return 0;
}

[解决办法]
我跟踪了一下,是因为这一句:*HC=(char**)(new char[n+1]);
你前面是这样定义HC的:char ***HC;
因为*HC并没有初始化,编译系统直接给它的地址是cx0030,这个地址是不能读取的,是操作系统拥有的,你访问*HC是非法的。所以出现错误。
如果是:
char **bb;
bb=(char**)(new char);
就不会产生错误,因为并没有用*bb,没有访问*bb。

读书人网 >C++

热点推荐