【问题标题】:Cant insert Node to binary tree无法将节点插入二叉树
【发布时间】:2022-11-30 23:56:31
【问题描述】:

我正在尝试将节点插入二叉树。这是我创建 Node 的功能(其余已完成)。

void BVSCreate_function(TNodef *rootPtr, function_save token) {
    TNodef *newPtr = malloc(sizeof(struct tnodef));
    if (newPtr == NULL) {
        fprintf(stderr, "99");
        return;
    }
    TNodef init;
    string initStr;
    initStr.str = NULL;
    initStr.length = 0;
    initStr.alloc = 0;
    newPtr = &init;
    newPtr->content = &initStr;
    newPtr->leftPtr = NULL;
    newPtr->rightPtr = NULL;
    newPtr->return_type = token.ret_value;
    newPtr->parameters = token.param_count;
    strCpyStr(newPtr->content, token.content);
    rootPtr = newPtr;
}

void BVSInsert_function(TNodef *rootPtr, function_save token) {
    if (rootPtr == NULL) {
        BVSCreate_function(rootPtr, token);
    } else {
        if ((strCmpStr(token.content, rootPtr->content)) < 0) {
            BVSCreate_function(rootPtr->leftPtr, token);
        } else
        if ((strCmpStr(token.content, rootPtr->content)) > 0) {
            BVSCreate_function(rootPtr->rightPtr, token);
        }
    }
}

当 TNodef 和 function_save 是结构时:

typedef struct {
    string *content;
    int param_count;
    int ret_value;
} function_save;

typedef struct tnodef {
    string *content;
    struct tnodef *leftPtr;
    struct tnodef *rightPtr;
    int parameters;
    int return_type;
} TNodef;

string 被定义为这个结构:

typedef struct {
    char *str;  // content of string
    int length; // length of string
    int alloc;  // amount of memory allocated
} string;

strCpystr 功能:

int strCpyStr(string *s1, string *s2) {
    int len2 = s2->length;
    if (len2 > s1->alloc) {
        if (((s1->str) = (char *)realloc(s1->str, len2 + 1)) == NULL) {
            return 1;
        }
        s1->alloc = len2 + 1;
    }
    strcpy(s1->str, s2->str);
    s1->length = len2 + 1;
    return 0;
}

我正在尝试在二叉树中创建一个节点,并将来自 struct function_save 的信息放在那里。 但是当我尝试在插入后打印这棵树时,它告诉我那棵树仍然是空的。

【问题讨论】:

  • 声明 TNodef init 后,分配 newPtr = &amp;init 是一个非常糟糕的主意。
  • 一个更糟糕的想法是分配newPtr = malloc(...),然后用newPtr = &amp;init覆盖它。
  • 这两种情况(分别和一起)的结论是,需要对内存分配和赋值有更基本的了解。
  • @bbbbbbbbb 所以我需要删除 newPtr = &init 是吗?
  • @ryyker 我添加了我的功能

标签: c binary-tree binary-search-tree


【解决方案1】:

您的代码具有未定义的行为,因为:

  • newPtr = &amp;init; 丢弃分配的节点,而是使用一个局部结构,该结构将在函数返回后立即失效。

  • newPtr-&gt;content = &amp;initStr; 不正确的原因相同:您也应该为 string 分配内存,或者可能修改 TNodeDef 以使 content 成为 string 对象而不是指针。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-13
    • 1970-01-01
    相关资源
    最近更新 更多