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

您当前正在立即丢弃 from 的返回值malloc,这意味着下一行代码取消引用 NULL 指针,从而导致您的段错误。

您还需要显式地或通过使用分配来初始化new_nodein的成员。并且,正如 Karoly Horvath 所指出的,使用来自的返回值maincallocadd_tnode

于 2013-02-17T21:51:43.923 回答
1

另一个问题:

add_tnode返回新分配节点的地址,但您从不使用它。

于 2013-02-17T21:53:33.877 回答
0

您正在尝试访问“new_node”的“数据”字段,

但是“new_node”没有用数据值初始化。

您需要将这些行移出 if 子句:

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

祝你好运。

于 2013-02-17T22:00:33.540 回答