#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
#9
#10
正确运行,错误代码已注释并更正,请楼主自行阅读理解!共勉!
#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
谢谢。问题解决了
#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
#9
#10
正确运行,错误代码已注释并更正,请楼主自行阅读理解!共勉!
#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
谢谢。问题解决了