gpt4 book ai didi

c - C 中的二叉树 - 段错误

转载 作者:行者123 更新时间:2023-11-30 18:43:11 25 4
gpt4 key购买 nike

#include <stdio.h>
#include <stdlib.h>

typedef struct nod{
int data;
struct nod *left,*right;
}NOD;

NOD * generate(NOD * root)
{
NOD *r,*p;
int d=-1,value,line,position,i,f,v;
if(root==NULL)
{
do{
printf("Would you like to create the root node?\n\n1 - yes\n0 - no\n");
scanf("%d",&d);
switch(d)
{
case 1:
printf("Value=");
scanf("%d",&value);
root=add_root(value);
break;
case 0:
return NULL;
break;
default:
printf("Command unrecognized!\n");
break;
}
} while(d==-1);
if(root!=NULL)
printf("Root node successfully created!\n");
else
printf("Error: could not create root node!\n");
d=-1;
do{
printf("Continue adding nodes?\n\n1 - yes\n0 - no\n");
scanf("%d",&d);
switch(d)
{
case 1:
printf("Insert the line and the position of the node you wish to add (root node has line=0, position=0)\nLine=");
scanf("%d",&line);
printf("Position ( less or equal with 2^$line-1 )=");
scanf("%d",&position);
printf("Value=");
scanf("%d",&value);
r=p=root;
for(i=line-1;i=0;i--)
{
f=power(2,i);
if(position & f == f) // if the i-(st,nd,rd,th) bit of "position" is 1, then (position & f == f) is true and *r will go right
{
p=r;
r=r->right;
v=1;
}
else
{
p=r;
r=r->left;
v=0;
}
}
if(v==0)
p=add_left(&r,value);
if(v==1)
p=add_right(&r,value);

break;
case 0:
return root;
break;
default:
printf("Command unrecognized!\n");
break;
}
} while(d==-1);
}
else
{
...
}

NOD * add_left(NOD **p,int value)
{
NOD * r;
r=malloc(sizeof(NOD));
r->data=value;
r->left=NULL;
r->right=NULL;
(*p)->left=r;
return r;
}

NOD * add_right(NOD **p,int value)
{
NOD * r;
r=malloc(sizeof(NOD));
r->data=value;
r->left=NULL;
r->right=NULL;
(*p)->right=r;
return r;
}

NOD * add_root(int value)
{
NOD * x;
x=malloc(sizeof(NOD));
x->data=value;
x->left=NULL;
x->right=NULL;
return x;
}

}
int main() {
NOD *root=NULL;
root=generate(root);
return 0;
}
<小时/>

我尝试制作一个创建二叉树的程序,但我不断收到 SIGSEGV 段错误,我不明白为什么。你能告诉我我做错了什么吗?

if(position & f == f)   // if the i-(st,nd,rd,th) bit of "*position*" is 1,
// then (position & f == f) is true and *r will go right

您对这部分有何看法?

  • line是树的级别(根有line=0)

  • position是节点从左到右的位置(root的position=0)

最佳答案

您已经将有问题的部分加粗了:

if(position & f == f) 

== 的优先级高于 &,因此被解析为

if(position & (f == f))

and 与 if (position & 1) 相同,不是您想要的。

此外,循环条件错误

for(i=line-1;i=0;i--)

测试可能应该是 i >= 0,否则循环永远不会执行(i = 0 是一个计算结果为 0 的赋值)。

如果这些已修复并执行循环,则在第一次迭代后 r 为空指针,则下一次循环迭代会导致 r = r->right;r 崩溃。 code>,或者,如果循环仅迭代一次,则 add_left(&r,value);(或 add_right)在尝试访问其 的倒数第二行上取消引用空指针>左(分别)指针:

NOD * add_left(NOD **p,int value)
{
NOD * r;
r=malloc(sizeof(NOD));
r->data=value;
r->left=NULL;
r->right=NULL;
(*p)->left=r; // *p == NULL here
return r;
}

关于c - C 中的二叉树 - 段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10778030/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com