zoukankan      html  css  js  c++  java
  • link list

    上一次发的代码有2个小 BUG 

    1. 没有对那个空的指针进行初始化, 现在已经初始化为NULL.

    2. 数据定义的结构已经已经正规化, 结构体采用小写的_t 模型

    #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;
        int reg;
        struct _double_link_node* prev;
        struct _double_link_node* next;
    }double_link_node_t;
    
    
    void delete_all_double_link_node(double_link_node_t** pDLinkNode);//1. 删除双向链表
    STATUS insert_addr_into_double_link(double_link_node_t** ppDLinkNode, int value_addr, int value_reg);//2. 双向链表中插入地址+寄存器值
    STATUS delete_addr_from_double_link(double_link_node_t** ppDLinkNode, int value_addr);//3. 双向链表中删除地址
    int count_number_in_double_link(const double_link_node_t* pDLinkNode);//4. 统计双向链表中地址的个数
    void print_double_link_node(const double_link_node_t* pDLinkNode);//5. 打印双向链表中地址
    
    
    int main()
    {
        double_link_node_t *mb_poll_link;
        mb_poll_link = malloc(sizeof(double_link_node_t));
        memset(mb_poll_link,0,sizeof(double_link_node_t));
        print_double_link_node(mb_poll_link);
        
        insert_addr_into_double_link(&mb_poll_link, 11, 0);
        delete_addr_from_double_link(&mb_poll_link, 44);
        
        print_double_link_node(mb_poll_link);
        
        printf("main end!
    ");
        return 0;
    }
    
    
    
    
    
    
    
    
    
    
    
    
    
    //static //创建双向链表节点
    double_link_node_t* create_double_link_node(int value_addr, int value_reg) {
        double_link_node_t* pDLinkNode = NULL;
        pDLinkNode = (double_link_node_t*)malloc(sizeof(double_link_node_t));
        assert(NULL != pDLinkNode);
    
        memset(pDLinkNode, 0, sizeof(double_link_node_t));
        pDLinkNode->addr = value_addr;
        pDLinkNode->reg = value_reg;
        return pDLinkNode;
    }
    
    // static //在双向链表中查找数据
    double_link_node_t* find_addr_in_double_link(const double_link_node_t* pDLinkNode, int addr) {
        double_link_node_t* pNode = NULL;
        if (NULL == pDLinkNode)
            return NULL;
    
        pNode = (double_link_node_t*)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_t** pDLinkNode)
    {
        double_link_node_t* pNode;
        if (NULL == *pDLinkNode)
            return;
        pNode = *pDLinkNode;
        *pDLinkNode = pNode->next;
        free(pNode);
        delete_all_double_link_node(pDLinkNode);    //调用自身函数循环free
    }
    
    //2. 双向链表中插入数据
    STATUS insert_addr_into_double_link(double_link_node_t** ppDLinkNode, int value_addr, int value_reg)
    {
        double_link_node_t* pNode;
        double_link_node_t* pIndex;
        
        if(NULL == ppDLinkNode)                                        // 原链表首地址 空        ->FALSE  
            return FALSE;
        
        if(NULL == *ppDLinkNode){                                    // 原链表 空            ->直接加入
            pNode = create_double_link_node(value_addr, value_reg);
            assert(NULL != pNode);
            *ppDLinkNode = pNode;
            (*ppDLinkNode)->prev = (*ppDLinkNode)->next = NULL;
            return TRUE;
        }
        
        if (NULL != find_addr_in_double_link(*ppDLinkNode, value_addr))    // 原链表存在数据addr    ->FALSE
            return FALSE;
        
        pNode = create_double_link_node(value_addr, value_reg);                        // 
        assert(NULL != pNode);
        
        pIndex = *ppDLinkNode;                                        // 赋值链表首地址
        #if 1        //添加的先后顺序 
        while (NULL != pIndex->next)// 找到最后一个节点
            pIndex = pIndex->next;
        
        pNode->prev = pIndex;
        pNode->next = pIndex->next;
        pIndex->next = pNode;
        #endif
        #if 0        //递增
        if(pIndex->addr>value_addr)                // 起始位置 ->OK ?
        {
            *ppDLinkNode = pNode;
            pNode->prev = NULL;
            pNode->next = pIndex;
            pIndex->prev = pNode;
        }
        else
        {
            while (NULL != pIndex->next)// 找到最后一个节点
                pIndex = pIndex->next;
            if(pIndex->addr<value_addr){            // 结束位置 ->OK ?
                pNode->prev = pIndex;
                pNode->next = pIndex->next;
                pIndex->next = pNode;
            }
            else{                            // 中间位置
                pIndex = *ppDLinkNode;//首地址向后
                while (pIndex->addr<value_addr)
                    pIndex = pIndex->next;
                pNode->prev = pIndex->prev;
                pNode->next = pIndex;
                pIndex->prev->next = pNode;
                pIndex->prev = pNode;
            }
        }
        #endif
        #if 0        //递减
        if(pIndex->addr<value_addr)                // 起始位置 ->OK ?
        {
            *ppDLinkNode = pNode;
            pNode->prev = NULL;
            pNode->next = pIndex;
            pIndex->prev = pNode;
        }
        else
        {
            while (NULL != pIndex->next)// 找到最后一个节点
                pIndex = pIndex->next;
            if(pIndex->addr>value_addr){            // 结束位置 ->OK ?
                pNode->prev = pIndex;
                pNode->next = pIndex->next;
                pIndex->next = pNode;
            }
            else{                            // 中间位置
                pIndex = *ppDLinkNode;//首地址向后
                while (pIndex->addr>value_addr)
                    pIndex = pIndex->next;
                pNode->prev = pIndex->prev;
                pNode->next = pIndex;
                pIndex->prev->next = pNode;
                pIndex->prev = pNode;
            }
        }
        #endif
        
        return TRUE;
    }
    
    //3. 双向链表中删除数据
    STATUS delete_addr_from_double_link(double_link_node_t** ppDLinkNode, int value_addr)
    {
        double_link_node_t* pNode;
        if (NULL == ppDLinkNode || NULL == *ppDLinkNode)                // "原链表首地址"或“原链表” 空        ->FALSE
            return FALSE;
        
        pNode = find_addr_in_double_link(*ppDLinkNode, value_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_t* pDLinkNode)
    {
        int count = 0;
        double_link_node_t* pNode = (double_link_node_t*)pDLinkNode;
        
        while (NULL != pNode){
            count++;
            pNode = pNode->next;
        }
        return count;
    }
    
    //5. 打印双向链表中数据
    void print_double_link_node(const double_link_node_t* pDLinkNode)
    {
        double_link_node_t* pNode = (double_link_node_t*)pDLinkNode;
        printf("print_double_link -> start
    ");
        while (NULL != pNode){
            printf("%d  %d
    ", pNode->addr,pNode->reg);
            pNode = pNode->next;
        }
        printf("print_double_link -> end
    ");
    }
  • 相关阅读:
    CString详细讲解
    常用的函数调用约定 stdcall/cdecl/fastcall
    near指针,far指针,huge指针
    md /mdd /ml /mt/mtd
    VC通过ADO链接ORACLE数据库
    c++ 线程同步
    typedef struct与struct的区别
    BeginPaint&&GetDc(转)
    left join 命令详解
    sqlserver IO 监测
  • 原文地址:https://www.cnblogs.com/mrsandstorm/p/5806224.html
Copyright © 2011-2022 走看看