社区
数据结构与算法
帖子详情
为什么不能的返回呢?
chinayaolin
2003-10-09 05:35:35
/* 下面的程序中为什么不能返回 */
void pre(node *p) /*本程序的作用是建一颗无序二叉树*/
{ char s;
scanf("%c",&s);
if(s=='k') return; /*返回主程序*/
else
{ if(s==' ') p=NULL;
else
{ p=(node *)malloc(sizeof(node));
p->data=s;
}
pre(p->left);
pre(p->right);
}
}
...全文
52
4
打赏
收藏
为什么不能的返回呢?
/* 下面的程序中为什么不能返回 */ void pre(node *p) /*本程序的作用是建一颗无序二叉树*/ { char s; scanf("%c",&s); if(s=='k') return; /*返回主程序*/ else { if(s==' ') p=NULL; else { p=(node *)malloc(sizeof(node)); p->data=s; } pre(p->left); pre(p->right); } }
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
4 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
短歌如风
2003-10-10
打赏
举报
回复
事实上,使用“变参”的返回结果的方法是不应该大量使用的,只应该在需要返回多个结果时才需要(在C++ STL中是通过返回pair的方法来解决的)。上面的C代码完全可以改为:
node * pre(node * s) /*本程序的作用是建一颗无序二叉树*/
{
node* p;
char s;
scanf("%c",&s);
if (s == 'k')
p = s;
else if (s == ' ')
p = NULL;
else
{
p=(node *)malloc(sizeof(node));
p->data=s;
p->left = pre(NULL);
p->right = pre(NULL);
}
return p;
}
调用时把pre(p)改为p=pre(p);
修改的过程又发现原代码中的一个问题:当p = (node*)malloc(sizeof(node))之后没有为p->left和p->right赋初值,用它调用pre(p->left)时如果遇到输入k则不会改变它们的值,这样就出现了“未初始化的指针”。在这段代码中已经没有这个问题。
短歌如风
2003-10-10
打赏
举报
回复
变参就是可能通过对参数赋值等操作修改实参变量的值。C中不支持这种参数,只能通过指针来实现。你要在函数中改变调用者的局部变量,就要由调用者把变量的指针传进来。
指针的指针是一个指针,它指向的内容是一个指针。通过它可以修改一个指针类型的变量。
上面的代码有错误,少了两个左括号,并且原代码就有错误,在p=NULL后不应该再访问p->left和p->right:
void pre(node **p) /*本程序的作用是建一颗无序二叉树*/
{ char s;
scanf("%c",&s);
if(s=='k') return; /*返回主程序*/
else
{ if(s==' ') p=NULL;
else
{ *p=(node *)malloc(sizeof(node));
(*p)->data=s;
pre(&((*p)->left));
pre(&((*p)->right));
}
}
}
再Pascal这种天生支持变参的语言中是这样的:
procedure pre(var p: PNode) //用“引用类型”参数实现变参
var
s: Char;
begin
Read(s);
if s !='k' then
begin
if s = ' ' then
p := nil
else
begin
New(p);
p^.data := s;
pre(p^.left);
pre(p^.right);
end
end
end;
看上去比在C中用指针修改变量的方法清晰多了。
如果这段程序用C++写就可以用“引用类型”来实现“变参”,比C方法自然多了:
void pre(node * & p) /*本程序的作用是建一颗无序二叉树*/
{ char s;
scanf("%c",&s);
if(s=='k') return; /*返回主程序*/
else
{ if(s==' ') p=NULL;
else
{ p=(node *)malloc(sizeof(node));
p->data=s;
pre(p->left);
pre(p->right);
}
}
}
chinayaolin
2003-10-10
打赏
举报
回复
指针变参是什么意思?使用指针的指针有什么意思?
短歌如风
2003-10-09
打赏
举报
回复
你要返回一个指针类型,需要一个“指针变参”,而C不支持变参,应该使用“指针的指针”。
void pre(node **p) /*本程序的作用是建一颗无序二叉树*/
{ char s;
scanf("%c",&s);
if(s=='k') return; /*返回主程序*/
else
{ if(s==' ') p=NULL;
else
{ *p=(node *)malloc(sizeof(node));
(*p)->data=s;
}
pre(&(*p)->left));
pre(&(*p)->right));
}
}
行业分析模板--初学者必备gl.ppt
行业分析模板--初学者必备gl.ppt
基于微信小程序端的视频社交软件 + 后台管理系统(仿抖音).zip
简介随着微信的普及,小视频的流行,我们设计一款基于微信小程序端的视频社交软件 + 后台管理系统作为自己专科毕业设计----秀视频-微信小程序端(短视频社交小程序,用户可以在小程序上发布自己的短视频 并且经过我们的平台加入滤镜或者背景音乐制作出独具特色的短视频。并实现了点赞、评论、下载、分享、转发等功能的小程序)---的后台管理系统,主要实现了人员的管理,短视频的管理,背景音乐的管理,登陆注册,权限验证,单点登陆等等。 从需求分析,功能设计,前端到后台,再到数据库的设计。一点点的积累,一点点的完善,预计小程序端+后台管理系统开发周期一个月(每天更新)。 对一个开发人员来说,如果想单纯的做出这些功能,其实并不难。 难的是对于这些功能细节的把控,项目整体的友好程度,用户的体验效果;对并发的考虑,对恶意请求,对流畅度这些细节的考虑等等。
基于matlab实现麦克风阵列的声源定位,四元十字阵的matlab仿真.rar
基于matlab实现麦克风阵列的声源定位,四元十字阵的matlab仿真.rar
某钢厂钢铁废水处理图纸.zip
污水处理
基于yoloV4,检测茶叶中的杂质,并利用混淆矩阵计算识别率
混淆矩阵 检测茶叶中的杂质,并利用混淆矩阵计算出精确率和误判率 小技巧的设置 在train.py和train_eager.py文件下: 1、mosaic参数可用于控制是否实现Mosaic数据增强。 2、Cosine_scheduler可用于控制是否使用学习率余弦退火衰减。 3、label_smoothing可用于控制是否Label Smoothing平滑。
数据结构与算法
33,009
社区成员
35,326
社区内容
发帖
与我相关
我的任务
数据结构与算法
数据结构与算法相关内容讨论专区
复制链接
扫一扫
分享
社区描述
数据结构与算法相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章