国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

c++雙向鏈表操作示例(創建雙向鏈、雙向鏈表中查找數據、插入數據等)

2020-01-26 15:30:55
字體:
來源:轉載
供稿:網友

雙向鏈表也叫雙鏈表,是鏈表的一種,它的每個數據結點中都有兩個指針,分別指向直接后繼和直接前驅。所以,從雙向鏈表中的任意一個結點開始,都可以很方便地訪問它的前驅結點和后繼結點。一般我們都構造雙向循環鏈表。

(1)定義雙向鏈表的基本結構

復制代碼 代碼如下:

typedef struct _DOUBLE_LINK_NODE 

    int data; 
    struct _DOUBLE_LINK_NODE* prev; 
    struct _DOUBLE_LINK_NODE* next; 
}DOUBLE_LINK_NODE; 

(2)創建雙向鏈表節點

復制代碼 代碼如下:

DOUBLE_LINK_NODE* create_double_link_node(int value) 

    DOUBLE_LINK_NODE* pDLinkNode = NULL; 
    pDLinkNode = (DOUBLE_LINK_NODE*)malloc(sizeof(DOUBLE_LINK_NODE)); 
    assert(NULL != pDLinkNode); 

    memset(pDLinkNode, 0, sizeof(DOUBLE_LINK_NODE)); 
    pDLinkNode->data = value; 
    return pDLinkNode; 

(3)刪除雙向鏈表

復制代碼 代碼如下:

void delete_all_double_link_node(DOUBLE_LINK_NODE** pDLinkNode) 

    DOUBLE_LINK_NODE* pNode; 
    if(NULL == *pDLinkNode) 
        return ; 

    pNode = *pDLinkNode; 
    *pDLinkNode = pNode->next; 
    free(pNode); 
    delete_all_double_link_node(pDLinkNode); 
}

(4)在雙向鏈表中查找數據

復制代碼 代碼如下:

DOUBLE_LINK_NODE* find_data_in_double_link(const DOUBLE_LINK_NODE* pDLinkNode, int data) 

    DOUBLE_LINK_NODE* pNode = NULL; 
    if(NULL == pDLinkNode) 
        return NULL; 

    pNode = (DOUBLE_LINK_NODE*)pDLinkNode; 
    while(NULL != pNode){ 
        if(data == pNode->data) 
            return pNode; 
        pNode = pNode ->next; 
    } 

    return NULL; 

(5)雙向鏈表中插入數據

復制代碼 代碼如下:

STATUS insert_data_into_double_link(DOUBLE_LINK_NODE** ppDLinkNode, int data) 

    DOUBLE_LINK_NODE* pNode; 
    DOUBLE_LINK_NODE* pIndex; 

    if(NULL == ppDLinkNode) 
        return FALSE; 

    if(NULL == *ppDLinkNode){ 
        pNode = create_double_link_node(data); 
        assert(NULL != pNode); 
        *ppDLinkNode = pNode; 
        (*ppDLinkNode)->prev = (*ppDLinkNode)->next = NULL; 
        return TRUE; 
    } 

    if(NULL != find_data_in_double_link(*ppDLinkNode, data)) 
        return FALSE; 

    pNode = create_double_link_node(data); 
    assert(NULL != pNode); 

    pIndex = *ppDLinkNode; 
    while(NULL != pIndex->next) 
        pIndex = pIndex->next; 

    pNode->prev = pIndex; 
    pNode->next = pIndex->next; 
    pIndex->next = pNode; 
    return TRUE; 

(6)雙向鏈表中刪除數據

復制代碼 代碼如下:

STATUS delete_data_from_double_link(DOUBLE_LINK_NODE** ppDLinkNode, int data) 

    DOUBLE_LINK_NODE* pNode; 
    if(NULL == ppDLinkNode || NULL == *ppDLinkNode) 
        return FALSE; 

    pNode = find_data_in_double_link(*ppDLinkNode, data); 
    if(NULL == pNode) 
        return FALSE; 

    if(pNode == *ppDLinkNode){ 
        if(NULL == (*ppDLinkNode)->next){ 
            *ppDLinkNode = NULL; 
        }else{ 
            *ppDLinkNode = pNode->next; 
            (*ppDLinkNode)->prev = NULL; 
        } 

    }else{ 
        if(pNode->next) 
            pNode->next->prev = pNode->prev; 
        pNode->prev->next = pNode->next; 
    } 

    free(pNode); 
    return TRUE; 

(7)統計雙向鏈表中數據的個數

復制代碼 代碼如下:

int count_number_in_double_link(const DOUBLE_LINK_NODE* pDLinkNode) 

    int count = 0; 
    DOUBLE_LINK_NODE* pNode = (DOUBLE_LINK_NODE*)pDLinkNode; 

    while(NULL != pNode){ 
        count ++; 
        pNode = pNode->next; 
    } 
    return count; 

(8)打印雙向鏈表中數據

復制代碼 代碼如下:

void print_double_link_node(const DOUBLE_LINK_NODE* pDLinkNode) 

    DOUBLE_LINK_NODE* pNode = (DOUBLE_LINK_NODE*)pDLinkNode; 

    while(NULL != pNode){ 
        printf("%d/n", pNode->data); 
        pNode = pNode ->next; 
    } 

今天我們討論的雙向鏈表是非循環的,大家可以考慮一下如果改成循環雙向鏈表,應該怎么寫?如果是有序的循環雙向鏈表,又該怎么寫?

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 澄城县| 仙桃市| 巧家县| 涟水县| 女性| 永修县| 资源县| 扎鲁特旗| 石嘴山市| 文成县| 老河口市| 通山县| 丰县| 贺州市| 乐平市| 瑞金市| 凤山市| 韩城市| 太康县| 平陆县| 成都市| 辽阳县| 页游| 江都市| 大方县| 休宁县| 安新县| 志丹县| 玉门市| 秦皇岛市| 玉山县| 涟源市| 新宁县| 闵行区| 巴马| 鹤岗市| 济南市| 兖州市| 苍溪县| 罗定市| 安远县|