C中的分段错误

时间:2013-02-14 01:41:06

标签: c linux data-structures segmentation-fault

编辑:交换机的默认设置是“无效选项”,我只是想创建一个全部的树,程序正在编译,当我选择创建树的选项时,它只是说分段错误

过去几天我一直在做简单的数据结构程序,分段错误是困扰我的一个,我在互联网上研究了这个错误并得到了这个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,我也回答了这个问题,顺便说一下,我正在写一个树程序。

2 个答案:

答案 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");
 }
  }
}