递归函数使用引用传递的问题

来源:互联网 发布:mac合盖播放 编辑:程序博客网 时间:2024/05/19 03:17

对于算法:
使用递归方法,删除无头结点单链表中所有值为x的结点。
考虑下面程序:

void Del_X_3(LinkList &L,ElemType x)  {      LNode *p;      if(L==NULL)          return ;      if(L->data==x)      {          p=L;          L=L->next;  //问题出在这里        free(p);          Del_X_3(L,x);    }else       {          Del_X_3(L->next,x);    }  }  

思考该程序发现,会有疑问:
删除结点p时没有更改p前结点的指针,是否会造成链表短链呢?答案是不会。


[分析]

为了简化,思考链表中某三个结点:1,3,5。现欲删除链表中所有3。
这里写图片描述
第一次递归:
L指向1结点,递归调用Del_X_3(L->next,x);
注意这里,L->next是什么?
相当于这个Node*类型的指针L所指向的结点的next域里面的指针,其存储的值为下一个结点的地址。也就是(*L).next;
第二次递归:
现在进入递归的L实际上是(*L).next;
注意:当代码执行到L=L->next;这里问题出现了。
这句话其实相当于(*L).next = (*L).next->next;也就是1指向了5!


注意引用传递

函数void Del_X_3(LinkList &L,ElemType x)
LinkList使用引用传递,这是有原因的。
注意这里的每一个L都是一个指针,其值都来自于链表结点的next域。
那么我们现在要更改链表,就必然要使用指针的引用。
因为这里我们要更改的是指针本身!而不再是指针所指的对象。

阅读全文
0 0
原创粉丝点击