所以我试图学习如何在C中创建一个二叉树到目前为止我已经有了这个。
void addRecordsToTree(struct date *in, struct date *root) {
if (root == NULL) {
root = malloc(sizeof(struct date));
root = in;
return;
} else {
//Right side of tree processing
if (compareTwoRecords(in, root) >= 0) {
addRecordsToTree(in, root->right);
return;
} else {
root->right = in;
return;
}
//Left side of tree processing.
if (compareTwoRecords(in, root) < 0) {
addRecordsToTree(in, root->left);
return;
} else {
root->left = in;
return;
}
}
}
int main() {
loadFiles();
struct date treeRoot;
struct date *old = malloc(sizeof(struct date));
old = loadContentsIntoHeap(files[file2014]);
addRecordsToTree(&old[0], &treeRoot);
addRecordsToTree(&old[1], &treeRoot);
addRecordsToTree(&old[2], &treeRoot);
addRecordsToTree(&old[3], &treeRoot);
addRecordsToTree(&old[4], &treeRoot);
addRecordsToTree(&old[5], &treeRoot);
printRecord(7, old);
return 0;
}
问题是当我在调试器中检查程序的状态时,只有混乱的数据。我认为这可能是一个类型问题,我发现指针有点令人难以置信的概念。我不确定我是否使用过它们。所以这是调试器的屏幕截图。
正如您可以在底部的结构中看到的那样,旧的&#39;是我试图使树出来的数据和treeRoot是我试图放置它的地方,但我无法理解为什么我得到这些垃圾值。
还有什么是左右内存地址?我没有正确地创造它们。
我做的另一个观察是当我在调试器中看到我的代码时,似乎root永远不会== NULL并且永远不会被设置,为什么?
答案 0 :(得分:1)
您刚刚执行了以下操作:
int x = 2;
int y = x;
y = 5;
第二行是必要的还是第三行。如果你这样做,这是一个完全不合逻辑的程序。你用指针而不是整数做了同样的事情。你首先有一个指向动态内存基地址的指针,然后你只是通过第二次初始化来覆盖它。
而且,与递归方法相比,迭代方法要好得多。我共享用于递归和迭代地在二叉树中插入节点的代码:
void insert(struct node *temp, struct node **root)
{
while (*root != NULL)
root = (*root)->element < temp->element ? &(*root)->left : &(*root)->right;
*root = temp;
}
#if 0
/* Recursive approach */
void insert(struct node *temp, struct node **root)
{
if(*root == NULL)
*root = temp;
else if ((*root)->element < temp->element)
insert(temp, &(*root)->left);
else
insert(temp, &(*root)->right);
}
#endif
void create_node(int x, struct node **root)
{
struct node *temp = (struct node *) malloc(sizeof(struct node));
if (temp == NULL)
printf("Unable to allocate memory. Free some space.\n");
else
{
temp->left = NULL;
temp->right = NULL;
temp->element = x;
insert(temp, root);
}
}
int main()
{
struct node *root = NULL;
create_node(1, &root);
create_node(2, &root);
create_node(3, &root);
return 0;
}
答案 1 :(得分:0)
我在你的&#34; addRecordsToTree&#34; -function中看到了一个额外的问题:
的IF块
&#34; //树处理的右侧&#34;
总是从函数返回。无论是&#34; IF&#34; -Expression是真还是假。 所以你永远不会插入你的左叶。因此,probalby应该检查/调试该功能。