数据结构
回顾--树
1.阅读以下说明和C代码,直接把答案填入空格中。
本函数的功能是删除二叉查找树中的一个结点
将要删除的结点可能有以下三种情况。
情况①是删除叶子结点。
情况②是删除只有1个子结点的结点。
情况③是删除有左右子树的结点。
int DeleteNode(Bitree *r, int e){
Bitree p = *r, pp, s, c;
while( ① ) /* 从树根结点出发查找键值为e的结点 */
{
pp = p;
if(e < p->data) p = p->Lchild;
else p = p->Rchild;
}
if(!p) return -1; /* 查找失败 */
if(p->Lchild && p->Rchild) /* 处理情况③ */
{
s = ;
pp = p;
while( ② )
{
p->data = s->data;
}
p = s;
}
/* 处理情况①、② */
if( ③ ) c = p->Lchild;
else c = p->Rchild;
if(p == *r) *r = c;
else if( ④ ) pp->Lchild = c;
else pp->Rchild = c;
free(p);
return 0;
}
①:if(p && p->data != e) /* 从树根结点出发查找键值为e的结点 */
②:if(!s->Lchild) /* 找到待删除结点的后继结点 */
③:!pp
④:e < pp->data
2.请找出下面代码中的所有错误说明:以下代码是把一个字符串倒序,如”abcd”倒序后变为
“dcba”
#include “string.h”
int main()
{
char *src = “hello, world”;
char *dest = NULL;
int len = strlen(src);
dest = (char *)malloc(len);
char * d = dest;
char * s = src[len];
while(len-- != 0)
d++ = s--;
printf(“%s”, dest);
return 0;
}
//找出的错误有以下几个
1.第7行分配内存时,应该为 dest = (char *)malloc(len + 1);,需要考虑字符串末尾的空字符 '\0'。
2.第9行中,src[len] 会导致访问越界,应该修改为 char * s = src + len - 1;,指向字符串末尾的前一个字符。
3.第11行中,d++ = s--; 应该修改为 *d++ = *s--;,以逐个复制字符。
4.在使用 printf 输出 dest 时,需要确保 dest 所指向的内存已经被初始化,并以空字符 '\0' 结尾。因此,需要在循环结束后在 dest 的最后一个位置加上空字符
标签:结点,--,练习,pp,len,char,dest,纠错
From: https://www.cnblogs.com/little-mirror/p/18183108