AMPS:双向链表源码解读 (五)
t_AMPSDList** src 原链表
void* pvData 待追加结点
出参:
NA
返回值:
t_AMPSDList** src 追加后的链表
*****************************************************************/
t_AMPSSList* DList_Prepend(t_AMPSDList* list, void* pvData)
{
t_AMPSSList *new_list = NULL;
t_AMPSSList *list_ptr = list->poAMPSSListHead;
new_list = AMPS_InternalMalloc(sizeof(t_AMPSSList));
if (NULL == new_list)
{
return NULL;
}
new_list->pvData = pvData;
new_list->poAMPSSListNext = list_ptr;
new_list->poAMPSSListPrev = NULL;
if (list_ptr)
{
list_ptr->poAMPSSListPrev = new_list;
}
list->poAMPSSListHead = new_list;
list->uchCount += 1;
return new_list;
}
/*****************************************************************
函数名称: DList_Search
功能描述: 在双向链表中查找指定内容的结点
入参::
t_AMPSDList* list 原链表
AMPS_LListCompareLinkDataCallback func_ptr 结点比较回调函数
void* pvData 待查找结点内容
出参:
NA
返回值:
t_AMPSDList* 返回找到的结点指针
*****************************************************************/
t_AMPSSList* DList_Search(t_AMPSDList* list, AMPS_LListCompareLinkDataCallback func_ptr, void* pvData)
{
return(SList_Search (list->poAMPSSListHead, func_ptr ,pvData));
}
/*****************************************************************
函数名称: DList_Find
功能描述: 在双向链表中查找指定内容的结点
入参::
t_AMPSDList* list 原链表
t_AMPSSList *node 待查找结点
出参:
NA
t_AMPSDList* 返回找到的结点指针
*****************************************************************/
t_AMPSSList* DList_Find (t_AMPSDList *list, t_AMPSSList *node)
{
return(SList_Find (list->poAMPSSListHead, node));
}
/*****************************************************************
函数名称: DList_Remove
功能描述: 在双向链表中删除指定的结点
入参::
t_AMPSDList* list 原链表
t_AMPSSList *node 待删除结点
AMPS_LListRemoveLinkDataCallback func_ptr 删除前结点处理回调函数
出参:
t_AMPSDList** 返回找到的结点指针
返回值:
int
*****************************************************************/
int DList_Remove(t_AMPSDList **list, t_AMPSSList *node, AMPS_LListRemoveLinkDataCallback func_ptr)
{
if ((list == NULL) || (*list == NULL) || (node == NULL))
{
return AMPS_ERROR_FAILURE;
}
if (func_ptr)
{
if (func_ptr(&(node->pvData)))
{
return AMPS_ERROR_FAILURE;
}
}
// If first element is found to be the element to be deleted
if (NULL == node->poAMPSSListPrev)
{
if ((*list)->poAMPSSListHead != node)
{
// //printfslist_remove: list corrupted: poAMPSSListPrev pointer NULL but node is not the first element in list\n");
return AMPS_ERROR_FAILURE;
}
if (NULL != node->poAMPSSListNext)
{
(*list)->poAMPSSListHead = node->poAMPSSListNext;
(*list)->poAMPSSListHead->poAMPSSListPrev = NULL;
} else
{
(*list)->poAMPSSListHead = NULL;
}
(*list)->uchCount--;
AMPS_Internal