社区
数据结构与算法
帖子详情
为什么不能的返回呢?
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);
}
}
...全文
51
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));
}
}
多图表实现员工满意度调查数据分析python
员工满意度是指员工对于工作环境、待遇、职业发展和组织管理等方面的满意程度。它是衡量员工对工作的整体感受和情绪状态的重要指标。
2020届软件工程本科毕业生毕业设计项目.zip
2020届软件工程本科毕业生毕业设计项目
基于stm32平衡小车
平衡小车 基于stm32 平衡小车 基于stm32 平衡小车 基于stm32
c语言火车票订票管理源码.rar
c语言火车票订票管理源码.rar
施耐德PLC例程源码四台水泵的轮换
施耐德PLC例程源码四台水泵的轮换提取方式是百度网盘分享地址
数据结构与算法
33,008
社区成员
35,326
社区内容
发帖
与我相关
我的任务
数据结构与算法
数据结构与算法相关内容讨论专区
复制链接
扫一扫
分享
社区描述
数据结构与算法相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章