• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

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

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

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

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

    本文引用地址:http://www.czjhyjcfj.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語言 鏈表

    評論


    相關推薦

    技術專區

    關閉
    主站蜘蛛池模板: 奉节县| 德昌县| 内黄县| 朝阳市| 永寿县| 玉林市| 松江区| 湟源县| 桐城市| 安陆市| 泾阳县| 民勤县| 兴国县| 中江县| 绥江县| 青海省| 许昌县| 乌拉特中旗| 巨野县| 鲜城| 信阳市| 延边| 确山县| 巴林右旗| 贵阳市| 通渭县| 丰宁| 文成县| 新安县| 贡觉县| 华蓥市| 达州市| 乐昌市| 马公市| 丰城市| 皋兰县| 安泽县| 诸城市| 开封县| 福清市| 兖州市|