在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ 數(shù)據(jù)分析&挖掘/ 單向鏈表
hash表
單詞統(tǒng)計
鏈表排序
查找
可變參數(shù)
爬樓梯
內(nèi)存
prim算法 中
線性結(jié)構(gòu)的處理
數(shù)據(jù)選擇
prim算法 上
循環(huán)單向鏈表
基數(shù)排序
堆排序
鏈表重合
排序二叉樹的保存和加載
圖添加和刪除
排序二叉樹線索化
非遞歸排序
字符串查找 下篇
鏈表逆轉(zhuǎn)
函數(shù)堆棧顯示
遞歸和堆棧
二叉樹深度遍歷
線性隊列
循環(huán)和遞歸
快速排序
尋找丟失的數(shù)
A*算法
克魯斯卡爾算法 下
排序二叉樹
大數(shù)計算
二叉樹廣度遍歷
prim算法 下
洗牌算法
圖結(jié)構(gòu)
最大公約數(shù)、最小公倍數(shù)
圖創(chuàng)建
雙向鏈表
字符串查找 上篇
尋路
通用算法的編寫
哈夫曼樹 下
線性堆棧
八皇后
排序二叉樹刪除-1
挑選最大的n個數(shù)
字符串查找 中篇
哈夫曼樹 上
合并排序
回數(shù)
選擇排序
哈希二叉樹
通用數(shù)據(jù)結(jié)構(gòu)
“數(shù)星星”
單向鏈表
排序二叉樹插入
圖的保存
排序二叉樹刪除-2
排序二叉樹刪除-3
n!中末尾零的個數(shù)統(tǒng)計

單向鏈表

有的時候,處于內(nèi)存中的數(shù)據(jù)并不是連續(xù)的。那么這時候,我們就需要在數(shù)據(jù)結(jié)構(gòu)中添加一個屬性,這個屬性會記錄下面一個數(shù)據(jù)的地址。有了這個地址之后,所有的數(shù)據(jù)就像一條鏈子一樣串起來了,那么這個地址屬性就起到了穿線連結(jié)的作用。

相比較普通的線性結(jié)構(gòu),鏈表結(jié)構(gòu)的優(yōu)勢是什么呢?我們可以總結(jié)一下:

(1)單個節(jié)點創(chuàng)建非常方便,普通的線性內(nèi)存通常在創(chuàng)建的時候就需要設(shè)定數(shù)據(jù)的大小

(2)節(jié)點的刪除非常方便,不需要像線性結(jié)構(gòu)那樣移動剩下的數(shù)據(jù)

(3)節(jié)點的訪問方便,可以通過循環(huán)或者遞歸的方法訪問到任意數(shù)據(jù),但是平均的訪問效率低于線性表

那么在實際應(yīng)用中,鏈表是怎么設(shè)計的呢?我們可以以int數(shù)據(jù)類型作為基礎(chǔ),設(shè)計一個簡單的int鏈表:

(1)設(shè)計鏈表的數(shù)據(jù)結(jié)構(gòu)

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

(2)創(chuàng)建鏈表

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)鏈表插入數(shù)據(jù)

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)刪除數(shù)據(jù)

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)查找數(shù)據(jù)

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)打印數(shù)據(jù)

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

(8)統(tǒng)計數(shù)據(jù)

int count_node(const LINK_NODE* pLinkNode)
{
    if(NULL == pLinkNode)
        return 0;

    return 1 + count_node(pLinkNode->next);
}