/********************************************************************
created:    2005/12/22
created:    22:12:2005   14:06
filename:     ReservePrint.c
author:        Liu Qi

  purpose:    链表的逆序输出
********************************************************************
*/


#include 
<stdio.h>
#include 
<assert.h>
#include 
<time.h>
#include 
"../sllist.h"

#define MAX_NUM 10



/*===========================================================================
**    Function name:        GetRandList
**    Parameter:            void
**    Precondition:        void
**    Description:        构造一个由随机数组成的链表
**    Return value:        链表的头节点指针
**    Author:                Liu Qi, 2005/12/18
===========================================================================
*/


List GetRandList(
void)
{
    
int i;
    
    List L 
= SLL_Create();
    
    srand( (unsigned)time( NULL ) ); 
    
for ( i = 0; i < MAX_NUM; i++)
    
{
        SLL_PushFront(rand() 
% 20, L);
    }

    
    
return L;
}




/*===========================================================================
* Function name:    ReservePrint
* Parameter:        L: 链表头指针
* Precondition:        NULL != L
* Description:        递归实现链表的逆序输出    
* Return value:        void
* Author:            Liu Qi,  [12/22/2005]
===========================================================================
*/

void ReservePrint(List L)
{
    assert( NULL 
!= L );
    
    
if (NULL != L->Next)
    
{
        ReservePrint(L
->Next);
    }

    
else
    
{
        
//递归出口,一般把递归出口写作前面^_^
    }

    
    printf(
" %d ", L->Element);
}





int main(int argc, char *argv[])
{
    List L 
= GetRandList();
    SLL_PrintList(L);
    
    printf(
"\n");
    
    ReservePrint(L
->Next);
    
    printf(
"\n");
    
    SLL_DeleteList(L);
    
    
return 0;
}


递归是个好东西啊,搞明白了觉得逻辑很清晰,结构也很好,就是效率不高^_^,用栈来模拟递归看起来就不好懂了。