## 页首HTML代码 ```html

C练习--补充或纠错代码

数据结构

回顾--树

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 的最后一个位置加上空字符
posted @ 2024-05-09 21:23  一面小镜子  阅读(43)  评论(0)    收藏  举报