自己写的一棵树程序,编译正确,但为什么程序一运行就显示*.exe已停止工作

时间:2022-08-26 20:54:46
自己编写的一个树程序。编译正确,但程序一运行就显示*.exe已停止工作。找了很久不知道是什么原因,求大神打救。我的程序如下:

#include<stdio.h>
#include<iostream.h>
#include<stdlib.h>
#include<time.h>
#define N1 10
typedef int elementype;

struct GTreeNode{
elementype data;
    GTreeNode* t[N1];
};

//建树
void CreatTree(GTreeNode*& GT)
{
int a[4][5]={{1,2,3,4,5},{11,2,3,4,5},{12,2,3,4,5},{11,2,3,4,5}};
const int MS=100;
GTreeNode* s[MS];//储存树结点指针
int d[MS];
int top=-1;
GTreeNode* p;
p= new GTreeNode;
p->data=0;
GT=p;

top++;
s[top]=p;
d[top]=0;
for(int z=0;z<17;z++) p->t[z]=NULL;

for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
{
for(int x1=0;x1<N1;x1++)      //判断该层指针是否与数组中的对应。
{
if(s[top]->t[x1]=NULL)  //子指针为空,则增加一个节点
{
p=new GTreeNode;
p->data=a[i][j];
printf("%d  ",p->data);
for(int x2=0;x2<N1;x2++)
p->t[x2]=NULL;
s[top]->t[x1]=p;
top++;
d[top]=0;
s[top]=p;
break;       //增加完节点后退出本次循环,继续下一个数值的比较
}
else if((s[top]->t[x1]->data!=a[i][j]))    //如果某一个节点和当前值不相等,则继续和下一个节点相比
continue;                               //直到找到和当前值相等的节点或者空指针为止。  

else if((s[top]->t[x1])->data==a[i][j])
{
    top++;
s[top]=p;
d[top]=0;
break;       
}//如果相等,则跳出本层循环,继续下一个对比
}
continue;
}
top=top-2;//指针重新回到根节点
}
}

//void InitGTree(GTreeNode*& GT){
// GT=NULL;
void main()
{
 GTreeNode* GT;
//InitGTree(GT);
 CreatTree(GT);
}

11 个解决方案

#1


停止工作就是段错误了 数组越界 或非法引用

#2


语法没错,逻辑有错。
看代码的样子,多半是指针,内存没处理好。

#3


从main()的第一行开始单步运行,看走到哪一步出现这个错误,就能定位出来了!!

#4


自己设断点追踪下就好了,一般都是段错误,数组越界什么的。程序员要学会自己调试,这个是必须要会的技能。

#5


当然是逻辑错误了。建议调试一下。

#6


代码太乱了,勉强看了点,for(int z=0;z<17;z++) p->t[z]=NULL;这里就操作越界了,17个元素了,你自己看看你节点里定的数组大小。还有,这种常量限定值最好定义成全局的,这样直接给数字很不规范,要是你笔试,别人直接把你PASS掉

#7


if(s[top]->t[x1]=NULL)  //子指针为空,则增加一个节点,判断相等== 也写错, 这些最基本的自我检查都不检查下,你发这上面来,谁想帮你看? 

#8


该回复于2013-11-10 09:15:50被管理员删除

#9


该回复于2013-11-10 09:15:50被管理员删除

#10


正确运行,错误代码已注释并更正,请楼主自行阅读理解!共勉! 自己写的一棵树程序,编译正确,但为什么程序一运行就显示*.exe已停止工作
#include<stdio.h>
#include<iostream.h>
#include<stdlib.h>
#include<time.h>
#define N1 10
typedef int elementype;

struct GTreeNode{
elementype data;
    GTreeNode* t[N1];
};

//建树
void CreatTree(GTreeNode*& GT)
{
int a[4][5]={{1,2,3,4,5},{11,2,3,4,5},{12,2,3,4,5},{11,2,3,4,5}};
const int MS=100;
GTreeNode* s[MS];//储存树结点指针
int d[MS];
int top=-1;
GTreeNode* p;
p= new GTreeNode;
p->data=0;
GT=p;

top++;
s[top]=p;
d[top]=0;
//***for(int z=0;z<17;z++)****
for(int z=0;z<N1;z++)
p->t[z]=NULL;

for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
{
for(int x1=0;x1<N1;x1++)      //判断该层指针是否与数组中的对应。
{
//*******if(s[top]->t[x1]=NULL)  //子指针为空,则增加一个节点*****
if(s[top]->t[x1]==NULL)
{
p=new GTreeNode;
p->data=a[i][j];
printf("%d  ",p->data);
for(int x2=0;x2<N1;x2++)
p->t[x2]=NULL;
s[top]->t[x1]=p;
top++;
d[top]=0;
s[top]=p;
break;       //增加完节点后退出本次循环,继续下一个数值的比较
}
else if((s[top]->t[x1]->data!=a[i][j]))    //如果某一个节点和当前值不相等,则继续和下一个节点相比
continue;                               //直到找到和当前值相等的节点或者空指针为止。  

else if((s[top]->t[x1])->data==a[i][j])
{
top++;
s[top]=p;
d[top]=0;
break;       
}//如果相等,则跳出本层循环,继续下一个对比
}
continue;
}
top=top-2;//指针重新回到根节点
}
}

//void InitGTree(GTreeNode*& GT){
// GT=NULL;
void main()
{
GTreeNode* GT;
//InitGTree(GT);
CreatTree(GT);
}

#11


引用 10 楼 zh19921107 的回复:
正确运行,错误代码已注释并更正,请楼主自行阅读理解!共勉! 自己写的一棵树程序,编译正确,但为什么程序一运行就显示*.exe已停止工作
#include<stdio.h>
#include<iostream.h>
#include<stdlib.h>
#include<time.h>
#define N1 10
typedef int elementype;

struct GTreeNode{
elementype data;
    GTreeNode* t[N1];
};

//建树
void CreatTree(GTreeNode*& GT)
{
int a[4][5]={{1,2,3,4,5},{11,2,3,4,5},{12,2,3,4,5},{11,2,3,4,5}};
const int MS=100;
GTreeNode* s[MS];//储存树结点指针
int d[MS];
int top=-1;
GTreeNode* p;
p= new GTreeNode;
p->data=0;
GT=p;

top++;
s[top]=p;
d[top]=0;
//***for(int z=0;z<17;z++)****
for(int z=0;z<N1;z++)
p->t[z]=NULL;

for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
{
for(int x1=0;x1<N1;x1++)      //判断该层指针是否与数组中的对应。
{
//*******if(s[top]->t[x1]=NULL)  //子指针为空,则增加一个节点*****
if(s[top]->t[x1]==NULL)
{
p=new GTreeNode;
p->data=a[i][j];
printf("%d  ",p->data);
for(int x2=0;x2<N1;x2++)
p->t[x2]=NULL;
s[top]->t[x1]=p;
top++;
d[top]=0;
s[top]=p;
break;       //增加完节点后退出本次循环,继续下一个数值的比较
}
else if((s[top]->t[x1]->data!=a[i][j]))    //如果某一个节点和当前值不相等,则继续和下一个节点相比
continue;                               //直到找到和当前值相等的节点或者空指针为止。  

else if((s[top]->t[x1])->data==a[i][j])
{
top++;
s[top]=p;
d[top]=0;
break;       
}//如果相等,则跳出本层循环,继续下一个对比
}
continue;
}
top=top-2;//指针重新回到根节点
}
}

//void InitGTree(GTreeNode*& GT){
// GT=NULL;
void main()
{
GTreeNode* GT;
//InitGTree(GT);
CreatTree(GT);
}


谢谢。问题解决了

#1


停止工作就是段错误了 数组越界 或非法引用

#2


语法没错,逻辑有错。
看代码的样子,多半是指针,内存没处理好。

#3


从main()的第一行开始单步运行,看走到哪一步出现这个错误,就能定位出来了!!

#4


自己设断点追踪下就好了,一般都是段错误,数组越界什么的。程序员要学会自己调试,这个是必须要会的技能。

#5


当然是逻辑错误了。建议调试一下。

#6


代码太乱了,勉强看了点,for(int z=0;z<17;z++) p->t[z]=NULL;这里就操作越界了,17个元素了,你自己看看你节点里定的数组大小。还有,这种常量限定值最好定义成全局的,这样直接给数字很不规范,要是你笔试,别人直接把你PASS掉

#7


if(s[top]->t[x1]=NULL)  //子指针为空,则增加一个节点,判断相等== 也写错, 这些最基本的自我检查都不检查下,你发这上面来,谁想帮你看? 

#8


该回复于2013-11-10 09:15:50被管理员删除

#9


该回复于2013-11-10 09:15:50被管理员删除

#10


正确运行,错误代码已注释并更正,请楼主自行阅读理解!共勉! 自己写的一棵树程序,编译正确,但为什么程序一运行就显示*.exe已停止工作
#include<stdio.h>
#include<iostream.h>
#include<stdlib.h>
#include<time.h>
#define N1 10
typedef int elementype;

struct GTreeNode{
elementype data;
    GTreeNode* t[N1];
};

//建树
void CreatTree(GTreeNode*& GT)
{
int a[4][5]={{1,2,3,4,5},{11,2,3,4,5},{12,2,3,4,5},{11,2,3,4,5}};
const int MS=100;
GTreeNode* s[MS];//储存树结点指针
int d[MS];
int top=-1;
GTreeNode* p;
p= new GTreeNode;
p->data=0;
GT=p;

top++;
s[top]=p;
d[top]=0;
//***for(int z=0;z<17;z++)****
for(int z=0;z<N1;z++)
p->t[z]=NULL;

for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
{
for(int x1=0;x1<N1;x1++)      //判断该层指针是否与数组中的对应。
{
//*******if(s[top]->t[x1]=NULL)  //子指针为空,则增加一个节点*****
if(s[top]->t[x1]==NULL)
{
p=new GTreeNode;
p->data=a[i][j];
printf("%d  ",p->data);
for(int x2=0;x2<N1;x2++)
p->t[x2]=NULL;
s[top]->t[x1]=p;
top++;
d[top]=0;
s[top]=p;
break;       //增加完节点后退出本次循环,继续下一个数值的比较
}
else if((s[top]->t[x1]->data!=a[i][j]))    //如果某一个节点和当前值不相等,则继续和下一个节点相比
continue;                               //直到找到和当前值相等的节点或者空指针为止。  

else if((s[top]->t[x1])->data==a[i][j])
{
top++;
s[top]=p;
d[top]=0;
break;       
}//如果相等,则跳出本层循环,继续下一个对比
}
continue;
}
top=top-2;//指针重新回到根节点
}
}

//void InitGTree(GTreeNode*& GT){
// GT=NULL;
void main()
{
GTreeNode* GT;
//InitGTree(GT);
CreatTree(GT);
}

#11


引用 10 楼 zh19921107 的回复:
正确运行,错误代码已注释并更正,请楼主自行阅读理解!共勉! 自己写的一棵树程序,编译正确,但为什么程序一运行就显示*.exe已停止工作
#include<stdio.h>
#include<iostream.h>
#include<stdlib.h>
#include<time.h>
#define N1 10
typedef int elementype;

struct GTreeNode{
elementype data;
    GTreeNode* t[N1];
};

//建树
void CreatTree(GTreeNode*& GT)
{
int a[4][5]={{1,2,3,4,5},{11,2,3,4,5},{12,2,3,4,5},{11,2,3,4,5}};
const int MS=100;
GTreeNode* s[MS];//储存树结点指针
int d[MS];
int top=-1;
GTreeNode* p;
p= new GTreeNode;
p->data=0;
GT=p;

top++;
s[top]=p;
d[top]=0;
//***for(int z=0;z<17;z++)****
for(int z=0;z<N1;z++)
p->t[z]=NULL;

for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
{
for(int x1=0;x1<N1;x1++)      //判断该层指针是否与数组中的对应。
{
//*******if(s[top]->t[x1]=NULL)  //子指针为空,则增加一个节点*****
if(s[top]->t[x1]==NULL)
{
p=new GTreeNode;
p->data=a[i][j];
printf("%d  ",p->data);
for(int x2=0;x2<N1;x2++)
p->t[x2]=NULL;
s[top]->t[x1]=p;
top++;
d[top]=0;
s[top]=p;
break;       //增加完节点后退出本次循环,继续下一个数值的比较
}
else if((s[top]->t[x1]->data!=a[i][j]))    //如果某一个节点和当前值不相等,则继续和下一个节点相比
continue;                               //直到找到和当前值相等的节点或者空指针为止。  

else if((s[top]->t[x1])->data==a[i][j])
{
top++;
s[top]=p;
d[top]=0;
break;       
}//如果相等,则跳出本层循环,继续下一个对比
}
continue;
}
top=top-2;//指针重新回到根节点
}
}

//void InitGTree(GTreeNode*& GT){
// GT=NULL;
void main()
{
GTreeNode* GT;
//InitGTree(GT);
CreatTree(GT);
}


谢谢。问题解决了