1. 程式人生 > >遞迴程式設計方法練習--遞迴輸出單鏈表 (10 分)

遞迴程式設計方法練習--遞迴輸出單鏈表 (10 分)

本題要求用遞迴方法編寫遞迴函式實現無頭結點單鏈表的輸出操作函式。L是一個不帶頭結點的單鏈表,函式void ListPrint_L_Rec(LinkList L)要求用遞迴的方法輸出無頭結點之單鏈表中各個元素的值,每個元素的前面都有一個空格(包括首元素)。遞迴思想可借鑑下述程式碼中連結串列建立的遞迴函式。

函式介面定義:

void ListPrint_L_Rec(LinkList L);

其中 L 是一個不帶頭結點的單鏈表。

裁判測試程式樣例:

//庫函式標頭檔案包含
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>

//函式狀態碼定義
#define TRUE        1
#define FALSE       0
#define OK          1
#define ERROR       0
#define INFEASIBLE -1
#define OVERFLOW   -2

typedef int  Status;
typedef int  ElemType; //假設線性表中的元素均為整型

typedef struct LNode
{
    ElemType data;
    struct LNode *next;
}LNode,*LinkList;

Status ListCreate_L_Rec(LinkList &L,int n)
{
//遞迴邊界:建立空表時只需將L賦空即可;
//遞迴關係:建立非空表時,將連結串列看做兩部分:首元素組成的子表La, 第二個元素及其後元素構成的子表Lb。
//子表La容易建立(只需開闢一個節點)
//子表Lb由於規模小可以遞迴建立完成(類似數學歸納法的假設,只要小的都可以建設能完成)
//最後將兩個子表拼接即可。
  LNode *La, *Lb;
  if(n==0) L=NULL;
  else{
    La=(LNode *)malloc(sizeof(LNode));  //開闢子表La
    if(!La) exit(OVERFLOW);
    scanf("%d",&La->data);
    ListCreate_L_Rec(Lb,n-1 ); //遞迴建立子表Lb
    La->next = Lb;  //兩個子表拼結
    L=La;  //第一個子表的地址賦給L。請思考為什這樣處理不會使得主函式中的L取錯值?
  }
  return OK;
}
void ListPrint_L_Rec(LinkList L);

int main()
{
    LinkList L;
    int n;
    scanf("%d",&n);
    if(ListCreate_L_Rec(L,n)!= OK) {
          printf("表建立失敗!!!\n");
          return -1;
    }
    ListPrint_L_Rec (L);
    return 0;
}
/* 請在這裡填寫答案 */

輸入格式

第一行輸入一個整數n,表示單鏈表中元素個數,接下來一行共n個整數,中間用空格隔開。

輸出格式

遞迴輸出連結串列的各個元素,每個元素前都有一個用空格,首元素元素前面也有空格。

輸入樣例:

4
1 2 3 4

輸出樣例:

1 2 3 4
void ListPrint_L_Rec(LinkList L)
{
    if(L->next==NULL)printf(" %d",L->data);
    else {
        printf(" %d",L->data);
        ListPrint_L_Rec(L->next);
    }
}