C/C++单链表删除元素问题

来源:百度知道 编辑:UC知道 时间:2024/06/25 20:02:48
采用递归算法删除不带头结点的单链表 h 中第一个值为 x 的结点,代码如下:
int s_delnode( LinkList *&h, ElemType x )
{
LinkList *p;
if ( h == NULL )
{
return 0;
}
if ( h->data == x )
{
p = h;
h = h->next;
free( p );
return 1;
}
else
{
s_delnode( h->next, x );
return 1;
}
}
我就纳闷了,当 h->data == x 成立时,要删除 h 指向的结点:
p = h;
h = h->next;
free( p );
这 3 条语句过后,原来 h 之前的结点的 next 难道能自己指向了原来 h->next ??意思就是既然要删除 *h ,那就得让它前面的结点指向它后面的结点,但是怎么看不到这样的语句呢。(上面的代码运行结果正确)

同学,你要搞清楚,我打个比方

h前面那个结点假如是 y

那么,y->next=h对吧

当这个函数运行到y那个结点时,调用函数s_delnode( y->next, x );

这里局部变量h就等y->next对吧,然后你再看看你这个函数的定义 int s_delnode( LinkList *&h, ElemType x ) 这里面用的可是“&”引用符号啊,引用符号是啥意思?就是说如果在这个函数里你改变了h的值,就相当于也改变了传进去的y->next的值,h=h->next就等于是在说y->next=y->next->next,所以就是h前面的结点指向h后面的结点了

当然。。如果你不信的话,你可以把int s_delnode( LinkList *&h, ElemType x ) 这个函数定义,改成int s_delnode( LinkList *h, ElemType x ) 再试试,这样肯定不对了,因为少了“&”的符号,如果还是不懂,建议你去查查“&”运算符的作用