在学习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)



