新聞中心

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

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

作者: 時間:2015-04-11 來源:網(wǎng)絡(luò) 收藏

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

本文引用地址:http://butianyuan.cn/article/272382.htm

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

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

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

  特此說明:

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

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

  運行結(jié)果為:

  

 

  0 1 2 3 4 5 6

  Press any key to continue

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


上一頁 1 2 3 下一頁

關(guān)鍵詞: C語言 鏈表

評論


相關(guān)推薦

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

關(guān)閉