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

使用しているOSはBacktrack 5 R1です

-1 を与えた人へ: 閣下、私の質問に対する答えを教えてください。

同様のリンクされたリストの質問があります。私もその質問に答えました。ところで、ツリープログラムを書いています。

4

2 に答える 2

3

少なくとも、create() が正しく機能するとは思えません。

構造体ツリー * の代わりに構造体ツリー ** を使用する必要があります。

ノード ルートが NULL であるため、create(root) は create(NULL) を意味し、割り当てられたメモリをルートに割り当てることはできません。create(struct tree**) として定義し、create(&root) で呼び出す必要があります。

于 2013-02-14T01:50:47.487 に答える
0

create関数でmallocrootを実行していますが、参照によって渡されていないため、呼び出しが存続する理由はありません。&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");
 }
  }
}
于 2013-02-14T02:19:03.347 に答える