过去几天我一直在做简单的数据结构程序,分段错误是困扰我的一个,我在互联网上研究了这个错误并得到了这个link实际上并没有没帮忙。
我正在尝试创建二叉搜索树。并且create的返回类型不是void,它是struct tree *
程序:
struct tree{
int data;
struct tree *rchild, *lchild;
};
struct tree * create(struct tree * root, int d){
if(root==NULL) {
root = (struct tree *) malloc(sizeof(struct tree));
root->data=d;
root->rchild=NULL;
root->lchild=NULL;
}else if(root->data < d) create(root->rchild, d);
else if(root->data > d) create(root->lchild, d);
else if(root->data == d) printf("duplication error");
}
main(){
struct tree *root;
int choice, c;
while(choice!=5){
printf("Enter choice\n1-insert into tree\n5-exit");
scanf("%d", &choice);
switch(choice){
case 1:
printf("enter data to be inserted");
scanf("%d",&c);
printf("error after scanf ");
create(root,c);
break;
case 5: exit(0); default: printf("invalid option");
}
}
}
我正在使用的OS是Backtrack 5 R1
给那个给-1的人:主席先生,如果这个问题太愚蠢且没有建设性,请告诉我问题的答案有一个类似的linked list question,我也回答了这个问题,顺便说一下,我正在写一个树程序。
答案 0 :(得分:3)
至少,我不认为create()可以正常工作。
您应该使用struct tree **而不是struct tree *。
由于您的节点根为NULL,因此create(root)表示create(NULL),它不能将分配的内存分配给root。您应该将其定义为create(struct tree **),并使用create(&amp; root)
调用它答案 1 :(得分:0)
你在create函数中是malloc'ing root
,但没有理由为什么它会在调用中幸存,因为它没有通过引用传递。如果您通过了&amp; root,则可以更改* root。实际上,您不会在树中创建新节点...每次从create
返回时,root
指针都为NULL ...
或者,您可以返回root
的新值作为通话的返回值,并使用
root = create( root, c);
您可以通过添加
向自己证明这一点printf("root is now %p\n", root);
在create
来电后
简而言之,以下工作:
struct tree{
int data;
struct tree *rchild, *lchild;
};
struct tree* create(struct tree * root, int d){
printf("creating node with d = %d\n", d);
if(root==NULL) {
root = (struct tree *) malloc(sizeof(struct tree));
root->data=d;
root->rchild=NULL;
root->lchild=NULL;
}else if(root->data < d) create(root->rchild, d);
else if(root->data > d) create(root->lchild, d);
else if(root->data == d) printf("duplication error");
return root;
}
main(){
struct tree *root;
int choice, c;
while(choice!=5){
printf("Enter choice\n1-insert into tree\n5-exit");
scanf("%d", &choice);
printf("root is now %p\n", root);
switch(choice){
case 1:
printf("enter data to be inserted");
scanf("%d",&c);
printf("made it past scanf\n");
root = create(root,c);
break;
case 5: exit(0);
default: printf("invalid option\n");
}
}
}