栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C语言 之一:双向链表

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C语言 之一:双向链表

  在学习QAT开源框架过程中,发现代码中的双向链表写的非常好,特此记录下来,以备不时之需。好了,废话不多说,下面主要以实例的形式展示双向链表的写法。

1. 双向链表结构体
typedef struct registation_handle_s
{
    Status (*EventHandler)(accel_dev_t *accel_dev,
                           enum adf_event event,
                           void *param);
                                        
    char *name;
    struct registation_handle_s *pNext; 
    struct registation_handle_s *pPrev;	
} registation_handle_t;

static registation_handle_t *pSubsystemTable = NULL;      
static registation_handle_t *pSubsystemTableHead = NULL;  
2. 在链表的头添加一个元素

#define ICP_ADD_ELEMENT_TO_HEAD_OF_LIST(elementtoadd, currentptr, headptr)     
    do                                                                         
    {                                                                          
        if (NULL == headptr)                                  
        {                                                                      
            elementtoadd->pNext = NULL;                                        
            elementtoadd->pPrev = NULL;                                        
            headptr = elementtoadd;                                            
        }                                                                      
        else                                                                   
        {                                                                      
            elementtoadd->pPrev = NULL;                                        
            elementtoadd->pNext = headptr;                                     
            headptr->pPrev = elementtoadd;                                     
            headptr = elementtoadd;                                            
        }                                                                      
    } while (0)
3. 在链表的尾添加一个元素

#define ICP_ADD_ELEMENT_TO_END_OF_LIST(elementtoadd, currentptr, headptr)      
    do                                                                         
    {                                                                          
        if (NULL == currentptr)                               
        {                                                                      
            currentptr = elementtoadd;                                         
            elementtoadd->pNext = NULL;                                        
            elementtoadd->pPrev = NULL;                                        
            headptr = currentptr;                                              
        }                                                                      
        else                                                      
        {                                                                      
            elementtoadd->pPrev = currentptr;                                  
            currentptr->pNext = elementtoadd;                                  
            elementtoadd->pNext = NULL;                                        
            currentptr = elementtoadd;                                         
        }                                                                      
    } while (0)
4. 删除链表中的一个元素
#define ICP_REMOVE_ELEMENT_FROM_LIST(elementtoremove, currentptr, headptr)     
    do                                                                         
    {                                                                          
                                      
        if (NULL != elementtoremove->pPrev)                                    
        {                                                                      
            elementtoremove->pPrev->pNext = elementtoremove->pNext;            
            if (elementtoremove->pNext)                                        
            {                                                                  
                elementtoremove->pNext->pPrev = elementtoremove->pPrev;        
            }                                                                  
            else                                                               
            {                                                                  
                                          
                currentptr = elementtoremove->pPrev;                           
            }                                                                  
        }                                                                      
        else if (NULL != elementtoremove->pNext)                               
        {                                                                      
                                                  
            elementtoremove->pNext->pPrev = NULL;                              
                                              
            headptr = elementtoremove->pNext;                                  
        }                                                                      
        else                                                                   
        {                                                                      
                                       
            currentptr = NULL;                                                 
            headptr = NULL;                                                    
        }                                                                      
    } while (0)
5. 在链表中查找一个元素
#define ICP_FIND_ELEMENT_IN_LIST(elementtofind, listhead, status)              
    do                                                                         
    {                                                                          
        if (NULL == listhead)                                                  
        {                                                                      
            status = STATUS_FAIL;                                          
        }                                                                      
        while (listhead != NULL)                                               
        {                                                                      
            if (listhead == elementtofind)                                     
            {                                                                  
                status = STATUS_SUCCESS;                                   
                break;                                                         
            }                                                                  
            else                                                               
            {                                                                  
                listhead = listhead->pNext;                                    
            }                                                                  
        }                                                                      
    } while (0)
6. 释放链表
#define ICP_FREE_LIST(current_ptr)                                             
    do                                                                         
    {                                                                          
        if (NULL != current_ptr)                                               
        {                                                                      
            while (NULL != current_ptr->pNext)                                 
            {                                                                  
                current_ptr = current_ptr->pNext;                              
                free(current_ptr->pPrev);                                      
                current_ptr->pPrev = NULL;                                     
            }                                                                  
            free(current_ptr);                                                 
            current_ptr = NULL;                                                
        }                                                                      
    } while (0)
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/849683.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号