單向鏈表基本操作的遞歸實現(xiàn)
/*最大值*/
int max_list(List *head)
{
int max = 0;
int temp;
if(NULL == head)
{
printf("Error: NULL pointer...");
}本文引用地址:http://www.ex-cimer.com/article/201612/324524.htm
if(NULL != head && head->next == NULL)
{
return head->val;
}
else
{
temp = max_list(head->next);
max = (head->val > temp ? head->val : temp);
return max;
}
}
/*最小值*/
int min_list(List *head)
{
int min = 0;
int temp;
if(NULL == head)
{
printf("Error: NULL pointer...");
}
if(NULL != head && head->next == NULL)
{
returnhead->val;
}
else
{
temp = min_list(head->next);
min = (head->val < temp ? head->val : temp);
return min;
}
}
/*創(chuàng)建鏈表*/
List* create_list(int val)
{
List *head = (List *)malloc(sizeof(List)/sizeof(char));
if(NULL == head)
{
return NULL;
}
head->val = val;
head->next= NULL;
return head;
}
/*插入節(jié)點*/
List* insert_listnode(List *head, int val)
{
List *temp;
if(NULL == head)
{
return NULL;
}
temp = (List *)malloc(sizeof(List)/sizeof(char));
temp->val = val;
temp->next = head;
head = temp;
returnhead;
}
/*刪除鏈表*/
void delete_list(List *head)
{
List *temp = NULL;
if(head != NULL)
{
temp = head;
head = head->next;
free(temp);
temp = NULL;
delete_list(head);
}
}
int main()
{
int n = 0;
int i = 0;
List *head= create_list(10);
for(i = 0; i < 10; ++ i)
{
n = 1 + (int)(10.0*rand()/(RAND_MAX + 1.0));
head = insert_listnode(head, n);
}
fdprint_listnode(head);
printf("");
bkprint_listnode(head);
printf("%d", count_listnode(head));
printf("");
#if 10
head = delete_node(head, 10);
fdprint_listnode(head);
printf("");
bkprint_listnode(head);
printf("");
#endif
#if 10
head = delete_allnode(head, 10);
fdprint_listnode(head);
printf("");
bkprint_listnode(head);
#endif
printf("max = %d",max_list(head));
printf("max = %d",min_list(head));
delete_list(head);
head = NULL;
if(head== NULL)
{
printf("ERROR:null pointer!...");
}
return 0;
}
遞歸中需要注意的思想我任務就是為了解決當前的問題,我完成最簡單的一部操作,其他的由別人去完成,比如漢諾塔中的第一個和尚讓第二個和尚把前63個金盤放在B處,而他自己只需要完成從A到C的搬運,實質上他自己完成的只有一部最簡答的,但是搬運這種動作有存在非常大的相似性。
因此為了解決當前的問題f(n),就需要解決問題f(n-1),而f(n-1)的解決就需要解決f(n-2),這樣逐層的分解,分解成很多相似的小事件,當最小的事件解決完成以后,就能解決高層次的事件,這種逐層分解,逐層合并的方式就構成了遞歸的思想,最主要的要找到遞歸的出口和遞歸的方式,搞清楚了這兩個,實現(xiàn)一個遞歸問題相對來說就比較簡單啦。
但是遞歸也存在問題,特別是深層次的遞歸可能導致??臻g的溢出,因為堆??臻g的大小并不是無限大的,特別當遞歸中數據量特別大的情況下,遞歸很有可能導致棧空間的溢出,因此遞歸并不是萬能的,但是遞歸確實是一種思考問題的方式,一種反向思考的形式,從結果到具體的小過程。當然具體的問題就要具體分析啦。
用一句簡單的話記住遞歸就是:我完成最簡單的那一步,其他的復雜的相似問題都找別人去做吧。
評論