AMPS:单向链表源码解读 (四)
ink list
t_AMPSSList *list_ptr = *slist;
/*在链表中分配新结点所要使用的内存空间*/
new_list = SList_Alloc(pvData);
if (NULL == new_list)
{
return -1;
}
if (list_ptr)
{
/*找到当前链表结束*/
last = SList_Last(list_ptr);
if (NULL == last)
{
free(new_list);
return -1;
}
/*将待追加的结点连接到当前链表结尾*/
last->poAMPSSListNext = new_list;
new_list->poAMPSSListPrev = last;
}
else
{
/*如果当前链表为空,则待追加结点做为链表头结点*/
*slist = new_list;
}
return 0;
}
}
/*****************************************************************
函数名称: SList_InsertSortedPrepend
功能描述: 在有序链表中前向插入新结点
入参::
void **list 原链表
void* key 未使用
void* pvData 待插入结点
AMPS_LListCompareCallback compare 结点比较回调函数,由调用者实现
出参:
void **list 追加后的链表
返回值:
int
*****************************************************************/
int SList_InsertSortedPrepend(void **list, void* key, void* pvData, AMPS_LListCompareCallback compare)
{
t_AMPSSList** slist = (t_AMPSSList**)list;
/*判断要添加的结点是否已在链表中存在,已存在,直接返回成功*/
if(NULL != SList_FindData(*slist,pvData) )
{
printf("slist_insert_sorted: node already found in list\n");
return 0;
}
{
t_AMPSSList *new_node = NULL; // pointer to newly created node
t_AMPSSList *list_ptr = *slist, *curr;
new_node = SList_Alloc(pvData);
if (NULL == new_node)
{
return -1;
}
if (list_ptr)
{
/*遍历链表*/
while (list_ptr)
{
/*如果当前链表结点不大于待插入结点,将其插入此结点之后*/
if (AMPS_LLIST_KEY_IS_GREATER != compare(list_ptr->pvData, pvData))
{
break;
}
curr = list_ptr;
list_ptr = list_ptr->poAMPSSListNext;
}
if(!list_ptr)
{
/*如果已到链表结尾,刚将新结点插入到最后*/
SList_AppendGivenNode((void **)&curr, (void*)new_node);
}
else
{
/*未到结尾已找到插入位置,刚插入到链表中间*/
SList_PrependGivenNode(list, (void*)list_ptr,(void*)new_node);
}
}
else
{
*slist = new_node;
}
return 0;
}
}
/*****************************************************************
函数名称: SList_InsertSortedAppend
功能描述: 在递增的有序链表中插入新结点
入参::
void **list 原链表
void* key 未使用
void* pvData 待插入结点
AMPS_LListCompareCallback compare 结点比较回调函数,由调用者实现
出参:
void **list 追加后的链表
返回值:
int
*****************************************************************/
int SList_InsertSortedAppend(void **list, void* key, void* pvData, AMPS_LListCompareCallback compare)
{
t_AMPSSList** slist = (t_AMPSSList**)list;
if(NULL != SList_FindData(*slist,pvData) )
{
printf("slist_insert_sorted: node already found in list\n");
return 0;
}
{
t_AMPSSList *new_node = NULL; // poi