C语言 求把一个递归函数 改成一个普通的函数 需要用到while loop
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言 求把一个递归函数 改成一个普通的函数 需要用到while loop相关的知识,希望对你有一定的参考价值。
#include <stdio.h>
#include <stdlib.h>
typedef struct node int num ; struct node *next ; NODE ;
void printlist( NODE * l )
if ( l == NULL ) return ;
printlist( l -> next ) ;
printf( " %d ", l -> num ) ;
return ;
int main( int argc, char *argv[] )
NODE *p ;
NODE *temp ;
int n ;
int i ;
int num ;
printf( "\nHow many numbers do you want to enter? " ) ;
scanf( "%d", &n ) ;
p = NULL ;
for ( i = 1 ; i <= n ; i++ )
temp = ( NODE * ) malloc( sizeof( NODE ) ) ;
printf("\nPlease enter a number: ") ;
scanf( "%d", &num ) ;
temp -> num = num ;
temp -> next = p ;
p = temp ;
printf("\n\n") ;
printlist( p ) ;
return 0 ;
void printlist( NODE * l )
while(l!=NULL)
printf( " %d ", l -> num ) ;
l = l->next;
return ;
但是,由于你链表的创建是向链表头插入新元素,所以,当你输入1 2 3时,你创建的链表数据的顺序就是3 2 1(3是链表头的数据)。所以把递归改成循环后,打印的内容就是321了。
没改之前,因为是递归算法,只保证你输入的内容和打印的内容的顺序是一样的,但是这个时候是按照链表的逆序打印的。追问
如何才能实现 顺序 打印呢?
追答因为链表只能向后指,所以如果用while的话,打印的顺序肯定和链表的顺序是一样的。
所以解决方法有3个
1 创建链表的时候采用尾部插入,这样的话,输入的顺序跟链表的顺序是一样的,自然用while打印时,输入和打印的顺序就一样的
2 再或者,就像推荐答案那样,把数据按照链表的顺序保存起来,再倒着打印出来,这样输入的顺序就和打印的顺序一样了
3 就是你的程序不变,采用递归的方法,打印出来的自然就是链表逆序。把printlist( l -> next ) ;放到printf( " %d ", l -> num ) ;后面就是链表顺序打印。
个人觉得如果链表创建方法不变得情况下,第3中方法最好,第2中方法只能算是投机取巧的方法,为了实现而实现。
void printlist( NODE * l )
int k = 0, stack[256];
while(l)
stack[k++] = l->num;
l = l->next;
while(k)
printf(" %d ", stack[--k]);
以上是关于C语言 求把一个递归函数 改成一个普通的函数 需要用到while loop的主要内容,如果未能解决你的问题,请参考以下文章