( 实现二叉树生成问题 夹带 内存泄露问题)这些代码怎么了析构函数调用了吗 到最后 msdos竟然不能打开了

clin003 2004-11-16 09:42:17
( 实现二叉树生成问题 夹带 内存泄露问题)这些代码怎么了析构函数调用了吗 到最后 msdos竟然不能打开了

目的: 用类作为二叉树的结点 生成一个 有序(无论前序还是后序)二叉树 二叉树有类成员函数可以控制
……

下边是 一段糟糕的代码 ;
怎样优化它……

#include <iostream>

using namespace std;
int cunt=0;// 跟踪 创建的实例

class tree
{
public:
tree()
{
cout << " \tcreat tree : " << (++cunt) << endl;
data='0';

childl=NULL;
childr=NULL;
}
tree(tree &tr)
{
cout << " \t\tcreat copy tree : "<<(++cunt)<<endl;
tree CopyTr;
CopyTr.data = tr.data;
CopyTr.childl=tr.childl;
CopyTr.childr=tr.childr;
}
~tree()
{
cout << " \t del tree : " << (--cunt) <<endl;
delete childl;
delete childr;
}
void CreatTree( tree *p)
{
char ch;
cout << "input data : " ;
cin >> ch;
if(!cin.good())
{
cout << " \tchar error ! ";
exit(0);
}
if (!(ch == 'q'))
{
childl = new tree;
childr = new tree;
if((childl==NULL)|(childr==NULL))
{
cout<< " \t\t\t mem error ! ";
}
p->data=ch;
CreatTree (p->childl);
CreatTree (p->childr);
}
else
p=NULL;
}
void DisplayData( const tree *a)
{
cout << " the node data is : " << a->data;
}


private:

char data;
tree *childl;
tree *childr;
};

int main(int argc, char* argv[])
{
tree * a;
// a = new tree; 若加上会出现死循环!
a->CreatTree(a);
a->DisplayData(a);
return 0;
}
...全文
167 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
clin003 2004-11-21
  • 打赏
  • 举报
回复
上边的这个 结束 (除非第一次输入q)
clin003 2004-11-21
  • 打赏
  • 举报
回复
改了一下 还是不行
晕 这样行不通吗


#include <iostream>

using namespace std;
int cunt=0;// 跟踪 创建的实例

class tree
{
public:
tree()
{
cout << " \tcreat tree : " << (++cunt) << endl;
data='e';

childl=NULL;
childr=NULL;
}
tree(tree &tr)
{
cout << " \t\tcreat copy tree : "<<(++cunt)<<endl;

data = tr.data;
childl=tr.childl;
childr=tr.childr;
}
~tree()
{
cout << " \t del tree : " << (--cunt) <<endl;

}
tree * CreatTree( )
{
char ch;
tree *curr;
cout<<" input data : "<<endl;
ch = cin.get();
/*if(!cin.good())
{
cerr<<" type error …… ";
fflush(stdin);
exit(0);
}*/
if(ch=='q')
{
curr = NULL;
}
else
{
curr = new tree ;//(sizeof(tree));
(*curr).data = ch;
(*curr).childr = CreatTree();
cout<<endl;
(*curr).childl = CreatTree();
}
return curr;
}
void DisplayData( const tree *a)
{

while (!(a=NULL))
{

cout << " the node data is : " << (*a).data;

DisplayData((*a).childl);
DisplayData((*a).childr);

}
}


private:

char data;
tree *childl;
tree *childr;
};

int main(int argc, char* argv[])
{
//tree * a;
tree *a = new tree; //若加上会出现死循环!
a = a->CreatTree();
a->DisplayData(a);
return 0;
}
clin003 2004-11-18
  • 打赏
  • 举报
回复
汗! 不回帖子 ……
都沉水了 ING

先边是改的代码 有问题……
还是生成问题
晕 还是自己找吧
找去了……

#include <iostream>

using namespace std;
int cunt=0;// 跟踪 创建的实例

class tree
{
public:
tree()
{
cout << " \tcreat tree : " << (++cunt) << endl;
data='e';

childl=NULL;
childr=NULL;
}
tree(tree &tr)
{
cout << " \t\tcreat copy tree : "<<(++cunt)<<endl;

data = tr.data;
childl=tr.childl;
childr=tr.childr;
}
~tree()
{
cout << " \t del tree : " << (--cunt) <<endl;
/* delete childl;
delete childr;
*/
}
void CreatTree( tree *p)
{
char ch;
cout<<" input data : ";
cin>> ch;
if(!cin.good())
{
cerr<<" type error …… ";
fflush(stdin);
exit(0);
}
if(p=NULL)
{
tree *pt= new tree;//( sizeof(tree) );
p=pt;
(*p).data = ch ;
CreatTree((*p).childl);
CreatTree((*p).childr);
}


}
void DisplayData( const tree *a)
{

while (!(a=NULL))
{

cout << " the node data is : " << (*a).data;

DisplayData((*a).childl);
DisplayData((*a).childr);

}
}


private:

char data;
tree *childl;
tree *childr;
};

int main(int argc, char* argv[])
{
//tree * a;
tree *a = new tree; //若加上会出现死循环!
a->CreatTree(a);
a->DisplayData(a);
return 0;
}

xuzheng318 2004-11-17
  • 打赏
  • 举报
回复
感觉 new 和delete 也怪怪的
Dong 2004-11-16
  • 打赏
  • 举报
回复
程序没有“若加上会出现死循环!”这个错误,“循环”输入是二叉树输入一个现象,因为一个枝就有两个子树,假如你输入一个字符,就要输入两次退出(q)才可以结束子树的输入。结束子树的次数比输入的字符还要多,不过有一点却是真的错误了

你的拷贝构造函数要改成这样的。
tree(tree &tr)
{
cout << " \t\tcreat copy tree : "<<(++cunt)<<endl;
data = tr.data;
childl=tr.childl;
childr=tr.childr;
}
资源下载链接为: https://pan.quark.cn/s/d9ef5828b597 在C++编程中,消息框是与用户交互的常用界面元素,它允许程序向用户展示信息,并根据用户的响应进行处理。MessageBox() 函数是Windows应用程序中实现消息框功能的标准接口,属于Windows API的一部分。本文将详细介绍MessageBox()函数的使用方法,包括常用属性、按钮形式和返回值等知识点。 MessageBox() 函数的基本语法结构如下: 其中,参数uType是一个整型值,通过组合不同的标志来定义消息框的按钮、图标等特性。常用属性包括消息框中显示的按钮以及附加的图标,例如: MB_OK:仅显示一个确定按钮。 MB_OKCANCEL:显示确定和取消按钮。 MB_YESNO:显示是和否按钮。 MB_YESNOCANCEL:显示是、否和取消按钮。 图标属性可以与按钮属性组合使用,为用户提供额外的视觉信息: MB_ICONEXCLAMATION 或 MB_ICONWARNING:显示感叹号警告图标。 MB_ICONASTERISK 或 MB_ICONINFORMATION:显示信息图标。 MB_ICONQUESTION:显示询问图标的问号。 MB_ICONERROR 或 MB_ICONHAND 或 MB_ICONSTOP:显示错误图标。 返回值方面,MessageBox() 函数执行后会返回一个整数值,代表用户点击了哪一个按钮。这个返回值可以与预定义的标识符进行比较,以判断用户的操作: IDCANCEL:用户点击了取消按钮。 IDNO:用户点击了否按钮。 IDOK:用户点击了确定按钮。 IDYES:用户点击了是按钮。 在使用MessageBox()函数时,需要特别注意字符编码问题。由于Visual C++ 2005默认使用Unicode字符集,当源代码使用的是ANSI

65,187

社区成员

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

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