为什么不能的返回呢?

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 打赏 收藏 转发到动态 举报
写回复
用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));
}
}

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧