对于初学者来说,功能不正确。当节点数不均匀时,它可以调用未定义的行为。因为在这个表达式中
start->next->next
子表达式
start->next
可以已经等于NULL。
函数可以通过以下方式定义
void fun( const struct node *start )
{
if ( start )
{
printf( "%d ",start->data );
if ( start->next && start->next->next )
{
fun( start->next->next );
}
printf( "%d ",start->data );
}
}
或者如下方式
void fun( const struct node *start )
{
if ( start )
{
printf( "%d ",start->data );
if ( start->next )
{
fun( start->next->next );
}
printf( "%d ",start->data );
}
}
如果注释 if 语句然后函数两次调用函数printf 为同一个节点
void fun( const struct node *start )
{
if ( start )
{
printf( "%d ",start->data );
/*
if ( start->next && start->next->next )
{
fun(start->next->next);
}
*/
printf( "%d ",start->data );
}
}
所以在第一次调用时它会输出
1 1
但是如果要取消注释 if 语句,那么在printf 的第一次和第二次调用之间,函数会使用指向下一个->下一个节点的指针调用自身。
所以你可以写
1 3 3 1
等等
1 3 5 5 3 1
^
|
在值为5 的节点之后,指向next-next 节点的指针等于NULL。所以在这两个 printf 调用之间
printf( "%d ",start->data );
//...
printf( "%d ",start->data );
函数内start->data等于5时不会输出任何内容。