本节在上节单向链表的基础上看看AMPS中对双向链表的实现,与单向链表相同,双向链表在软件中的使用也相对比较广泛,在后面要讲到的Hash表、定时器、内存管理等模块中都会见到以双向链表作为基本数据结构。其实,双向链表在实现上使用了很多单向链表的操作,仅在插入、删除结点时需要多操作几步,所以理解了单向链表,这块就比较好理解了。
同样,AMPS提供了以下API对双向链表进行操作:
AMPS_LinkList.h
#ifndef __HEADER_AMPS_LINKLIST_H__
#define __HEADER_AMPS_LINKLIST_H__
#ifdef __cplusplus
extern "C"
{
#endif
#include "AMPS_API.h"
#include "AMPS_Defines.h"
typedef struct _AMPSSList t_AMPSSList;
typedef struct _AMPSDList t_AMPSDList;
/*单向链表结构*/
struct _AMPSSList
{
void* pvData;
t_AMPSSList* poAMPSSListNext;
t_AMPSSList* poAMPSSListPrev;
};
/*双向链表结构*/
struct _AMPSDList
{
unsigned char uchCount; /*结点个数*/
t_AMPSSList* poAMPSSListHead;
};
t_AMPSDList* DList_Init(t_AMPSDList** r_ppoDList);
int DList_Concat(t_AMPSDList** r_ppoDListSrc, t_AMPSDList* r_poDListDst);
t_AMPSSList* DList_Append(t_AMPSDList* list, void* r_pvData);
t_AMPSSList* DList_Prepend(t_AMPSDList* r_poDList, void* r_pvData);
void DList_PrependGivenNode(t_AMPSDList* r_poDList, void* r_pvData, t_AMPSSList* r_poSListNode);
void DList_AppendGivenNode(t_AMPSDList* r_poDList, void* r_pvData, t_AMPSSList* r_poSListNode);
t_AMPSSList* DList_Search(t_AMPSDList* r_poDList, AMPS_LListCompareLinkDataCallback r_pfAMPS_LListCompareCallback, void* r_pvData);
t_AMPSSList* DList_Find (t_AMPSDList* r_poDList, t_AMPSSList* r_poSListNode);
int DList_Remove(t_AMPSDList** r_ppoDList, t_AMPSSList* r_poSListNode, AMPS_LListRemoveLinkDataCallback r_pfAMPS_LListRemoveLinkDataCallback);
int DList_Sort(t_AMPSDList** r_ppoDList, AMPS_LListCompareLinkDataCallback r_pfAMPS_LListCompareCallback);
void DList_SwapNodesData(t_AMPSSList* r_poNodeOne, t_AMPSSList* r_poNodeTwo);
int DList_RemoveFirstNode(t_AMPSDList** r_ppoDList, AMPS_LListRemoveLinkDataCallback AMPS_LListRemoveLinkDataCallback);
void DList_RemoveNthNode(t_AMPSDList** r_ppoDList, int r_nLocation, AMPS_LListRemoveLinkDataCallback AMPS_LListRemoveLinkDataCallback);
t_AMPSSList* DList_InsertAfter (t_AMPSDList* r_poDList, t_AMPSSList* r_poSListPositionNode, void* r_pvData);
t_AMPSSList* DList_InsertBefore (t_AMPSDList* r_poDList, t_AMPSSList* r_poSListPositionNode, void* r_pvData);
void DList_Free(t_AMPSDList** r_ppoDList, AMPS_LListRemoveLinkDataCallback AMPS_LListRemoveLinkDataCallback);
void DList_FreeEx(t_AMPSDList** r_ppoDList, AMPS_LListProcessCallback r_pfAMPS_LListProcessCallback, void* r_pvData);
void DList_FreeNodes(t_AMPSDList** r_ppoDList, AMPS_LListRemoveLinkDataCallback AMPS_LListRemoveLinkDataCallback);
void DList_Traverse(t_AMPSDList* r_poDList, AMPS_LListProcessCallback r_fpDList_ProcessCallback, void* r_pvArg);
int DList_RemoveWithOutFree(t_AMPSDList* r_poDList, t_AMPSSList* r_poSListNode);
int SList_RemoveWithOutFree(t_AMPSSList** r_ppoAMPSSListHead, t_AMPSSList* r_poAMPSSListNode);
void* DList_GetNthNode(t_AMPSDList* r_poAMPSDList, int r_nNodeLocation);
int DList_Copy(t_AMPSDList* r_poAMPSDListSrc, t_AMPSDList* r_poAMPSDListDest, AMPS_LListDuplicate r_pfAMPS_LListDuplicate);
int DList_RemoveFromData(t_AMPSDList* r_poDList, void* r_pvData, AMPS_LListRemoveLinkDataCallback r_pfAMPS_LListRemoveLinkDataCallback);
#ifdef __cplusplus
}
#endif
#endif /* __HEADER_AMPS_LINKLIST_H__ */
AMPS_LinkList.c
/*****************************************************************
文件名称: AMPS_LinkList.c
功能描述: 链表操作API函数(单向链表和双向链表)
*****************************************************************/
#include "AMPS_LinkList.h"
#include "AMPS_MemMgt.h"
/*****************************************************************
函数名称: DList_Init
功能描述: 双向链表初始化
入参::
t_AMPSDList** new_list 原链表
出参:
NA
返回值:
t_AMPSDList* 原链表
*****************************************************************/
t_AMPSDList* DList_Init(t_AMPSDList** new_list)
{
*new_list = AMPS_InternalMalloc(sizeof(t_AMPSDList));
if (*new_list != NULL)
{
(*new_list)->uchCount = 0;
(*new_list)->poAMPSSListHead = NULL;
}
return *new_list;
}
/*****************************************************************
函数名称: DList_Concat
功能描述: 连接两个双向链表
入参::
t_AMPSDList** src 链表1
t_AMPSDList* dst 链表2
出参:
t_AMPSDList** src 连接后的链表
返回值:
int
*****************************************************************/
int DList_Concat(t_AMPSDList** src, t_AMPSDList* dst)
{
/*使用单向链表连接函数*/
if (AMPS_SUCCESS != SList_Concat(&(*src)->poAMPSSListHead, dst->poAMPSSListHead))
{
return AMPS_ERROR_FAILURE;
}
/*目的链表结点个数*/
(*src)->uchCount += dst->uchCount;
AMPS_InternalFree(dst);
return AMPS_SUCCESS;
}
/*****************************************************************
函数名称: DList_Append
功能描述: 向双向链表中追加结点
入参::
t_AMPSDList** src 原链表
void* pvData 待追加结点
出参:
NA
返回值:
t_AMPSDList** src 追加后的链表
*****************************************************************/
t_AMPSSList* DList_Append(t_AMPSDList* list, void* pvData)
{
t_AMPSSList *new_list = NULL; // pointer to newly created node
t_AMPSSList *last = NULL; // pointer to last node of link list
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 = NULL;
new_list->poAMPSSListPrev = NULL;
if (list_ptr)
{
/*找到结尾*/
last = SList_Last(list_ptr);
if (NULL == last)
{
AMPS_InternalFree(new_list);
return NULL;
}
/*增加结点*/
last->poAMPSSListNext = new_list;
new_list->poAMPSSListPrev = last;
} else
{
list->poAMPSSListHead = new_list;
}
/*结点个数加1*/
list->uchCount += 1;
return new_list;
}
/*****************************************************************
函数名称: DList_Prepend
功能描述: 向双向链表中前向插入结点
入参::
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_InternalFree(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");
return AMPS_ERROR_FAILURE;
}
if (func_ptr)
{
if (AMPS_ERROR_FAILURE == func_ptr(&(node->pvData)))
{
return AMPS_ERROR_FAILURE;
}
}
/*删除头结点*/
if (NULL != node->poAMPSSListNext)
{
(*list)->poAMPSSListHead = node->poAMPSSListNext;
(*list)->poAMPSSListHead->poAMPSSListPrev = NULL;
} else
{
(*list)->poAMPSSListHead = NULL;
}
(*list)->uchCount--;
AMPS_InternalFree(node);
return AMPS_SUCCESS;
}
return AMPS_SUCCESS;
}
/*****************************************************************
函数名称: DList_RemoveFirstNode
功能描述: 删除双向链表中指定位置的结点
入参::
t_AMPSDList* list 原链表
int r_nNodeLocation 指定的结点位置
AMPS_LListRemoveLinkDataCallback func_ptr 结点操作函数回调
出参:
t_AMPSDList** 操作后的链表
返回值:
int
*****************************************************************/
void DList_RemoveNthNode(t_AMPSDList** r_ppoDList, int r_nNodeLocation, AMPS_LListRemoveLinkDataCallback AMPS_LListRemoveLinkDataCallback)
{
t_AMPSSList* poSList = (*r_ppoDList)->poAMPSSListHead;
t_AMPSSList* poSListTemp1 = NULL;
t_AMPSSList* poSListTemp2 = NULL;
if(!poSList)
{
return;
}
if(r_nNodeLocation < (*r_ppoDList)->uchCount)
{
int nLocation = 0;
/*遍历链表*/
for(poSListTemp1 = poSList; poSListTemp1; )
{
if(nLocation == r_nNodeLocation)
{
//AMPS_LListRemoveLinkDataCallback(poSListTemp1->pvData, r_pvArg);
break;
}
poSListTemp2 = poSListTemp1->poAMPSSListNext;
poSListTemp1 = poSListTemp2;
nLocation++;
}
}
return;
}
/*****************************************************************
函数名称: DList_RemoveFirstNode
功能描述: 在双向链表指定结点后插入一个新结点
入参::
t_AMPSDList* list 原链表
t_AMPSSList *positionNode 指定的结点
t_AMPSSList *positionNode 待插入的新结点数据
出参:
NA
返回值:
t_AMPSDList* 操作后的链表
*****************************************************************/
t_AMPSSList* DList_InsertAfter (t_AMPSDList *list, t_AMPSSList *positionNode, t_AMPSSList *positionNode)
{
t_AMPSSList *pNewNode = NULL;
t_AMPSSList *pPosNode = positionNode;
if (NULL == positionNode)
{
//printfdlist_insertafter: input parameters are invalid \n");
return NULL;
}
/*构造新结点*/
pNewNode = AMPS_InternalMalloc(sizeof(t_AMPSSList));
pNewNode->pvData = pvData;
/*把新结点连接到指定结点之后*/
pNewNode->poAMPSSListNext = pPosNode->poAMPSSListNext;
pNewNode->poAMPSSListPrev = pPosNode;
/*断开指定结点与之前结点(向后)的连接,并指向新结点*/
if (NULL != pPosNode->poAMPSSListNext)
pPosNode->poAMPSSListNext->poAMPSSListPrev = pNewNode;
pPosNode->poAMPSSListNext = pNewNode;
list->uchCount++;
return pNewNode;
}
/*****************************************************************
函数名称: DList_RemoveFirstNode
功能描述: 在双向链表指定结点前插入一个新结点
入参::
t_AMPSDList* list 原链表
t_AMPSSList *positionNode 指定的结点
t_AMPSSList *positionNode 待插入的新结点数据
出参:
NA
返回值:
t_AMPSDList* 操作后的链表
*****************************************************************/
t_AMPSSList* DList_InsertBefore (t_AMPSDList *list, t_AMPSSList *positionNode, void *pvData)
{
t_AMPSSList *pNewNode = NULL;
t_AMPSSList *pPosNode = positionNode;
if (NULL == positionNode)
{
//printf("DList_InsertAfter: input parameters are invalid \n");
return NULL;
}
pNewNode = AMPS_InternalMalloc(sizeof(t_AMPSSList));
pNewNode->pvData = pvData;
pNewNode->poAMPSSListPrev = pPosNode->poAMPSSListPrev;
pNewNode->poAMPSSListNext = pPosNode;
if (NULL != pPosNode->poAMPSSListPrev)
pPosNode->poAMPSSListPrev->poAMPSSListNext = pNewNode;
pPosNode->poAMPSSListPrev = pNewNode;
list->uchCount++;
return pNewNode;
}
/*****************************************************************
函数名称: DList_Free
功能描述: 释放双向链表
入参::
t_AMPSDList** list 原链表
AMPS_LListRemoveLinkDataCallback func_ptr 结点操作回调
出参:
t_AMPSDList** 操作后的链表
返回值:
NA
*****************************************************************/
void DList_Free(t_AMPSDList **list, AMPS_LListRemoveLinkDataCallback func_ptr)
{
t_AMPSDList* dlist = *list;
t_AMPSSList *list_ptr = NULL;
if (NULL != dlist)
{
list_ptr = dlist->poAMPSSListHead;
}
/*使用单向链表释放函数*/
SList_Free(&list_ptr, func_ptr);
AMPS_InternalFree(dlist);
dlist = NULL;
}
/*****************************************************************
函数名称: DList_Free
功能描述: 释放双向链表(释放前可对结点进行操作)
入参::
t_AMPSDList** list 原链表
AMPS_LListRemoveLinkDataCallback func_ptr
void* r_pvData 回调函数参数
出参:
t_AMPSDList** 操作后的链表
返回值:
NA
*****************************************************************/
void DList_FreeEx(t_AMPSDList** r_ppoDList, AMPS_LListProcessCallback r_pfAMPS_LListProcessCallback, void* r_pvData)
{
t_AMPSDList* dlist = *r_ppoDList;
t_AMPSSList *list_ptr = NULL;
if (NULL != dlist)
{
list_ptr = dlist->poAMPSSListHead;
}
SList_FreeEx(&list_ptr, r_pfAMPS_LListProcessCallback, r_pvData);
AMPS_InternalFree(dlist);
dlist = NULL;
}
/*****************************************************************
函数名称: DList_FreeNodes
功能描述: 释放双向链表结点
入参::
t_AMPSDList** list 原链表
AMPS_LListRemoveLinkDataCallback func_ptr
出参:
t_AMPSDList** 操作后的链表
返回值:
NA
*****************************************************************/
void DList_FreeNodes(t_AMPSDList **list, AMPS_LListRemoveLinkDataCallback func_ptr)
{
SList_Free(&(*list)->poAMPSSListHead, func_ptr);
(*list)->poAMPSSListHead = NULL;
(*list)->uchCount = 0;
}
/*****************************************************************
函数名称: DList_Traverse
功能描述: 遍历双向链表,在遍历中能过回调函数可对结点进行逐一处理
入参::
t_AMPSDList** list 原链表
AMPS_LListProcessCallback r_fpDList_ProcessCallback 结点处理函数
void* r_pvArg 回调函数参数
出参:
t_AMPSDList* 操作后的链表
返回值:
NA
*****************************************************************/
void DList_Traverse(t_AMPSDList* r_poDList, AMPS_LListProcessCallback r_fpDList_ProcessCallback, void* r_pvArg)
{
t_AMPSSList* poSList = r_poDList->poAMPSSListHead;
t_AMPSSList* poSListTemp1 = NULL;
t_AMPSSList* poSListTemp2 = NULL;
if(!poSList)
{
return;
}
for(poSListTemp1 = poSList; poSListTemp1; )
{
poSListTemp2 = poSListTemp1->poAMPSSListNext;
r_fpDList_ProcessCallback(poSListTemp1->pvData, r_pvArg);
poSListTemp1 = poSListTemp2;
}
}
/*****************************************************************
函数名称: DList_RemoveWithOutFree
功能描述: 释放双向链表指定结点,但不释放各节点内容
入参::
t_AMPSDList* r_poDList 原链表
t_AMPSSList* r_poSListNode 指定的结点
出参:
返回值:
int
*****************************************************************/
int DList_RemoveWithOutFree(t_AMPSDList* r_poDList, t_AMPSSList* r_poSListNode)
{
if(AMPS_SUCCESS != SList_RemoveWithOutFree(&r_poDList->poAMPSSListHead, r_poSListNode))
{
return AMPS_ERROR_FAILURE;
}
r_poDList->uchCount--;
return AMPS_SUCCESS;
}
/*****************************************************************
函数名称: DList_PrependGivenNode
功能描述: 前向插入指定结点,并为结点赋值
入参::
t_AMPSDList* r_poDList 原链表
void* pvData 结点内容
t_AMPSSList* r_poSListNode 指定的结点,通常内容为空,在外层分配空间
出参:
返回值:
int
*****************************************************************/
void DList_PrependGivenNode(t_AMPSDList* r_poAMPSDList, void* pvData, t_AMPSSList* r_poAMPSSListNode)
{
t_AMPSSList* poAMPSSListHead = r_poAMPSDList->poAMPSSListHead;
r_poAMPSSListNode->pvData = pvData;
r_poAMPSSListNode->poAMPSSListNext = poAMPSSListHead;
r_poAMPSSListNode->poAMPSSListPrev = NULL;
if(NULL != poAMPSSListHead)
{
poAMPSSListHead->poAMPSSListPrev = r_poAMPSSListNode;
}
r_poAMPSDList->poAMPSSListHead = r_poAMPSSListNode;
r_poAMPSDList->uchCount += 1;
}
/*****************************************************************
函数名称: DList_AppendGivenNode
功能描述: 后向追加指定结点,并为结点赋值
入参::
t_AMPSDList* r_poDList 原链表
void* pvData 结点内容
t_AMPSSList* r_poSListNode 指定的结点,通常内容为空,在外层分配空间
出参:
返回值:
int
*****************************************************************/
void DList_AppendGivenNode(t_AMPSDList* r_poAMPSDList, void* pvData, t_AMPSSList* r_poAMPSSListNode)
{
t_AMPSSList *poAMPSSListLastNode = NULL; // pointer to last node of link list
t_AMPSSList* poAMPSSListHead = r_poAMPSDList->poAMPSSListHead;
r_poAMPSSListNode->pvData = pvData;
r_poAMPSSListNode->poAMPSSListNext = NULL;
r_poAMPSSListNode->poAMPSSListPrev = NULL;
if (poAMPSSListHead)
{
poAMPSSListLastNode = SList_Last(poAMPSSListHead);
if (poAMPSSListLastNode)
{
poAMPSSListLastNode->poAMPSSListNext = r_poAMPSSListNode;
r_poAMPSSListNode->poAMPSSListPrev = poAMPSSListLastNode;
}
} else
{
r_poAMPSDList->poAMPSSListHead = r_poAMPSSListNode;
}
r_poAMPSDList->uchCount += 1;
}
/*****************************************************************
函数名称: DList_GetNthNode
功能描述: 获取指定位置的结点
入参::
t_AMPSDList* poDList_i 原链表
int nNodeLocation_i 指定的位置
出参:
返回值:
void* 找到的结点指针
*****************************************************************/
void* DList_GetNthNode( t_AMPSDList* poDList_i, int nNodeLocation_i )
{
t_AMPSSList* poListNode = NULL;
t_AMPSSList* poLastListNode = NULL;
int nCurrentLocation = 1;
switch( nNodeLocation_i )
{
case 0: // first node
poListNode = poDList_i->poAMPSSListHead;
break;
case -1: // last node
poListNode = poDList_i->poAMPSSListHead;
poLastListNode = poListNode;
/*遍历找到最后一个结点,此处可用SList_Last*/
while( NULL != poListNode )
{
poLastListNode = poListNode;
poListNode = poListNode->poAMPSSListNext;
}
poListNode = poLastListNode;
break;
default: // node at location (1-based)
poListNode = poDList_i->poAMPSSListHead;
if( nNodeLocation_i > poDList_i->uchCount && nNodeLocation_i < 0 )
{
poListNode = NULL;
}
else
{
while( NULL != poListNode )
{
if( nCurrentLocation == nNodeLocation_i )
{
break;
}
nCurrentLocation++;
poListNode = poListNode->poAMPSSListNext;
}
}
}
return (poListNode);
}
/*****************************************************************
函数名称: DList_Copy
功能描述: 链表复制函数,在复制过程中可以处理结点,并将处理后的结点存放在
目标链表中
入参::
t_AMPSDList* pSrcList_i 原链表
t_AMPSDList* pDestList_i 目标链表
AMPS_LListDuplicate pfnDup_i 复制结点的回调函数
出参:
void* 找到的结点指针
返回值:
int
*****************************************************************/
int DList_Copy(t_AMPSDList* pSrcList_i, t_AMPSDList* pDestList_i, AMPS_LListDuplicate pfnDup_i)
{
int nRetVal = AMPS_SUCCESS;
void* pvDupData = NULL;
t_AMPSSList* poNode = NULL;
for( poNode = pSrcList_i->poAMPSSListHead; poNode != NULL; poNode = poNode->poAMPSSListNext )
{
pvDupData = (pfnDup_i)(poNode->pvData);
if( NULL == pvDupData )
{
nRetVal = AMPS_ERROR_FAILURE;
break;
}
AMPS_DListAppend( pDestList_i, pvDupData );
}
return (nRetVal);
}
/*****************************************************************
函数名称: DList_RemoveFromData
功能描述: 从双向链表中删除指定内容的结点
入参::
t_AMPSDList* pSrcList_i 原链表
void* pvData_i 指定的内容
AMPS_LListRemoveLinkDataCallback pfRemovDataCb_i 节点处理回调函数
出参:
返回值:
int
*****************************************************************/
int DList_RemoveFromData( t_AMPSDList* poDList_i, void* pvData_i, AMPS_LListRemoveLinkDataCallback pfRemovDataCb_i )
{
int nRetVal = AMPS_SUCCESS;
t_AMPSSList* poListNode = NULL;
for( poListNode = poDList_i->poAMPSSListHead; poListNode != NULL; poListNode = poListNode->poAMPSSListNext )
{
if( poListNode->pvData == pvData_i )
{
break;
}
}
if( NULL != poListNode )
{
nRetVal = AMPS_DListRemove( &poDList_i, poListNode, pfRemovDataCb_i );
}
else
{
nRetVal = AMPS_ERROR_FAILURE;
}
return (nRetVal);
}