0

学校の宿題用です。新しいノードを BST に追加しようとすると、セグ フォールトが発生します。メモリの割り当て方法に関係があるのではないかと思いますが、問題を解決する方法がわかりません。

構造コード:

struct tnode {
  char* data;
  struct tnode* left;
  struct tnode* right;
};

typedef struct tnode Tnode;

ノード機能を追加:

Tnode* add_tnode(Tnode* current_tnode, char* value) {
  if (current_tnode == NULL) {
    malloc(sizeof(Tnode));
    current_tnode->data = value;
    current_tnode->left = NULL;
    current_tnode->right = NULL;
    return current_tnode;
      }
  else {
    if (strcmp(current_tnode->data, value) <= 0) {
      add_tnode(current_tnode->left, value);
      return current_tnode->left;
      }
    else {
      add_tnode(current_tnode->right, value);
      return current_tnode->right;
      }
  }
}

関数をテストするメイン プログラム:

int main() {
  Tnode* new_node =  (Tnode*)malloc(sizeof(Tnode));
  char* data1 = "Hello";
  char* data2 = "Goodbye";
  char* data3 = "Hi";
  char* data4 = "Bye";
  char* data5 = "Hey";

  add_tnode(new_node, data1);
  add_tnode(new_node, data2);
  add_tnode(new_node, data3);
  add_tnode(new_node, data4);
  add_tnode(new_node, data5);

  return 0;
}    

これは、セグメンテーション違反をバックトレースしたときに受け取るエラーです。

#0  0x0000003458478350 in strcmp () from /lib64/libc.so.6
#1  0x00000000004005be in add_tnode (current_tnode=0x601010, 
    value=0x400708 "Hello") at tree.c:16
#2  0x0000000000400523 in main () at treetest.c:12

strcmp() がノードに格納されている文字列を見つけようとすると、それが見つからないと考えています。ヘルプやヒントをいただければ幸いです。

4

3 に答える 3

1

行 ( add_tnode)

malloc(sizeof(Tnode));

する必要があります

current_tnode = malloc(sizeof(Tnode));

現在、からの戻り値をすぐに破棄しています。mallocつまり、コードの次の行が NULL ポインターを逆参照し、セグ フォールトを引き起こしています。

また、明示的に、または using を割り当てて、new_nodeinのメンバーを初期化する必要があります。そして、Karoly Horvath が指摘したように、からの戻り値を使用します。maincallocadd_tnode

于 2013-02-17T21:51:43.923 に答える
0

「new_node」の「data」フィールドにアクセスしようとしています。

ただし、「new_node」はデータ値で初期化されていません。

これらの行をif句から移動する必要があります。

 current_tnode->data = value;
current_tnode->left = NULL;
current_tnode->right = NULL;

幸運を。

于 2013-02-17T22:00:33.540 に答える