遞迴實現連結串列的一些操作
遞迴作為一種重要的演算法思想,在連結串列中也有特別大的作用,特別是逆序輸出時,程式碼更加簡單。
以一個題為例:
設head指向一個非空單向連結串列:
1.輸出連結串列所有結點的值
2.逆向輸出所有結點的值
3.返回連結串列所有結點的和
4.返回連結串列奇數的個數
5.返回資料為key的結點地址,若未找到,返回NULL
首先,我們需要用遞迴建立一個連結串列。
ElemSN *CreatLink(int a[] , int n)
{
ElemSN *h;
if(n == 0)
return NULL;
else
{
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("%d ",h -> data);
PrintLink(h -> next);
}
}
/*逆向輸出*/
void PrintLink(ElemSN *h)
{
if(h)
{
PrintLink(h -> next);
printf("%d ",h -> data);
}
}
/*求和*/
int AddLink(ElemSN *h)
{
int sum = 0;
if(h)
sum = h -> data + AddLink(h -> next);
return sum;
}
/*求和*/
int AddLink(ElemSN *h)
{
int sum = 0;
if(h)
sum = h -> data + AddLink(h -> next);
return sum;
}
/*返回奇數結點個數*/
int Oddvalue(ElemSN *head)
{
int cnt;
if(!head)
{
return 0;
}
else
{
cnt = Oddvalue(head -> next);
return cnt + head -> data % 2;
}
}
/*返回key的地址*/
ElemSN *FindKey(ElemSN *h,int key)
{
if(h)
{
if(h -> data - key)
FindKey(h -> next , key);
else return h;
}
return NULL;
}