連結串列的遞迴建立與輸出
阿新 • • 發佈:2019-02-01
本題中建立連結串列的結點數為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"); }