询问一道关于指针的题

jackcost 2009-08-06 03:11:33
写出程序把一个链表中的接点顺序倒排
typedef struct linknode
{
int data;
struct linknode *next;
} node;
//将一个链表逆置
node *reverse(node *head)
{
node *p,*q,*r;
p=head;
q=p->next;
while(q!=NULL)
{
r=q->next;
q->next=p;
p=q;
q=r;
}

head->next=NULL;
head=p;
return head;
}

这是网上见到的一种将单项链表转向的做法,但是个人感觉这种方法有点问题,问题就出现在最后两句中

head=p;
return head;
因为 head 是形参,c 关于形参传递时,是值传递,所以对于head 修改只是对于其拷贝进行修改,无法对其原值进行修改,所以在返回后,head 就是原值并没有修改,修改方法是不是将形参改为指针的指针更好,例如
node *reverse(node **head);
这种方式应该就会好把, 本人不敢确定,希望高手能指点一二,谢谢,本人菜鸟。
...全文
84 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
飞天御剑流 2009-08-07
  • 打赏
  • 举报
回复
因为 head 是形参,c 关于形参传递时,是值传递,所以对于head 修改只是对于其拷贝进行修改,无法对其原值进行修改,所以在返回后,head 就是原值并没有修改,修改方法是不是将形参改为指针的指针更好,例如
node *reverse(node **head);
这种方式应该就会好把, 本人不敢确定,希望高手能指点一二,谢谢,本人菜鸟。
---------------------------------------------------------------
函数返回的是head的新值,原值是多少无关紧要了,只要把新值赋予调用函数的head就行了,如这样:

.......
head = reverse( head );

调用函数就指向新头了。

当然这问题想用二重指针也一样可以,只不过是程序的逻辑如何编排的问题。
pmerOFc 2009-08-07
  • 打赏
  • 举报
回复
[Quote=引用楼主 jackcost 的回复:]
  head=p;
  return head;
因为 head 是形参,c 关于形参传递时,是值传递,所以对于head 修改只是对于其拷贝进行修改,无法对其原值进行修改,所以在返回后,head 就是原值并没有修改,修改方法是不是将形参改为指针的指针更好,例如
node *reverse(node **head);
这种方式应该就会好把, 本人不敢确定,希望高手能指点一二,谢谢,本人菜鸟。
[/Quote]

你说的也不是完全没有道理
node *reverse(node *head)
这种形式可以通过赋值改变你所说的head的原值
h = reverse ( h ) ;

node *reverse(node **head);这个也不是不可以
但返回一个node *是一点也没有必要的
应该
void reverse(node **head);


yinchengjia 2009-08-07
  • 打赏
  • 举报
回复
int fun()
{
int i;
i=10;
return i;
}

你说这个i值能传出来吧
jackcost 2009-08-07
  • 打赏
  • 举报
回复
晕,一样么?? 我感觉不对呢,那个值能传出来么???
raley29 2009-08-06
  • 打赏
  • 举报
回复
这个写法没有问题。返回的指针就是你的转化结果。

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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