新聞中心

        EEPW首頁 > 嵌入式系統 > 牛人業話 > C語言的那些小秘密之鏈表(二)

        C語言的那些小秘密之鏈表(二)

        作者: 時間:2015-04-11 來源:網絡 收藏

          除了個別天才程序員外,沒有人一開始就能寫出讓人驚嘆的代碼,都是從模仿開始的!不要相信你身邊的人說他能很輕松的自己編寫出讓人驚嘆的代碼而不用任何的參考資料,因為我相信在你我的身邊沒有這樣的天才程序員,所以我們都選擇從模仿和閱讀源代碼開始。就好比一個優秀的作家不是一開始就能寫出好的文章,他也是閱讀了很多優秀的文章之后才能寫出優秀作品的。一開始我想詳細的講解雙部分,但是我發現由于代碼的原因,使得文章的篇幅過大,所以在此就選擇一些易錯和場用的知識點來進行講解,如果一開始你發現閱讀代碼時很吃力,請不要放棄!我們要有毅力去把它消化掉,融會貫通之后再寫出我們自己的雙,當然我給出的僅僅只是一個參考而已。

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

          在此也要特地感謝下編程浪子朱云翔老師,閱讀我博客后提出的寶貴意見,根據你的建議我接下來的博客中都把代碼部分放到了代碼框中,使得代碼看起來更加的悅目。

          前一篇博客中我們講解了單,那么接下來還是按照我們之前的安排講解雙鏈表部分, 在開始講解之前,我們先來簡單的回顧下上一篇博客中的雙鏈表,雙鏈表是鏈表的一種,它的每個數據結點中都有兩個指針,分別指向直接后繼和直接前驅。所以,從雙向鏈表中的任意一個結點開始,都可以很方便地訪問它的前驅結點和后繼結點。對雙鏈表做了一個簡單的回顧之后那么接下來我們就來開始講解雙鏈表了,在這里我們也同樣遵循一個原則,就是用簡單易懂的代碼和文字描述來講解,我們要突出代碼的重點是在編程的過程中我們的易錯點。

          因為雙鏈表的使用相對于單鏈表操作來說要復雜和常用些,所以在這里我采用逐漸添加功能模塊的方法來進行講解,從易到難,讓讀者理解起來更加輕松,同時我們在這里也使用我前面博客中提到的一些方法,學以致用嘛,學了就要在代碼中盡可能的使用起來,要不然學了有什么用呢,接下來我們先來看看一個最為簡單的雙鏈表的創建。

          特此說明:

          1、如果在接下來的代碼中發現一些不懂而我又沒有給出提示信息的,如自己定義枚舉型的數據結構DListReturn作為返回類型等,那么請你看我的前一篇博客《的那些小秘密之鏈表(一)》。

          2、由于文章在編輯的時候可以對代碼部分使用顏色標記,但是發表后好像顯示不出來,我試圖修改,但還是不行,所以在此說明下,代碼中被“” 和“ ”框起來的部分為有色部分。讀者自己在閱讀代碼的時候注意下,自己對比也能找到新加入的代碼。
        #include <stdio.h>
        #include <stdlib.h>

        typedef enum _DListReturn
        {
        DLIST_RETURN_OK,
        DLIST_RETURN_FAIL
        }DListReturn;

        typedef struct _DStu
        {
        int score;
        }DStu;

        typedef struct _DListNode
        {
        struct _DListNode* prev;
        struct _DListNode* next;

        DStu* data;
        }DListNode;

        typedef struct _DList
        {
        DListNode* head;
        }DList;

        typedef DListReturn (*DListPrintFunction)(void* data);

        DListNode* dlist_node_create(void* data)
        {
        DListNode* node;
        if((node = (DListNode*) malloc(sizeof(DListNode)))==NULL)
        {
        printf("分配空間失敗!");
        exit(0);
        }

        if(node != NULL)
        {
        node->prev = NULL;
        node->next = NULL;
        node->data =(DStu*)data;
        }
        return node;
        }

        DList* dlist_head_create(void)
        {
        DList* thiz;
        if((thiz = (DList*)malloc(sizeof(DList)))==NULL)
        {
        printf("分配空間失敗!");
        exit(0);
        }

        if(thiz != NULL)
        {
        thiz->head = NULL;
        }

        return thiz;
        }

        DListReturn dlist_append(DList* thiz, void* data)
        {
        DListNode* node = NULL;
        DListNode* cursor = NULL;

        if((node = dlist_node_create(data)) == NULL)
        {
        return DLIST_RETURN_OK;
        }

        if(thiz->head == NULL)
        {
        thiz->head = node;

        return DLIST_RETURN_OK;
        }

        cursor = thiz->head;
        while(cursor != NULL && cursor->next != NULL)
        {
        cursor = cursor->next;
        }

        cursor->next = node;
        node->prev = cursor;

        return DLIST_RETURN_OK;
        }

        DListReturn dlist_print(DList* thiz, DListPrintFunction print)
        {
        DListNode* iter = thiz->head;

        while(iter != NULL)
        {
        print(iter->data);
        iter = iter->next;
        }
        printf("n");
        return DLIST_RETURN_OK;
        }

        DListReturn print_int(void* data)
        {
        DStu* ss=(DStu*)data;
        printf("%dt ", ss->score);

        return DLIST_RETURN_OK;
        }

        int main(int argc, char* argv[])
        {
        int i = 0;

        DList* dlist = dlist_head_create();

        for(i = 0; i < 7; i++)
        {
        DStu* stu =(DStu*) malloc(sizeof(DStu));
        stu->score = i;
        dlist_append(dlist, (void*)stu);
        }
        dlist_print(dlist, print_int);

        return 0;
        }

          運行結果為:

          

         

          0 1 2 3 4 5 6

          Press any key to continue

          可能有的讀者認為上面得代碼有點復雜化了,其實不然,我們僅僅是寫出了我們要講解的雙鏈表實現中最簡單的部分,其實現的功能是創建一個鏈表,在鏈表末端添加結點,然后打印出鏈表中結點里存放的數據項,對代碼的總體動能有了一個大概的了解之后,現在我們來逐一分析代碼,為接下來添加功能模塊打開思路。


        上一頁 1 2 3 下一頁

        關鍵詞: C語言 鏈表

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 梓潼县| 辉南县| 昭苏县| 黔西县| 金塔县| 宜宾县| 靖西县| 旅游| 福安市| 周至县| 玛纳斯县| 广水市| 都江堰市| 游戏| 虹口区| 双城市| 梅州市| 溆浦县| 汕尾市| 开封市| 新干县| 长丰县| 宁河县| 定日县| 兴山县| 蛟河市| 方正县| 铜川市| 芦溪县| 锡林郭勒盟| 同江市| 盐池县| 黄山市| 青河县| 蒙城县| 高台县| 四平市| 光山县| 新丰县| 顺昌县| 西充县|