现在的位置: 首页 > 综合 > 正文

AMPS:双向链表源码解读

2012年09月26日 ⁄ 综合 ⁄ 共 19426字 ⁄ 字号 评论关闭

  本节在上节单向链表的基础上看看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);
}

抱歉!评论已关闭.