C 删除指针后打印指针会在括号之间打印null
我编写了一段代码,递归地查找树中最小的字符串并将其删除。但是,删除节点后打印树将返回nullC 删除指针后打印指针会在括号之间打印null,c,pointers,recursion,binary-search-tree,C,Pointers,Recursion,Binary Search Tree,我编写了一段代码,递归地查找树中最小的字符串并将其删除。但是,删除节点后打印树将返回null static char* findMinimum(TreeNodePtr treePtr){ if(treePtr->left == NULL){ printf("Minimum node is %s\n", treePtr->item); char * temp = treePtr->item; (treePtr)->item = NULL;
static char* findMinimum(TreeNodePtr treePtr){
if(treePtr->left == NULL){
printf("Minimum node is %s\n", treePtr->item);
char * temp = treePtr->item;
(treePtr)->item = NULL;
return(temp);
}
else{
findMinimum(treePtr->left);
}
}
我认为这个函数可以工作,因为它删除最小值,即使使用不同的字符串。我应该写一个条件来确保空指针不会被打印吗?为了以防万一,这里还有打印功能:
static void printTree(TreeNodePtr treePtr) {
if (treePtr != NULL) {
level++;
printTree(treePtr->left);
printf(">%*s%s\n", level*5, "", treePtr->item);
printTree(treePtr->right);
level--;
}
}
您正在删除最小的节点,而不更改其父节点的子节点。如果删除节点,还应将其父节点更改为指向NULL。请注意,将treePtr->item设置为NULL并不能实现这一点,因为treePtr->left指向一个TreeNodePtr,而不是它的item成员。此函数
static char* findMinimum(TreeNodePtr treePtr){
if(treePtr->left == NULL){
printf("Minimum node is %s\n", treePtr->item);
char * temp = treePtr->item;
(treePtr)->item = NULL;
free(treePtr->item);
return(temp);
}
else{
findMinimum(treePtr->left);
}
}
没有道理
对于初学者来说,这部分或代码
else{
findMinimum(treePtr->left);
}
不返回任何内容。因此,函数已经具有未定义的行为
也可以考虑这些语句
(treePtr)->item = NULL;
free(treePtr->item);
自由的召唤毫无作用
否则,当函数返回指向已删除字符串的指针时,将交换语句。同样,program将具有未定义的行为
此外,当最小字符串已被删除时,第二次调用该函数时,该函数的行为也不清楚
您必须动态创建函数返回的最小字符串的副本
我建议在不进行测试的情况下实现以下功能
static char * findMinimum( TreeNodePtr treePtr )
{
if ( treePtr == NULL || treePtr->item == NULL ) return NULL;
if ( treePtr->left == NULL || treePtr->left->item == NULL )
{
char *s = malloc( strlen( treePtr->item ) + 1 );
strcpy( s, treePtr->item );
free( treePtr->item );
treePtr->item = NULL;
return s;
}
else
{
return findMinimum( treePtr->left );
}
}
我发现findMinimum函数中存在两个问题: 1如果在findMinimum中出现其他情况,您会返回什么?我猜您忘记添加退货: 静态字符*findMinimumTreeNodePtr{ iftreePtr->left==NULL{ printfMinimum节点是%s\n,treePtr->item; char*temp=treePtr->item; treePtr->item=NULL; freetreePtr->item; 返回温度; } 否则{ return findMinimumtreePtr->left;//添加了return } } 你的树是二叉搜索树吗?考虑在这种情况下发生的事情:
root-node
/ \
smallest largest
\
not-smallest
您应该重新定义不是最小的节点,而是最小的节点
3.你为什么免费上网
treePtr->item=NULL;
freetreePtr->item;
这样调用函数不是实现递归所必需的吗?到目前为止,我还不知道其他的方法。关于第二部分,我会解决的。编辑:刚刚意识到你的意思,whoops@Impasse正如我所写的,函数具有未定义的行为。如果第一个节点不包含最小字符串,那么控件将传递给下一个左节点,函数将不返回任何内容。2我想是的,你说的rehang是什么意思?3这毫无意义,我编辑了原始帖子。@僵局2,最小的节点不应该是root的左子节点-node@user3365922不,他是对的。“非最小”与“最小”字符串没有任何共同之处。@VladFrommosco您应该删除最小的节点,树在这种情况下会是什么样子?@user3365922他没有删除整个节点。他正在删除存储在节点中的字符串本身。假设父节点之一没有左子节点,您的代码应该删除父节点,那么如果存在右子节点呢?你是怎么处理的?另外,我猜项目必须是一个字符串,那么将其分配给NULL将做什么呢?