求各位大神帮我看看,程序有一个段错误,但我实在是找不到原因,求指导。

gaokuilin1060083530 2014-05-18 12:36:50
#include<iostream>
#include<string>
using namespace std;
struct tnode
{

string word;
int cout;
tnode *left;
tnode *right;
} ;
struct tnode ** tra(struct tnode *r,string s)
{

if( s<=r->word)
{
if(r->left==NULL)
return &(r->left);
else
tra(r->left,s);
}
if(s>r->word)
{
if(r->right==NULL)
return &(r->right);
tra(r->right,s);
}
}

void T_Insert(struct tnode *r)
{

int i=0;
struct tnode *a,**b;
if(r==NULL)
{

a=new (struct tnode);
cin>>a->word;

a->left=a->right=NULL;
a->cout=i++;
r=a;
}
a=new (struct tnode);
cin>>a->word;
do
{


a->left=a->right=NULL;
a->cout=i++;
b=tra(r,a->word);//返回应当把a插入位置的指针
*b=a;
a=new (struct tnode);

}while(cin >>a->word);//当输入EOF时,结束结点的插入

}


int Tranfer(struct tnode *r)
{
if(r==NULL)
return 0;
else
{
Tranfer(r->left);
cout<<r->word<<' ';
Tranfer(r->right);
}

}
int main()//按字典序建二叉树
{
struct tnode * r=NULL;
T_Insert(r);//建树
Tranfer(r);//遍历
return 0;
}
...全文
143 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
说的很对,也就是说有返回值的函数可能没有返回值。谢谢。
xuzhouweihao 2014-05-19
  • 打赏
  • 举报
回复
看了下,这个函数 tra()处理有问题的吧 tra(){ if(){ return xx; }else{ tra; 如果函数执行到这一步的话(这个为tra②),那么tra①函数没有返回值吧?!! } } 应该是这里的问题,楼主可以gdb调试一下看看。
赵4老师 2014-05-19
  • 打赏
  • 举报
回复
进程意外退出会在当前目录下产生‘core’文件或形如‘core.数字’的文件比如‘core.1234’ 使用命令 gdb 运行程序名 core或core.数字 进入gdb然后使用bt命令 可以查看进程意外退出前函数调用的堆栈,内容为从上到下列出对应从里层到外层的函数调用历史。 如果进程意外退出不产生core文件,参考“ulimit -c core文件最大块大小”命令
赵4老师 2014-05-19
  • 打赏
  • 举报
回复
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。
  • 打赏
  • 举报
回复
c_free
highnewrain 2014-05-18
  • 打赏
  • 举报
回复
你用的是啥编译器?我用的编译器是vs2010!我在*b=a;这放了断点,单步调试了下,输入了好几个字符串也没出现这个错误哦!
下图是输入样例:


  • 打赏
  • 举报
回复
就是在T_Insert(r);//建树 出现了问题。如图,
highnewrain 2014-05-18
  • 打赏
  • 举报
回复
int main()//按字典序建二叉树 
{
struct tnode * r=NULL; 
T_Insert(r);//建树 
Tranfer(r);//遍历   //执行到这一步的时候,r的值仍然是NULL!不知道楼主的段问题是啥意思,但这里r的值为NULL,因此肯定无法遍历树了!还有楼主没写对应的销毁树的函数嘛!
return 0;
}
super_admi 2014-05-18
  • 打赏
  • 举报
回复
还好我不是大神,所以不用看。
  • 打赏
  • 举报
回复
也不是,问题在于*b=a;执行到第二次的时候出现段错误。我用的cfree。
昵称很不好取 2014-05-18
  • 打赏
  • 举报
回复
注意形参和实参的问题,在insert函数中把新的节点返回赋值给r struct tnode * r=NULL; r = T_Insert(r);//建树 Tranfer(r);//遍历

65,207

社区成员

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

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