• 有序的双链表


    根据data大小排序(递增):

    删除all + 删除1 + 添加1 + 打印all 

    // 双链表 -> 有序双链表(递增)
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <assert.h>
    
    typedef enum{
        FALSE = 0,
        TRUE = 1,
    }STATUS;
    
    typedef struct _DOUBLE_LINK_NODE
    {
        int addr;
        struct _DOUBLE_LINK_NODE* prev;
        struct _DOUBLE_LINK_NODE* next;
    }DOUBLE_LINK_NODE;
    
    //1. 删除双向链表
    void delete_all_double_link_node(DOUBLE_LINK_NODE** pDLinkNode);
    //2. 双向链表中插入数据
    STATUS insert_data_into_double_link(DOUBLE_LINK_NODE** ppDLinkNode, int addr);
    //3. 双向链表中删除数据
    STATUS delete_data_from_double_link(DOUBLE_LINK_NODE** ppDLinkNode, int addr);
    //4. 统计双向链表中数据的个数
    int count_number_in_double_link(const DOUBLE_LINK_NODE* pDLinkNode);
    //5. 打印双向链表中数据
    void print_double_link_node(const DOUBLE_LINK_NODE* pDLinkNode);
    
    DOUBLE_LINK_NODE* mb_poll_link;
    int main()
    {
        print_double_link_node(mb_poll_link);
        insert_data_into_double_link(&mb_poll_link, 11);
        insert_data_into_double_link(&mb_poll_link, 66);
        insert_data_into_double_link(&mb_poll_link, 22);
        insert_data_into_double_link(&mb_poll_link, 33);
        insert_data_into_double_link(&mb_poll_link, 55);
        insert_data_into_double_link(&mb_poll_link, 44);
        insert_data_into_double_link(&mb_poll_link, 77);
        delete_data_from_double_link(&mb_poll_link, 77);
        print_double_link_node(mb_poll_link);
        printf("main end!
    ");
        return 0;
    }
    
    //static //创建双向链表节点
    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->addr = value;
        return pDLinkNode;
    }
    
    // static //在双向链表中查找数据
    DOUBLE_LINK_NODE* find_data_in_double_link(const DOUBLE_LINK_NODE* pDLinkNode, int addr) {
        DOUBLE_LINK_NODE* pNode = NULL;
        if (NULL == pDLinkNode)
            return NULL;
    
        pNode = (DOUBLE_LINK_NODE*)pDLinkNode;
        while (NULL != pNode){
            if (addr == pNode->addr)
                return pNode;
            pNode = pNode->next;
        }
        return NULL;
    }
    
    //1. 删除双向链表
    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);    //调用自身函数循环free
    }
    
    //2. 双向链表中插入数据
    STATUS insert_data_into_double_link(DOUBLE_LINK_NODE** ppDLinkNode, int addr)
    {
        DOUBLE_LINK_NODE* pNode;
        DOUBLE_LINK_NODE* pIndex;
        
        if(NULL == ppDLinkNode)                                        // 原链表首地址 空        ->FALSE
            return FALSE;
        
        if(NULL == *ppDLinkNode){                                    // 原链表 空            ->直接加入
            pNode = create_double_link_node(addr);
            assert(NULL != pNode);
            *ppDLinkNode = pNode;
            (*ppDLinkNode)->prev = (*ppDLinkNode)->next = NULL;
            return TRUE;
        }
        
        if (NULL != find_data_in_double_link(*ppDLinkNode, addr))    // 原链表存在数据data    ->FALSE
            return FALSE;
        
        pNode = create_double_link_node(addr);                        // 
        assert(NULL != pNode);
        
        pIndex = *ppDLinkNode;                                        // 赋值链表首地址
        #if 0        //添加的先后顺序 
        while (NULL != pIndex->next)// 找到最后一个节点
            pIndex = pIndex->next;
        
        pNode->prev = pIndex;
        pNode->next = pIndex->next;
        pIndex->next = pNode;
        #endif
        #if 1        //递增
        if(pIndex->addr>addr)                // 起始位置 ->OK ?
        {
            *ppDLinkNode = pNode;
            pNode->prev = NULL;
            pNode->next = pIndex;
            pIndex->prev = pNode;
        }
        else
        {
            while (NULL != pIndex->next)// 找到最后一个节点
                pIndex = pIndex->next;
            if(pIndex->addr<addr){            // 结束位置 ->OK ?
                pNode->prev = pIndex;
                pNode->next = pIndex->next;
                pIndex->next = pNode;
            }
            else{                            // 中间位置
                pIndex = *ppDLinkNode;//首地址向后
                while (pIndex->addr<addr)
                    pIndex = pIndex->next;
                pNode->prev = pIndex->prev;
                pNode->next = pIndex;
                pIndex->prev->next = pNode;
                pIndex->prev = pNode;
            }
        }
        #endif
        #if 0        //递减
        if(pIndex->addr<addr)                // 起始位置 ->OK ?
        {
            *ppDLinkNode = pNode;
            pNode->prev = NULL;
            pNode->next = pIndex;
            pIndex->prev = pNode;
        }
        else
        {
            while (NULL != pIndex->next)// 找到最后一个节点
                pIndex = pIndex->next;
            if(pIndex->addr>addr){            // 结束位置 ->OK ?
                pNode->prev = pIndex;
                pNode->next = pIndex->next;
                pIndex->next = pNode;
            }
            else{                            // 中间位置
                pIndex = *ppDLinkNode;//首地址向后
                while (pIndex->addr>addr)
                    pIndex = pIndex->next;
                pNode->prev = pIndex->prev;
                pNode->next = pIndex;
                pIndex->prev->next = pNode;
                pIndex->prev = pNode;
            }
        }
        #endif
        
        return TRUE;
    }
    
    //3. 双向链表中删除数据
    STATUS delete_data_from_double_link(DOUBLE_LINK_NODE** ppDLinkNode, int addr)
    {
        DOUBLE_LINK_NODE* pNode;
        if (NULL == ppDLinkNode || NULL == *ppDLinkNode)                // "原链表首地址"或“原链表” 空        ->FALSE
            return FALSE;
        
        pNode = find_data_in_double_link(*ppDLinkNode, addr);
        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;                        // 下一个节点的 prev = 节点的prev
            pNode->prev->next = pNode->next;                            // 前一个节点的 next = 节点的next
        }
        
        free(pNode);
        return TRUE;
    }
    
    //4. 统计双向链表中数据的个数
    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;
    }
    
    //5. 打印双向链表中数据
    void print_double_link_node(const DOUBLE_LINK_NODE* pDLinkNode)
    {
        DOUBLE_LINK_NODE* pNode = (DOUBLE_LINK_NODE*)pDLinkNode;
        printf("print_double_link -> start
    ");
        while (NULL != pNode){
            printf("%d
    ", pNode->addr);
            pNode = pNode->next;
        }
        printf("print_double_link -> end
    ");
    }
  • 相关阅读:
    Ajax Slider for GridView Page
    Silverlight 3,Blend 3 ,Asp.NET MVC 1.0
    (牛人莫入) Silverlight 3 之控件DataGrid
    如何改短日期类型为长日期类型?
    获取滚动条的高度和宽度
    form设置为可移动
    时间操作技术之delphi
    调用键盘的回车键来运行程序
    运算符重载
    字符串解析
  • 原文地址:https://www.cnblogs.com/mrsandstorm/p/5781188.html
Copyright © 2020-2023  润新知