新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 單向鏈表基本操作的遞歸實(shí)現(xiàn)

        單向鏈表基本操作的遞歸實(shí)現(xiàn)

        作者: 時(shí)間:2016-12-01 來源:網(wǎng)絡(luò) 收藏

        /*最大值*/
        int max_list(List *head)
        {
        int max = 0;
        int temp;
        if(NULL == head)
        {
        printf("Error: NULL pointer...");
        }

        本文引用地址:http://www.104case.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é)點(diǎn)*/
        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;
        }

        遞歸中需要注意的思想我任務(wù)就是為了解決當(dāng)前的問題,我完成最簡單的一部操作,其他的由別人去完成,比如漢諾塔中的第一個(gè)和尚讓第二個(gè)和尚把前63個(gè)金盤放在B處,而他自己只需要完成從A到C的搬運(yùn),實(shí)質(zhì)上他自己完成的只有一部最簡答的,但是搬運(yùn)這種動(dòng)作有存在非常大的相似性。

        因此為了解決當(dāng)前的問題f(n),就需要解決問題f(n-1),而f(n-1)的解決就需要解決f(n-2),這樣逐層的分解,分解成很多相似的小事件,當(dāng)最小的事件解決完成以后,就能解決高層次的事件,這種逐層分解,逐層合并的方式就構(gòu)成了遞歸的思想,最主要的要找到遞歸的出口和遞歸的方式,搞清楚了這兩個(gè),實(shí)現(xiàn)一個(gè)遞歸問題相對來說就比較簡單啦。

        但是遞歸也存在問題,特別是深層次的遞歸可能導(dǎo)致棧空間的溢出,因?yàn)槎褩?臻g的大小并不是無限大的,特別當(dāng)遞歸中數(shù)據(jù)量特別大的情況下,遞歸很有可能導(dǎo)致棧空間的溢出,因此遞歸并不是萬能的,但是遞歸確實(shí)是一種思考問題的方式,一種反向思考的形式,從結(jié)果到具體的小過程。當(dāng)然具體的問題就要具體分析啦。

        用一句簡單的話記住遞歸就是:我完成最簡單的那一步,其他的復(fù)雜的相似問題都找別人去做吧。


        上一頁 1 2 下一頁

        評論


        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 林芝县| 上思县| 辽阳县| 夏河县| 乡城县| 鄱阳县| 军事| 蓬安县| 堆龙德庆县| 富平县| 盖州市| 翁牛特旗| 黑水县| 阿克陶县| 东明县| 舟山市| 杭锦旗| 汽车| 丰都县| 博罗县| 泗阳县| 陈巴尔虎旗| 安平县| 武乡县| 清河县| 渝北区| 屏南县| 耿马| 郓城县| 南木林县| 长垣县| 静海县| 吉水县| 梁平县| 临西县| 瓦房店市| 衡南县| 南部县| 张家川| 读书| 阿图什市|