在C++中运行程序,为什么在编译时没有问题,但是回到程序的执行时,就会出现程序崩溃的情况???
这是一个二叉树的链表构造程序,而且程序能成功运行“前序,中序,后序”遍历,并且输出正确答案,一到“节点数的运算”,就会系统崩溃。#include<iostream>#in...
这是一个二叉树的链表构造程序,而且程序能成功运行“前序,中序,后序”遍历,并且输出正确答案,一到“节点数的运算”,就会系统崩溃。
#include<iostream>
#include<map>
using namespace std;
typedef char DataType;
typedef struct Bitnode
{ DataType d;
struct Bitnode *lchild,*rchild;
}BitTree;
Bitnode *gen;//根节点
int sum;
int creat(Bitnode *p,int k)
{
Bitnode *q;
DataType x;
cin>>x;
if(x!='#')
{q=new Bitnode;
q->d=x;
q->lchild=NULL;
q->rchild=NULL;
if(k==1) p->lchild=q;
if(k==2) p->rchild=q;
creat(q,1);
creat(q,2);
}
return 0;
}
void creat_Binary_Tree()//构造二叉树链表结构
{
DataType x;
cin>>x;
if(x=='#') return;
gen=new Bitnode;
gen->d=x;
gen->lchild=NULL;
gen->rchild=NULL;
creat(gen,1);
creat(gen,2);
return;
}
int pretrav(Bitnode *gen)//前序遍历
{
if(gen!=NULL)
{
cout<<gen->d<<" ";
pretrav(gen->lchild);
pretrav(gen->rchild);
}
return 0;
}
int intrav(Bitnode *gen)//中序遍历
{
if(gen!=NULL)
{intrav(gen->lchild);
cout<<gen->d<<" ";
intrav(gen->rchild);
}
return 0;
}
int postrav(Bitnode *gen)//后序遍历
{
if(gen!=NULL)
{postrav(gen->lchild);
postrav(gen->rchild);
cout<<gen->d<<" ";
}
return 0;
}
void CountLeaf (Bitnode * T, int count)//节点总数的计算
{
if(T)
{
count=count+1;
sum=count;
}
CountLeaf( T->lchild, count);
CountLeaf( T->rchild, count);
}
int depthval;//深度计算
int depthLeft;
int depthRight;
int Depth (Bitnode * T )
{
if( !T ) depthval = 0;
else
{ depthLeft = Depth( T->lchild );
depthRight= Depth( T->rchild );
depthval = 1 + (depthLeft > depthRight ? depthLeft : depthRight);
}
return depthval;
}
int main(){
cout<<"请输入!!!!!!!!!"<<endl;
creat_Binary_Tree();
cout<<"前序遍历:"<<endl;
pretrav(gen);
cout<<endl;
cout<<"中序遍历:"<<endl;
intrav(gen);
cout<<endl;
cout<<"后序遍历:"<<endl;
postrav(gen);
cout<<endl;
CountLeaf(gen,0);
cout<<"节点总数为:"<<sum<<endl;
return 0;
} 展开
#include<iostream>
#include<map>
using namespace std;
typedef char DataType;
typedef struct Bitnode
{ DataType d;
struct Bitnode *lchild,*rchild;
}BitTree;
Bitnode *gen;//根节点
int sum;
int creat(Bitnode *p,int k)
{
Bitnode *q;
DataType x;
cin>>x;
if(x!='#')
{q=new Bitnode;
q->d=x;
q->lchild=NULL;
q->rchild=NULL;
if(k==1) p->lchild=q;
if(k==2) p->rchild=q;
creat(q,1);
creat(q,2);
}
return 0;
}
void creat_Binary_Tree()//构造二叉树链表结构
{
DataType x;
cin>>x;
if(x=='#') return;
gen=new Bitnode;
gen->d=x;
gen->lchild=NULL;
gen->rchild=NULL;
creat(gen,1);
creat(gen,2);
return;
}
int pretrav(Bitnode *gen)//前序遍历
{
if(gen!=NULL)
{
cout<<gen->d<<" ";
pretrav(gen->lchild);
pretrav(gen->rchild);
}
return 0;
}
int intrav(Bitnode *gen)//中序遍历
{
if(gen!=NULL)
{intrav(gen->lchild);
cout<<gen->d<<" ";
intrav(gen->rchild);
}
return 0;
}
int postrav(Bitnode *gen)//后序遍历
{
if(gen!=NULL)
{postrav(gen->lchild);
postrav(gen->rchild);
cout<<gen->d<<" ";
}
return 0;
}
void CountLeaf (Bitnode * T, int count)//节点总数的计算
{
if(T)
{
count=count+1;
sum=count;
}
CountLeaf( T->lchild, count);
CountLeaf( T->rchild, count);
}
int depthval;//深度计算
int depthLeft;
int depthRight;
int Depth (Bitnode * T )
{
if( !T ) depthval = 0;
else
{ depthLeft = Depth( T->lchild );
depthRight= Depth( T->rchild );
depthval = 1 + (depthLeft > depthRight ? depthLeft : depthRight);
}
return depthval;
}
int main(){
cout<<"请输入!!!!!!!!!"<<endl;
creat_Binary_Tree();
cout<<"前序遍历:"<<endl;
pretrav(gen);
cout<<endl;
cout<<"中序遍历:"<<endl;
intrav(gen);
cout<<endl;
cout<<"后序遍历:"<<endl;
postrav(gen);
cout<<endl;
CountLeaf(gen,0);
cout<<"节点总数为:"<<sum<<endl;
return 0;
} 展开
2个回答
2013-04-13
展开全部
编译器又不是万能的,虽然已经足够只智能,但是对于一个传递了无数次的指针是否仍然有效或者传递过一次以上的数组的范围等问题编译器是做不来的(其实并不是做不来,只是为了效率很少去做这些事,你总不希望一个程序编译一天吧)。所以要依靠代码风格解决这些问题。
其中最常见的是数组访问越界和野指针问题,当然也有部分野引用问题也会造成运行时崩溃。所以你要通过改变编程风格或者确保每次进行内存的相关操作的时候尽力谨慎。前者可以参考 effective C++ 系列和imperfect C++这些书。
另外你编写的代码有很大的问题:
Bitnode *gen;//根节点
int sum;
全局变量只在本文件有效,在函数内部使用全局自动变量是非常危险的。用返回值又不会怎么样……
CountLeaf( T->lchild, count);
CountLeaf( T->rchild, count);
这个会无限循环……这递归没有结束条件……
其中最常见的是数组访问越界和野指针问题,当然也有部分野引用问题也会造成运行时崩溃。所以你要通过改变编程风格或者确保每次进行内存的相关操作的时候尽力谨慎。前者可以参考 effective C++ 系列和imperfect C++这些书。
另外你编写的代码有很大的问题:
Bitnode *gen;//根节点
int sum;
全局变量只在本文件有效,在函数内部使用全局自动变量是非常危险的。用返回值又不会怎么样……
CountLeaf( T->lchild, count);
CountLeaf( T->rchild, count);
这个会无限循环……这递归没有结束条件……
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询