一步一步寫演算法(之單向鏈表)

來源:互聯網
上載者:User

【 聲明:著作權,歡迎轉載,請勿用於商業用途。  聯絡信箱:feixiaoxing @163.com】

    有的時候,處於記憶體中的資料並不是連續的。那麼這時候,我們就需要在資料結構中添加一個屬性,這個屬性會記錄下面一個資料的地址。有了這個地址之後,所有的資料就像一條鏈子一樣串起來了,那麼這個地址屬性就起到了穿線連結的作用。

    相比較普通的線性結構,鏈表結構的優勢是什麼呢?我們可以總結一下:

    (1)單個節點建立非常方便,普通的線性記憶體通常在建立的時候就需要設定資料的大小

    (2)節點的刪除非常方便,不需要像線性結構那樣移動剩下的資料

    (3)節點的訪問方便,可以通過迴圈或者遞迴的方法訪問到任意資料,但是平均的訪問效率低於線性表

    那麼在實際應用中,鏈表是怎麼設計的呢?我們可以以int資料類型作為基礎,設計一個簡單的int鏈表:

    (1)設計鏈表的資料結構

typedef struct _LINK_NODE{    int data;struct _LINK_NODE* next;}LINK_NODE;

    (2)建立鏈表

LINK_NODE* alloca_node(int value){    LINK_NODE* pLinkNode = NULL;pLinkNode = (LINK_NODE*)malloc(sizeof(LINK_NODE));pLinkNode->data = value;pLinkNode->next = NULL;return pLinkNode;}

    (3)刪除鏈表

void delete_node(LINK_NODE** pNode){    LINK_NODE** pNext;    if(NULL == pNode || NULL == *pNode)    return ;pNext = &(*pNode)->next;free(*pNode);delete_node(pNext);}

    (4)鏈表插入資料

STATUS _add_data(LINK_NODE** pNode, LINK_NODE* pDataNode){    if(NULL == *pNode){    *pNode = pDataNode;return TRUE;}return _add_data(&(*pNode)->next, pDataNode);}STATUS add_data(const LINK_NODE** pNode, int value){    LINK_NODE* pDataNode;    if(NULL == *pNode)    return FALSE;pDataNode = alloca_node(value);assert(NULL != pDataNode);return _add_data((LINK_NODE**)pNode, pDataNode);}

    (5)刪除資料

STATUS _delete_data(LINK_NODE** pNode, int value){    LINK_NODE* pLinkNode;    if(NULL == (*pNode)->next)    return FALSE;pLinkNode = (*pNode)->next;if(value == pLinkNode->data){    (*pNode)->next = pLinkNode->next;free(pLinkNode);return TRUE;}else{    return _delete_data(&(*pNode)->next, value);}}STATUS delete_data(LINK_NODE** pNode, int value){    LINK_NODE* pLinkNode;    if(NULL == pNode || NULL == *pNode)    return FALSE;    if(value == (*pNode)->data){    pLinkNode = *pNode;*pNode = pLinkNode->next;free(pLinkNode);return TRUE;}return _delete_data(pNode, value);}

    (6)尋找資料

LINK_NODE* find_data(const LINK_NODE* pLinkNode, int value){    if(NULL == pLinkNode)    return NULL;if(value == pLinkNode->data)    return (LINK_NODE*)pLinkNode;return find_data(pLinkNode->next, value);}

    (7)列印資料

void print_node(const LINK_NODE* pLinkNode){    if(pLinkNode){    printf("%d\n", pLinkNode->data);print_node(pLinkNode->next);}}

    (8)統計資料

int count_node(const LINK_NODE* pLinkNode){    if(NULL == pLinkNode)    return 0;return 1 + count_node(pLinkNode->next);}

【預告: 下一篇部落格介紹雙向鏈表】

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.