新聞中心

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

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

        作者: 時間:2016-12-01 來源:網(wǎng)絡(luò) 收藏
        這幾天正在復(fù)習(xí)一些基本的算法和實現(xiàn),今天看了看遞歸的基本原理,發(fā)現(xiàn)自己對遞歸還不是特別清楚,特別是不清楚遞歸的思想,不能很準(zhǔn)確的把握先分解成小事件,在合并的思想,其實也是數(shù)學(xué)歸納法的程序體現(xiàn),其實數(shù)學(xué)歸納法是一種強大的方法,記得高中的時候最喜歡做的題目就是數(shù)學(xué)歸納方面的證明,現(xiàn)在想過來好多問題我不能采用這種方式思考,可見知識真的是有聯(lián)系的,只是我們沒有找到聯(lián)系的方式而已。


        為了熟悉遞歸的思想,我嘗試了采用遞歸的方式實現(xiàn)單向鏈表的基本操作。單向的鏈表是C語言課程中接觸到的中比較復(fù)雜的數(shù)據(jù)結(jié)構(gòu),但是他確實其他數(shù)據(jù)結(jié)構(gòu)的基礎(chǔ),在一般情況下都是采用迭代的形式實現(xiàn),迭代的形式相比遞歸要節(jié)省時間和空間,但是代碼相對來說要復(fù)雜,遞歸往往只是簡單的幾句代碼,我主要是為了熟悉迭代,并不在性能上進行分析。

        基本的實現(xiàn)如下所示:

        本文引用地址:http://www.104case.com/article/201612/324524.htm

        #include
        #include

        typedef struct listnode
        {
        int val;
        struct listnode *next;
        }List;

        /*統(tǒng)計節(jié)點個數(shù)*/
        int count_listnode(List *head)
        {
        static int count = 0;

        if(NULL != head)
        {
        count += 1;
        if(head->next != NULL)
        {
        count_listnode(head->next);
        }

        return count;
        }
        }

        /*順序打印*/
        void fdprint_listnode(List *head)
        {
        if(NULL != head)
        {
        printf("%d ",head->val);
        if(head->next != NULL)
        {
        fdprint_listnode(head->next);
        }
        }
        }
        /*反向打印*/
        void bkprint_listnode(List *head)
        {
        if(head != NULL)
        {
        if(head->next != NULL)
        {
        bkprint_listnode(head->next);
        }

        printf("%d ",head->val);
        }
        }
        /*刪除一個節(jié)點的數(shù)據(jù)為d的節(jié)點*/
        List *delete_node(List * head, int d)
        {
        List *temp = head;

        if(head != NULL)
        {
        if(head->val == d)
        {
        temp = head;
        head = head->next;
        free(temp);
        temp = NULL;
        }
        else
        {
        temp = head->next;
        if(temp != NULL)
        {
        temp = delete_node(temp,d);
        head->next= temp;
        }
        }
        }

        return head;
        }

        /*刪除所有val = d的節(jié)點*/
        List* delete_allnode(List *head, int d)
        {
        List *temp = head, *cur = head;
        if(head != NULL)
        {
        /*如果第一個就是需要刪除的對象*/
        if(cur->val == d)
        {
        temp = cur;
        cur = cur->next;
        free(temp);
        temp = NULL;
        temp = delete_allnode(cur, d);
        head = temp;
        }
        else /*不是刪除的對象*/
        {
        cur = head->next;
        temp = delete_allnode(cur, d);
        /*將得到的鏈表連接到檢測的區(qū)域*/
        head->next= temp;
        }
        }
        return head;
        }


        上一頁 1 2 下一頁

        評論


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

        關(guān)閉
        主站蜘蛛池模板: 叙永县| 杨浦区| 招远市| 右玉县| 庄河市| 屏东县| 大新县| 固阳县| 铜川市| 科尔| 陆河县| 彰化县| 桐庐县| 通化市| 分宜县| 株洲县| 古蔺县| 西吉县| 察隅县| 兴化市| 特克斯县| 桦南县| 北京市| 日喀则市| 湘潭县| 临安市| 永寿县| 绥棱县| 革吉县| 庆云县| 大同市| 五华县| 富蕴县| 炎陵县| 江川县| 新河县| 嵊泗县| 湖州市| 内黄县| 云浮市| 民丰县|