AMPS:单向链表源码解读 (九)

2014-11-24 08:28:21 · 作者: · 浏览: 10
MPS_LListFreeLinkDataCallback func_ptr)
{
if ((list == NULL) || (*list == NULL) || (node == NULL))
{
return AMPS_ERROR_FAILURE;
}
if (func_ptr)
{
/*处理待删除结点*/
if (AMPS_ERROR_FAILURE == 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 != node)
{
printf("SList_Remove: list corrupted: poAMPSSListPrev pointer NULL but node is not the first element in list\n");
return AMPS_ERROR_FAILURE;
}
*list = node->poAMPSSListNext;
if (*list) // We have deleted the last element in the list
(*list)->poAMPSSListPrev = NULL;
AMPS_InternalFree(node);
return AMPS_SUCCESS;
}
/*待删除结点不是头结点*/
node->poAMPSSListPrev->poAMPSSListNext = node->poAMPSSListNext;
if (node->poAMPSSListNext)
{
node->poAMPSSListNext->poAMPSSListPrev = node->poAMPSSListPrev;
}
AMPS_InternalFree(node);
return AMPS_SUCCESS;
}
/*****************************************************************
函数名称: SList_Count
功能描述: 计算链表中的结点个数
入参::
const t_AMPSSList* list 原链表
出参:
NA
返回值:
int 结点数目
*****************************************************************/
unsigned int SList_Count(const t_AMPSSList* list)
{
unsigned int uchCount = 0;
t_AMPSSList* cur_ptr = (t_AMPSSList*)list;
while (cur_ptr)
{
uchCount++;
cur_ptr = cur_ptr->poAMPSSListNext;
}
return uchCount;
}
/*****************************************************************
函数名称: SList_Concat
功能描述: 连接两个链表
入参::
t_AMPSSList** src 原链表
t_AMPSSList* dst 待连接的链表
出参:
NA
返回值:
int
*****************************************************************/
int SList_Concat(t_AMPSSList** src, t_AMPSSList* dst)
{
t_AMPSSList *last = NULL;
if (src == NULL || dst == NULL)
{
return AMPS_ERROR_FAILURE;
}
if (*src == NULL)
{
*src = dst;
} else
{
last = SList_Last(*src);
last->poAMPSSListNext = dst;
dst->poAMPSSListPrev = last;
}
return AMPS_SUCCESS;
}
/*****************************************************************
函数名称: SList_AppendGivenNode
功能描述: 在链表头结点后插入指定结点
入参::
void **list 原链表
void* sListNode 待插入结点
出参:
void **list
返回值:
void
*****************************************************************/
void SList_AppendGivenNode(void **list, void* sListNode)
{
t_AMPSSList **slist = (t_AMPSSList**)list;
t_AMPSSList* list_ptr = (t_AMPSSList*)*slist;
t_AMPSSList* snode = (t_AMPSSList*)sListNode;
if(!list_ptr)
{
*slist = snode;
return;
}
snode->poAMPSSListNext = list_ptr->poAMPSSListNext;
snode->poAMPSSListPrev = list_ptr;
list_ptr->poAMPSSListNext = sn