AMPS:双向链表源码解读 (六)
Free(node);
return AMPS_SUCCESS;
}
node->poAMPSSListPrev->poAMPSSListNext = node->poAMPSSListNext;
if (node->poAMPSSListNext)
{
node->poAMPSSListNext->poAMPSSListPrev = node->poAMPSSListPrev;
}
AMPS_InternalFree(node);
(*list)->uchCount--;
return AMPS_SUCCESS;
}
/*****************************************************************
函数名称: DList_Sort
功能描述: 双向链表排序
入参::
t_AMPSDList* list 原链表
AMPS_LListCompareLinkDataCallback func_ptr 排序函数回调
出参:
t_AMPSDList** 返回找到的结点指针
返回值:
int
*****************************************************************/
int DList_Sort(t_AMPSDList **list, AMPS_LListCompareLinkDataCallback func_ptr)
{
t_AMPSDList* poListToSort = (t_AMPSDList*)*list;
int nCountOuter = 0;
t_AMPSSList* poNode = NULL;
t_AMPSSList* poNextNode = NULL;
if ((list == NULL) || (*list == NULL) || (func_ptr == NULL))
{
return AMPS_ERROR_FAILURE;
}
if (poListToSort->uchCount <= 1)
{
return AMPS_SUCCESS;
}
/*冒泡排序*/
poNode = poListToSort->poAMPSSListHead;
poNextNode = poNode->poAMPSSListNext;
for (nCountOuter = 0; nCountOuter < (poListToSort->uchCount - 1); nCountOuter++)
{
while(poNextNode)
{
if (!func_ptr(poNode->pvData, poNextNode->pvData))
{
//swap elements
DList_SwapNodesData(poNode, poNextNode);
}
poNextNode = poNextNode->poAMPSSListNext;
}
poNode = poNode->poAMPSSListNext;
poNextNode = poNode->poAMPSSListNext;
}
return AMPS_SUCCESS;
}
/*****************************************************************
函数名称: DList_Sort
功能描述: 双向链表交换结点
入参::
t_AMPSSList* r_poNodeOne 结点1
At_AMPSSList* r_poNodeTwo 结点2
出参:
t_AMPSSList* r_poNodeOne 结点2
t_AMPSSList* r_poNodeTwo 结点1
返回值:
int
*****************************************************************/
void DList_SwapNodesData(t_AMPSSList* r_poNodeOne, t_AMPSSList* r_poNodeTwo)
{
void* poData = NULL;
poData = r_poNodeOne->pvData;
r_poNodeOne->pvData = r_poNodeTwo->pvData;
r_poNodeTwo->pvData = poData;
}
/*****************************************************************
函数名称: DList_RemoveFirstNode
功能描述: 删除双向链表的头结点
入参::
t_AMPSDList* list 原链表
AMPS_LListRemoveLinkDataCallback func_ptr 结点操作函数回调
出参:
t_AMPSDList** 操作后的链表
返回值:
int
*****************************************************************/
int DList_RemoveFirstNode(t_AMPSDList **list, AMPS_LListRemoveLinkDataCallback func_ptr)
{
t_AMPSSList* node = NULL;
if ((list == NULL) || (*list == NULL))
{
return AMPS_ERROR_FAILURE;
}
node = (*list)->poAMPSSListHead;
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");