AMPS:单向链表源码解读
来源:互联网 发布:淘宝日韩女装店铺推荐 编辑:程序博客网 时间:2024/06/07 04:13
像单向链表、双向链表、堆、栈等这些基本的数据结构在大型软件中均有很广泛的使用,所以今天看一下AMPS中单向链表的操作函数库,其定义了单向链表的非常多的操作API,且提供了回调函数接口,从而使链表结构用于不同类型的结点,且可以使用户自定义的函数来实现链表排序、结点操作。所以这部分的代码可以做为常用的工具代码,可以在其他项目中广泛应用。
先看看AMPS提供的单链表操作接口有哪些?如下,由函数名称就可以看出,有非常丰富的函数。
最后,看一下单向链表的实现源代码:
AMPS_LinkList.h
#ifndef __HEADER_AMPS_LINKLIST_H__#define __HEADER_AMPS_LINKLIST_H__#ifdef __cplusplusextern "C"{#endif#include "AMPS_API.h"#include "AMPS_Defines.h"typedef struct _AMPSDList t_AMPSDList;struct _AMPSSList{void*pvData;t_AMPSSList*poAMPSSListNext;t_AMPSSList*poAMPSSListPrev;};int SList_InsertSortedPrepend(void** r_ppvList, void* r_pvKey, void* r_pvData, AMPS_LListCompareCallback r_pfAMPS_LListCompareCallback);int SList_InsertSortedAppend(void** r_ppvList, void* r_pvKey, void* r_pvData, AMPS_LListCompareCallback r_pfAMPS_LListCompareCallback);void SList_SortPrepend(void** r_ppvList, AMPS_LListCompareCallback r_pfAMPS_LListCompareCallback);void SList_SortAppend(void** r_ppvList, AMPS_LListCompareCallback r_pfAMPS_LListCompareCallback);int SList_Traverse(void* r_ppvList, AMPS_LListProcessCallback r_pfAMPS_LListProcessCallback, void* r_pvArg);int SList_Copy(void** r_ppvDest, void* r_pvSrc, AMPS_LListCompareCallback r_pfAMPS_LListCompareCallback, AMPS_LListCloneCallback r_pfAMPS_LListCloneCallback);int SList_RemoveKey(void** r_ppvList, void* r_pvData, AMPS_LListCompareCallback r_pfAMPS_LListCompareCallback);void* SList_FindData (void* r_pvList, void* r_pvData);void* SList_GetNextNode(void* r_pvList);void* SList_GetNodeData(void* r_pvNode);void SList_AppendGivenNode(void** r_ppvList, void* r_pvSListNode);void SList_PrependGivenNode(void** r_ppvList, void* r_pvGivenNode, void* r_pvNewNode);t_AMPSSList* SList_Prepend(t_AMPSSList** r_ppoSList, void* r_pvData);t_AMPSSList* SList_AppendEx(t_AMPSSList** r_ppoSList, void* r_pvData);int SList_Append(void** r_ppvList, void* r_pvData, AMPS_LListCompareCallback r_pfAMPS_LListCompareCallback);t_AMPSSList* SList_Last(t_AMPSSList* r_poSList);void* SList_Alloc(void* r_pvData);t_AMPSSList* SList_Search(t_AMPSSList* r_poSList, AMPS_LListCompareLinkDataCallback r_pfAMPS_LListCompareCallback, void* r_pvSrcData);t_AMPSSList* SList_Find (t_AMPSSList* r_poSList, t_AMPSSList* r_poSListNode);int SList_Remove(t_AMPSSList** r_ppoSList, t_AMPSSList* r_poSListNode, AMPS_LListFreeLinkDataCallback r_pfAMPS_LListFreeLinkDataCallback);int SList_Free(t_AMPSSList** r_ppoSList, AMPS_LListFreeLinkDataCallback r_pfAMPS_LListFreeLinkDataCallback);int SList_FreeEx(t_AMPSSList** r_ppoSList, AMPS_LListProcessCallback r_pfAMPS_LListProcessCallback, void* r_pvData);unsigned int SList_Count(const t_AMPSSList* r_cpoSList);int SList_Concat(t_AMPSSList** r_ppoSListSrc, t_AMPSSList* r_poSListDst);#ifdef __cplusplus}#endif#endif /* __HEADER_AMPS_LINKLIST_H__ */
AMPS_LinkList.c
/*****************************************************************文件名称: AMPS_LinkList.c功能描述: 链表操作API函数(单向链表和双向链表)*****************************************************************/#include "AMPS_LinkList.h"#include "AMPS_MemMgt.h"/*****************************************************************函数名称: SList_Append功能描述: 在链表后追加结点入参:: void **list 原链表 void* pvData 待追加的结点 AMPS_LListCompareCallback compare 链表比较回调,此函数中没有使用出参: void **list 追加后的链表返回值: int*****************************************************************/int SList_Append(void **list, void* pvData, AMPS_LListCompareCallback compare){t_AMPSSList** slist = (t_AMPSSList**)list;{t_AMPSSList *new_list = NULL; // pointer to newly created nodet_AMPSSList *last = NULL; // pointer to last node of link 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 nodet_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; // pointer to newly created nodet_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_SMALLER == 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_SortPrepend功能描述: 链表排序入参:: void **list 原链表 AMPS_LListCompareCallback compare 结点比较回调函数,由调用者实现出参: void **list 排序后的链表返回值: void*****************************************************************/void SList_SortPrepend(void** list,AMPS_LListCompareCallback compare){ t_AMPSSList** slist = (t_AMPSSList**)list; t_AMPSSList *list_ptr = *slist; if (list_ptr){while (list_ptr){ t_AMPSSList* poAMPSSListNext = list_ptr->poAMPSSListNext; /*保存待删除结点的内容*/ void* pvData = list_ptr->pvData; /*从链表中删除结点*/ SList_Remove(slist,list_ptr,NULL); /*将已删除结点的内容插入到排序后的链表*/ SList_InsertSortedPrepend((void **)slist,NULL,pvData,compare); list_ptr = poAMPSSListNext; }}}/*****************************************************************函数名称: SList_SortAppend功能描述: 链表排序(严格递增)入参:: void **list 原链表 AMPS_LListCompareCallback compare 结点比较回调函数,由调用者实现出参: void **list 排序后的链表返回值: void*****************************************************************/void SList_SortAppend(void** list,AMPS_LListCompareCallback compare){ t_AMPSSList** slist = (t_AMPSSList**)list; t_AMPSSList *list_ptr = SList_Last(*slist); if (list_ptr){while (list_ptr){ t_AMPSSList* poAMPSSListPrev = list_ptr->poAMPSSListPrev; void* pvData = list_ptr->pvData; SList_Remove(slist,list_ptr,NULL); SList_InsertSortedAppend((void **)slist,NULL,pvData,compare); list_ptr = poAMPSSListPrev; }}}/*****************************************************************函数名称: SList_Traverse功能描述: 遍历并通过用户自定义的回调函数处理各结点入参:: void **list 原链表 AMPS_LListProcessCallback compare 结点处理回调函数,由调用者实现 void* arg 回调函数参数出参: void **list 处理之后的链表返回值: int*****************************************************************/int SList_Traverse(void* list,AMPS_LListProcessCallback func,void* arg){ t_AMPSSList *slist = (t_AMPSSList*)list,*tempList = NULL; if(!slist) { return 0; } for(tempList = slist;tempList;tempList = tempList->poAMPSSListNext) { func(tempList->pvData,arg); } return 0; }/*****************************************************************函数名称: SList_Traverse功能描述: 复制一份原链表,在复制过程中可以处理各结点,以实现对于不同类型 结点的操作。入参:: void** dest 目标链表 void* src 源链表 AMPS_LListCompareCallback compare 结点比较回调,没有使用 AMPS_LListCloneCallback clone 结点处理函数回调出参: void** dest 处理之后的链表返回值: int*****************************************************************/int SList_Copy(void** dest,void* src,AMPS_LListCompareCallback compare,AMPS_LListCloneCallback clone){ t_AMPSSList* srcList = (t_AMPSSList*)src; void* pvData; if(!srcList) { return 0; } for(;srcList;srcList = srcList->poAMPSSListNext) { /*逐一处理各结点,比如结点数据为char*,则需要strcpy,如为int,直接赋值*/ pvData = clone(srcList->pvData); /*将处理后的结点插入目标链表,最后,两链表长度相同,但结点内容可以不同*/ SList_Append(dest,pvData,NULL); } return 0;}/*****************************************************************函数名称: SList_AppendEx功能描述: 向链表后追加结点,返回最终链表入参:: t_AMPSSList** list 原链表 void* pvData 待追加结点出参: NA返回值: t_AMPSSList* 处理之后的链表*****************************************************************/t_AMPSSList* SList_AppendEx(t_AMPSSList** list, void* pvData){t_AMPSSList** slist = (t_AMPSSList**)list;t_AMPSSList* new_list = NULL; // pointer to newly created nodet_AMPSSList* last = NULL; // pointer to last node of link list t_AMPSSList* list_ptr = *slist;new_list = SList_Alloc(pvData);if(NULL == new_list){return NULL;}if(list_ptr){last = SList_Last(list_ptr);if(NULL == last){free(new_list);return NULL;}last->poAMPSSListNext = new_list;new_list->poAMPSSListPrev = last;}else{*slist = new_list;}return new_list;}/*****************************************************************函数名称: SList_Prepend功能描述: 向链表头追加结点,返回最终链表入参:: t_AMPSSList** list 原链表 void* pvData 待追加结点出参: NA返回值: t_AMPSSList* 处理之后的链表*****************************************************************/t_AMPSSList* SList_Prepend(t_AMPSSList **list, void* pvData){ t_AMPSSList *new_list = NULL; t_AMPSSList *list_ptr = *list; new_list = (t_AMPSSList*)SList_Alloc(pvData); if (NULL == new_list) { return NULL; } new_list->poAMPSSListNext = list_ptr; new_list->poAMPSSListPrev = NULL; if (list_ptr) { list_ptr->poAMPSSListPrev = new_list; } *list = new_list; return new_list;}/*****************************************************************函数名称: SList_Last功能描述: 查找链表结尾入参:: t_AMPSSList** list 原链表出参: NA返回值: t_AMPSSList* 处理之后的链表*****************************************************************/t_AMPSSList* SList_Last(t_AMPSSList *list){/* if (NULL != list) {*/ if (list) { while (list->poAMPSSListNext) { list = list->poAMPSSListNext; } } //} return list;}/*****************************************************************函数名称: SList_Alloc功能描述: 分配新的链表结点,并赋值入参:: void* pvData 结点出参: NA返回值: void* 处理之后的链表*****************************************************************/void* SList_Alloc(void* pvData){ t_AMPSSList* new_list = NULL; new_list = AMPS_InternalMalloc(sizeof(t_AMPSSList));if(NULL == new_list){printf("=>>>>>>>>>>>>>>>>>>>>> malloc failed.\n\n\n\n\n\n\n\n");return NULL;}new_list->pvData = pvData;new_list->poAMPSSListNext = NULL;new_list->poAMPSSListPrev = NULL; return (void*)new_list;}/*****************************************************************函数名称: SList_RemoveKey功能描述: 删除链表中的指定结点入参:: void** list 原链表 void* pvData 待删除结点 AMPS_LListCompareCallback compare 结点比较回调函数出参: void** list返回值: int*****************************************************************/int SList_RemoveKey(void** list,void* pvData,AMPS_LListCompareCallback compare){t_AMPSSList** slist = (t_AMPSSList**)list; t_AMPSSList *list_ptr = (t_AMPSSList*)*slist; while (list_ptr) { /*使用用户自定义的回调函数比较结点,相等,则从链表中删除*/ if (AMPS_LLIST_KEYS_ARE_EQUAL == compare(list_ptr->pvData,pvData)) { SList_Remove(slist, (void*)list_ptr, NULL); break; } list_ptr = list_ptr->poAMPSSListNext; } return 0;}/*****************************************************************函数名称: SList_Search功能描述: 在链表中查找符合条件的结点入参:: t_AMPSSList *list 原链表 AMPS_LListCompareCallback func_ptr 结点查找回调函数 void *src_data 指定的查找条件出参: void** list返回值: t_AMPSSList* 找到的结点指针*****************************************************************/t_AMPSSList* SList_Search (t_AMPSSList *list, AMPS_LListCompareLinkDataCallback func_ptr, void *src_data){ while (list) { if (!func_ptr(src_data, list->pvData)) { break; } list = list->poAMPSSListNext; } return list;}/*****************************************************************函数名称: SList_Find功能描述: 在链表中查找指定的结点入参:: t_AMPSSList *list 原链表 t_AMPSSList *node 指定的结点出参: t_AMPSSList *list返回值: t_AMPSSList* 找到的结点指针*****************************************************************/t_AMPSSList* SList_Find (t_AMPSSList *list, t_AMPSSList *node){ while (list) { if (list == node) { return list; } list = list->poAMPSSListNext; } return NULL;}/*****************************************************************函数名称: SList_Find功能描述: 在链表中查找指定的结点内容入参:: void *list 原链表 void *pvData 指定的结点内容出参: t_AMPSSList *list返回值: void* 找到的结点指针*****************************************************************/void* SList_FindData (void *list, void *pvData){t_AMPSSList *slist = (t_AMPSSList*)list;while (slist){if (slist->pvData == pvData){return slist;}slist = slist->poAMPSSListNext;}return NULL;}/*****************************************************************函数名称: SList_Free功能描述: 释放链表入参:: void *list 原链表 AMPS_LListFreeLinkDataCallback func_ptr 结点处理回调函数,如果结点 的内存需要显式释放,使用此函数达到目的。出参: t_AMPSSList *list返回值: int*****************************************************************/int SList_Free(t_AMPSSList **list, AMPS_LListFreeLinkDataCallback func_ptr){ t_AMPSSList *curr = NULL; // pointer to current node t_AMPSSList *poAMPSSListPrev = NULL; // pointer to previous node curr = *list; while (curr) { poAMPSSListPrev = curr; curr = (t_AMPSSList*)curr->poAMPSSListNext; if (func_ptr) { /*释放结点*/ if (func_ptr(&(poAMPSSListPrev->pvData))) { return AMPS_ERROR_FAILURE; } } /*if (poAMPSSListPrev->pvData) { AMPS_InternalFree(poAMPSSListPrev->pvData); }*/ AMPS_InternalFree(poAMPSSListPrev); } *list = NULL; return AMPS_SUCCESS;}/*****************************************************************函数名称: SList_FreeEx功能描述: 释放链表入参:: void *list 原链表 AMPS_LListFreeLinkDataCallback func_ptr 结点处理回调函数,如果结点 的内存需要显式释放,使用此函数达到目的。 void* r_pvData 回调函数入参,通过它可以进行在释放前的一些结点操作出参: t_AMPSSList *list返回值: int*****************************************************************/int SList_FreeEx(t_AMPSSList **list, AMPS_LListProcessCallback func_ptr, void* r_pvData){t_AMPSSList *curr = NULL; // pointer to current node t_AMPSSList *poAMPSSListPrev = NULL; // pointer to previous node curr = *list;while (curr){poAMPSSListPrev = curr;curr = (t_AMPSSList*)curr->poAMPSSListNext;if (func_ptr){func_ptr(poAMPSSListPrev->pvData, r_pvData);}AMPS_InternalFree(poAMPSSListPrev);}*list = NULL;return AMPS_SUCCESS;}/*****************************************************************函数名称: SList_FreeEx功能描述: 删除链表中指定的结点入参:: t_AMPSSList **list 原链表 t_AMPSSList *node 待删除结点 AMPS_LListFreeLinkDataCallback func_ptr 结点处理回调函数,如果结点 的内存需要显式释放,使用此函数达到目的。出参: t_AMPSSList *list返回值: int*****************************************************************/int SList_Remove(t_AMPSSList **list, t_AMPSSList *node, AMPS_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 = snode;}/*****************************************************************函数名称: SList_AppendGivenNode功能描述: 在指定的结点后插入指定新结点入参:: void **list 原链表 void* givenNode 指定的结点 void* newNode 待插入结点出参: void **list返回值: void *****************************************************************/void SList_PrependGivenNode(void **list, void* givenNode, void* newNode){t_AMPSSList **slist = (t_AMPSSList**)list;t_AMPSSList* node_ptr = (t_AMPSSList*)givenNode; t_AMPSSList* snode = (t_AMPSSList*)newNode;if(!node_ptr){ *slist = snode; return;}snode->poAMPSSListNext = node_ptr;snode->poAMPSSListPrev = node_ptr->poAMPSSListPrev;if(NULL == node_ptr->poAMPSSListPrev){*slist = snode;}else{ node_ptr->poAMPSSListPrev->poAMPSSListNext = snode;}node_ptr->poAMPSSListPrev = snode;}/*****************************************************************函数名称: SList_RemoveWithOutFree功能描述: 删除链表中指定的结点,但不释放结点内容入参:: t_AMPSSList** r_ppoAMPSSListHead 原链表 t_AMPSSList* r_poAMPSSListNode 待删除结点 出参: t_AMPSSList** r_ppoAMPSSListHead返回值: int*****************************************************************/int SList_RemoveWithOutFree(t_AMPSSList** r_ppoAMPSSListHead, t_AMPSSList* r_poAMPSSListNode){if((NULL == r_ppoAMPSSListHead) || (NULL == *r_ppoAMPSSListHead) || (NULL == r_poAMPSSListNode)) { return AMPS_ERROR_FAILURE; } /*待删除结点为头结点*/ // If first element is found to be the element to be deleted if(NULL == r_poAMPSSListNode->poAMPSSListPrev) { if(*r_ppoAMPSSListHead != r_poAMPSSListNode) { printf("SList_RemoveWithOutFree: list corrupted: head's previous pointer is NULL but node is not the first element in the list\n"); return AMPS_ERROR_FAILURE; } *r_ppoAMPSSListHead = r_poAMPSSListNode->poAMPSSListNext; if(NULL != *r_ppoAMPSSListHead) // Is the last element in the list deleted?{ (*r_ppoAMPSSListHead)->poAMPSSListPrev = NULL;} }else{r_poAMPSSListNode->poAMPSSListPrev->poAMPSSListNext = r_poAMPSSListNode->poAMPSSListNext;if(NULL != r_poAMPSSListNode->poAMPSSListNext){r_poAMPSSListNode->poAMPSSListNext->poAMPSSListPrev = r_poAMPSSListNode->poAMPSSListPrev;}}r_poAMPSSListNode->poAMPSSListNext = NULL;r_poAMPSSListNode->poAMPSSListPrev = NULL;return AMPS_SUCCESS;}/*****************************************************************函数名称: SList_GetNextNode功能描述: 取链表下一结点入参:: void* list 原链表 出参: t_AMPSSList** r_ppoAMPSSListHead返回值: void* list*****************************************************************/void* SList_GetNextNode(void* list){ t_AMPSSList *slist = (t_AMPSSList*)list;if(!slist){ return NULL;}return slist->poAMPSSListNext;}/*****************************************************************函数名称: SList_GetNodeData功能描述: 取指定结点内容入参:: void* node 原链表 出参: NA返回值: void* 结点内容*****************************************************************/void* SList_GetNodeData(void* node){ t_AMPSSList *slist = (t_AMPSSList*)node;if(!slist){ return NULL;}return slist->pvData;}
- AMPS:单向链表源码解读
- AMPS:双向链表源码解读
- AMPS:队列源码解读
- AMPS:堆源码解读
- AMPS:哈希表源码解读
- AMPS:Trace模块源码解读
- AMPS:字符串操作源码解读
- AMPS:MD5模块源码解读
- AMPS:AES模块源码解读
- AMPS:日志模块源码解读
- AMPS:Cache模块源码解读
- AMPS:定时器模块源码解读
- AMPS:数据库访问模块源码解读
- AMPS:MySQL数据库操作模块源码解读
- AMPS:Oracle数据库操作模块源码解读
- AMPS:内存管理模块源码解读(一)
- AMPS:内存管理模块源码解读(二)
- 链表源码之单向链表
- JS 的OOP 模式 还算可以模仿
- hibernate中不能解析hbm.xml的问题
- java中判断字符串是否为数字的三种方法
- HTTP状态码大全
- VC调试方法大全
- AMPS:单向链表源码解读
- 数据存储之文件操作
- 数值数组与Object数组的关系
- WINDBG错误提示及处理
- 二叉树遍历(递归)
- POJ 2251(BFS)
- 0001_RegOpenKey,RegQueryValue,RegCloseKey
- umbraco学习2:Document Types
- ie下li标签中span加float:right不换行问题解决方案