1. 程式人生 > >連結串列的遞迴建立與輸出

連結串列的遞迴建立與輸出


本題中建立連結串列的結點數為5,接下來我們先扣一下遞迴是什麼:

連結串列的遞迴實則是使用每呼叫一次函式就會出現一個形參,當函式使用結束後形參會自動釋放這一特點

在本題中,將h指標最初指在NULL即連結串列尾部,每次使用函式Creatlink建立一個結點

把陣列的值賦給這個結點,然後判定陣列的值是否完全進入連結串列中,判定條件為陣列長度是否變為0

當長度為0時,從最後一次被呼叫的函式開始逐層返回

例如當最後一次呼叫(第五次呼叫時),一個形參指標指在了NULL上,此時應該執行 # return h #這條語句,語句中的h是第四次呼叫時產生的形參h.

此處做特殊解釋,因為第五次產生的h是在第四次呼叫該函式產生的,所以返回值應給是返回第四次呼叫的函式裡,這裡用Creatlink4來表示

作圖來分析一下     
(**此處申明:Creatlink=Creatlink0=Creatlink1=Creatlink2=Creatlink3=Creatlink4=Creatlink5**)
 Creatlink(int a[],int n)
 {
    Creatlink0 —— h
    {
                Creatlink1 —— h
    }
                {     
                           Creatlink2 —— h  
                }
                           {    
                                      Creatlink3 —— h
                           }          
                                      {        
                                                 Creatlink4 —— h 
                                        }    
                                                 {
                                                             Creatlink5 —— h
                                                 }
 }

接下來實現的是掛鏈環節,從第五次呼叫的形參依次給出函式的返回值

因為第五次是n==0成立,在第四次呼叫時,此時產生的第五個h=NULL,且沒有執行Creatlink5中的h->next=Creatlink(a+1,n-1)這條語句所以直接返回到上一級;

而此時在Creatlink4中的接到來自Creatlink5的返回值,將第五個h的地址賦給第四個h->next,之後依次向前推即可

#include <stdio.h>
#include <stdlib.h>

typedef struct node{
	int data;
	struct node *next;
}ElemSN;


ElemSN *Creatlink(int a[],int n)
{
	ElemSN *h;
	h=NULL;
	if(n)
	{
		h=(ElemSN *)malloc(sizeof(ElemSN));
		h->data=a[0];  //每一次陣列首指標後移一位,陣列長度減少一位,都是新陣列的首地址
		h->next=Creatlink(a+1,n-1);
	}
	return h;
}

void Printlink(ElemSN *h)
{
	if(h)
	{
		printf("%5d",h->data);
		Printlink(h->next);
	}
}

void main(void)
{
	ElemSN *head;
	int a[5]={4,7,8,6,2};
	head=Creatlink(a,5);
	printf("\t\t連結串列為:");
	Printlink(head);
	printf("\n");
}