所以从根本上讲,我正在研究一个简单的程序,将数据插入到二叉树中。该程序为整数变量15调用函数,该整数变量将成为头节点,然后为变量12调用相同的函数,该变量应在根节点的左分支上实现新数据。不幸的是,尽管第一部分可以正常工作并且根节点已打印出来,但是当为根节点的左分支实施新值时,什么也没有发生。欢迎任何提示和建议。谢谢。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct node
{
int data;
struct node *right;
struct node *left;
} NODE;
void *insert(int ins, NODE *start)
{
NODE *newNode = malloc(sizeof(NODE));
if (start == NULL )
{
newNode->data = ins;
newNode->left = NULL;
newNode->right = NULL;
}
if(ins<start->data)
{
insert(ins, start->left);
}
else if(ins>start->data)
{
insert(ins, start->right);
}
}
int main()
{
int number;
NODE *head;
head=NULL;
number = 15;
head = insert(number, head);
printf("prints the first element (head): %d", head->data);
number = 12;
insert(number, head);
printf("should print the left branch : %d", head->left->data); // <- THIS DOES NOT SHOW UP
}
答案 0 :(得分:0)
start参数是通过值传递的,因此它永远不会被修改。您拥有的一种选择是将指针传递给NODE的指针,如下所示:
void insert(int ins, NODE **start)
{
if (*start == NULL )
{
NODE *newNode = (NODE *)malloc(sizeof(NODE));
newNode->data = ins;
newNode->left = NULL;
newNode->right = NULL;
*start = newNode;
}
if(ins< (*start)->data)
{
insert(ins, &(*start)->left);
}
else if(ins> (*start)->data)
{
insert(ins, &(*start)->right);
}
}
int main()
{
int number;
NODE *head;
head=NULL;
number = 15;
insert(number, &head); ///Doesn't need head=insert(...) anymore
printf("prints the first element (head): %d", head->data);
number = 12;
insert(number, &head);
printf("should print the left branch : %d", head->left->data);
}
答案 1 :(得分:0)
看起来下面的东西接近您想要的。
这是一个递归libmkl_gnu_thread.so
函数,它获取节点的地址,并查看是否应将新节点添加到树中还是采用分支以继续寻找执行节点的位置插入。
还要考虑的一件事是,如果树中已经存在该值,该怎么办。在这种情况下,我们只是跳过它,并假设树只应包含唯一值。
我并没有真正了解树的知识,所以我不确定这是哪种二叉树或遍历树,等等。我将由您自己决定。
-Wl,--no-as-neeeded
生成的输出是:
insert()