-1

编辑:开关的默认值为“无效选项”,我只是想创建一棵树,程序正在编译,当我选择创建树的选项时,它只是说分段错误

过去几天我一直在做简单的数据结构程序,分段错误是困扰我很多的一个,我在互联网上研究了这个错误并得到了这个 链接,实际上它并没有帮助。

我正在尝试创建一个二叉搜索树。并且 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");
  }
  }
}

我使用的操作系统是 Backtrack 5 R1

给给-1的人:先生,如果我的问题如此愚蠢和没有建设性,请告诉我的答案

有一个类似的链表问题,我也回答了这个问题,顺便写了一个树程序。

4

2 回答 2

3

至少,我认为 create() 不能正常工作。

您应该使用 struct tree ** 而不是 struct tree *。

由于您的节点根为 NULL,因此 create(root) 表示 create(NULL),它不能将分配的内存分配给根。您应该将其定义为 create(struct tree**),并使用 create(&root) 调用它

于 2013-02-14T01:50:47.487 回答
0

root在 create 函数中进行 malloc'ing,但没有理由在调用中幸存下来,因为它不是通过引用传递的。如果你通过了 &root,你就可以改变 *root。实际上,您不会在树中创建新节点...每次您从 中返回时createroot指针都是 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");
 }
  }
}
于 2013-02-14T02:19:03.347 回答