C - 二进制搜索树 - 按顺序打印不打印任何东西(仔细检查我的指针)
C - Binary Search Tree - Print in Order Doesn't Print Anything (Double check my pointers)
好的,所以我试图找到的问题是为什么当我调用 print_inOrder() 时,我没有得到任何回显。我想做的作业是按降序编写一个树算法(意味着左边的值较高,右边的值较低)。不久前我已经创建了一个创建树的函数,所以我刚刚修改了它并且它可以正常工作;然而,这个作业的签名与我以前的作业不同,当我尝试改变指针时,我编译了它,但没有打印出来。因此,如果有人可以仔细检查我的更改并解释我哪里出错以及我需要如何修复它,那将让我开心! ^.^
工作原函数:
Tnode add_tnode(Tnode **current_tnode, char *value)
{
if(!(*current_tnode))
{
*current_tnode = (Tnode*) malloc(sizeof(Tnode));
(*current_tnode)->strValue = value;
//initialize the children to null
(*current_tnode)->left = NULL;
(*current_tnode)->right = NULL;
}
//Greater values go to left
else if(strcmp(value, (*current_tnode)->strValue) >= 0)
{
return add_tnode(&(*current_tnode)->left, value);
}
//Lesser values go to right
else if(strcmp(value, (*current_tnode)->strValue) < 0)
{
return add_tnode(&(*current_tnode)->right, value);
}
}
main 中的调用方式:
Tnode *root;
root = NULL;
//Add some nodes with string values
add_tnode(&root, "pie");
add_tnode(&root, "hi");
add_tnode(&root, "hi");
add_tnode(&root, "l");
add_tnode(&root, "leg");
//Print nodes in descending order
print_inOrder(root);
需要签名:
Tnode *add_tnode(Tnode *current_tnode, char* value)
我尝试修复:
Tnode *add_tnode(Tnode *current_tnode, char* value)
{
if(!(current_tnode))
{
current_tnode = (Tnode*) malloc(sizeof(Tnode));
(current_tnode)->strValue = value;
/* initialize the children to null */
(current_tnode)->left = NULL;
(current_tnode)->right = NULL;
}
// Greater values go to left
else if(strcmp(value, (current_tnode)->strValue) >= 0)
{
return add_tnode((current_tnode)->left, value);
}
// Lesser values go to right
else if(strcmp(value, (current_tnode)->strValue) < 0)
{
return add_tnode((current_tnode)->right, value);
}
}
它在 Main 中的称呼:
Tnode *root;
root = NULL;
//Add some nodes with string values
add_tnode(root, "pie");
add_tnode(root, "hi");
add_tnode(root, "hi");
add_tnode(root, "l");
add_tnode(root, "leg");
//Print nodes in descending order
print_inOrder(root);
这里是 print_inOrder() 以防万一有人想看
void print_inOrder(Tnode *current_tnode)
{
if (current_tnode)
{
print_inOrder(current_tnode->left);
printf("%s\n",current_tnode->strValue);
print_inOrder(current_tnode->right);
}
}
当我 运行 它通过 gdb 调试器并调用 print 函数时,它只通过 if 语句并结束,我猜这意味着根本没有创建树或通过值不正确。如果有人能告诉我错误是什么,我将不胜感激!
你的问题是你的第一个函数接受了一个Tnode **
,这是一个指向指针的指针,并修改了它指向的TNode *
。您的第二个函数只接受指针,并修改传入的参数;调用者看不到这些更改,因此不会向树中添加任何内容。
您应该在执行任何操作之前先分配 root
节点,然后更改函数,使其修改 TNode
而不是指向该节点的指针。
如果您之前的作业成功了,您所要做的就是更改打印功能,在探索左侧节点之前探索右侧节点。
void print_inOrder(Tnode *current_tnode)
{
if (current_tnode)
{
print_inOrder(current_tnode->right);
printf("%s\n",current_tnode->strValue);
print_inOrder(current_tnode->left);
}
}
好的,所以我试图找到的问题是为什么当我调用 print_inOrder() 时,我没有得到任何回显。我想做的作业是按降序编写一个树算法(意味着左边的值较高,右边的值较低)。不久前我已经创建了一个创建树的函数,所以我刚刚修改了它并且它可以正常工作;然而,这个作业的签名与我以前的作业不同,当我尝试改变指针时,我编译了它,但没有打印出来。因此,如果有人可以仔细检查我的更改并解释我哪里出错以及我需要如何修复它,那将让我开心! ^.^
工作原函数:
Tnode add_tnode(Tnode **current_tnode, char *value)
{
if(!(*current_tnode))
{
*current_tnode = (Tnode*) malloc(sizeof(Tnode));
(*current_tnode)->strValue = value;
//initialize the children to null
(*current_tnode)->left = NULL;
(*current_tnode)->right = NULL;
}
//Greater values go to left
else if(strcmp(value, (*current_tnode)->strValue) >= 0)
{
return add_tnode(&(*current_tnode)->left, value);
}
//Lesser values go to right
else if(strcmp(value, (*current_tnode)->strValue) < 0)
{
return add_tnode(&(*current_tnode)->right, value);
}
}
main 中的调用方式:
Tnode *root;
root = NULL;
//Add some nodes with string values
add_tnode(&root, "pie");
add_tnode(&root, "hi");
add_tnode(&root, "hi");
add_tnode(&root, "l");
add_tnode(&root, "leg");
//Print nodes in descending order
print_inOrder(root);
需要签名:
Tnode *add_tnode(Tnode *current_tnode, char* value)
我尝试修复:
Tnode *add_tnode(Tnode *current_tnode, char* value)
{
if(!(current_tnode))
{
current_tnode = (Tnode*) malloc(sizeof(Tnode));
(current_tnode)->strValue = value;
/* initialize the children to null */
(current_tnode)->left = NULL;
(current_tnode)->right = NULL;
}
// Greater values go to left
else if(strcmp(value, (current_tnode)->strValue) >= 0)
{
return add_tnode((current_tnode)->left, value);
}
// Lesser values go to right
else if(strcmp(value, (current_tnode)->strValue) < 0)
{
return add_tnode((current_tnode)->right, value);
}
}
它在 Main 中的称呼:
Tnode *root;
root = NULL;
//Add some nodes with string values
add_tnode(root, "pie");
add_tnode(root, "hi");
add_tnode(root, "hi");
add_tnode(root, "l");
add_tnode(root, "leg");
//Print nodes in descending order
print_inOrder(root);
这里是 print_inOrder() 以防万一有人想看
void print_inOrder(Tnode *current_tnode)
{
if (current_tnode)
{
print_inOrder(current_tnode->left);
printf("%s\n",current_tnode->strValue);
print_inOrder(current_tnode->right);
}
}
当我 运行 它通过 gdb 调试器并调用 print 函数时,它只通过 if 语句并结束,我猜这意味着根本没有创建树或通过值不正确。如果有人能告诉我错误是什么,我将不胜感激!
你的问题是你的第一个函数接受了一个Tnode **
,这是一个指向指针的指针,并修改了它指向的TNode *
。您的第二个函数只接受指针,并修改传入的参数;调用者看不到这些更改,因此不会向树中添加任何内容。
您应该在执行任何操作之前先分配 root
节点,然后更改函数,使其修改 TNode
而不是指向该节点的指针。
如果您之前的作业成功了,您所要做的就是更改打印功能,在探索左侧节点之前探索右侧节点。
void print_inOrder(Tnode *current_tnode)
{
if (current_tnode)
{
print_inOrder(current_tnode->right);
printf("%s\n",current_tnode->strValue);
print_inOrder(current_tnode->left);
}
}