📄 linklist.c
字号:
} /* End of LinkListNodeDump() *//**************************************************************************** Function Name: LinkListDump** Purpose:** Dump link list.** Parameters:** tLinkListNode *linkListNodeP - Point to the link list to dump.** void *dataDumpFunP - Function for dump the data of node.** Return:** None.** Notes:** None.**************************************************************************/eOsRetLinkListDump(tLinkListNode *linkListNodeP, void *dataDumpFunP){ eOsRet ret; ASSERT_POINTER(linkListNodeP); ASSERT_POINTER(dataDumpFunP); ret = LinkListNodeDump(linkListNodeP, dataDumpFunP); ASSERT_RETURN(ret); if (linkListNodeP->childP != NULL) { ret = LinkListDump(linkListNodeP->childP, dataDumpFunP); ASSERT_RETURN(ret); } if (linkListNodeP->childP != NULL) { ret = LinkListDump(linkListNodeP->youngBrotherP, dataDumpFunP); ASSERT_RETURN(ret); } return (eOS_RET_SUCCESS);} /* End of LinkListDump() *//**************************************************************************** Function Name: LinkListNodeFind** Purpose:** Find macth link list node.** Parameters:** tLinkListNode *linkListNodeP - point to the link list node.** void *datafindFunP - Function for compare the data of node.** void *dataP - point to the data for compare.** Return:** None.** Notes:** None.**************************************************************************/tLinkListNode *LinkListNodeFind(tLinkListNode *linkListNodeP, void *dataFindFunP, void *dataP){ eOsRet ret; if ((linkListNodeP == NULL) || (dataFindFunP == NULL)) { return (NULL); } ret = (*(DataFindFunP)dataFindFunP)(linkListNodeP->dataP, dataP); if (ret == eOS_RET_SUCCESS) { return (linkListNodeP); } else { return (NULL); }} /* End of LinkListNodeFind() *//**************************************************************************** Function Name: LinkListFind** Purpose:** Find macth link list node in specify link list.** Parameters:** tLinkListNode * linkListNodeP - Point to the link list.** void *dataFindFunP - Function for compare the data of node.** void * dataP - Point to the data for compare.** Return:** None.** Notes:** None.**************************************************************************/tLinkListNode *LinkListFind(tLinkListNode * linkListNodeP, void *dataFindFunP, void * dataP){ tLinkListNode *matchNodeP = NULL; tLinkListNode *findLinkListP = NULL; if ((linkListNodeP == NULL) || (dataFindFunP == NULL)) { return (NULL); } findLinkListP = linkListNodeP; /* compare itself. */ matchNodeP = LinkListNodeFind(findLinkListP, dataFindFunP, dataP); if (matchNodeP != NULL) { /* find match node.*/ return (matchNodeP); } /* find his young brother sub link list. */ if (linkListNodeP->youngBrotherP != NULL) { findLinkListP = linkListNodeP->youngBrotherP; matchNodeP = LinkListFind(findLinkListP, dataFindFunP, dataP); if (matchNodeP != NULL) { /* find match node.*/ return (matchNodeP); } } /* find his child sub link list. */ if (linkListNodeP->childP != NULL) { findLinkListP = linkListNodeP->childP; matchNodeP = LinkListFind(findLinkListP, dataFindFunP, dataP); if (matchNodeP != NULL) { /* find match node.*/ return (matchNodeP); } } /* Searched the whole list,Not find. */ return (NULL);} /* End of LinkListFind() *//**************************************************************************** Function Name: LinkListInitOrDestroy** Purpose:** Init or distroy a link list.** Parameters:** tLinkListHeader * linkListNodeP - Point to link list header.** Return:** None.** Notes:** After link list init,the operation of the header must be add child!!!**************************************************************************/eOsRetLinkListInitOrDestroy(tLinkListHeader *linkListHeaderP, void *dataOprtFunP){ eOsRet ret = eOS_RET_SUCCESS; if (linkListHeaderP == NULL) { int data = 0; *linkListHeaderP = LinkListAddNode(NULL, eLINK_LIST_ADD_TYPE_CREATE_HEARDER, dataOprtFunP, &data); if (*linkListHeaderP == NULL) { ret = eOS_RET_FAILURE; } } else { ret = LinkListDelete(*linkListHeaderP, dataOprtFunP); } return (ret);} /* End of LinkListInitOrDestroy() */#ifdef MIKETESTeOsRet DataCreateFun (tLinkListNode *newNodeP, void *dataP){ int * tmpDataP; tmpDataP = MEMALLOC(sizeof(uint32)); if (tmpDataP == NULL) { return (eOS_RET_FAILURE); } *tmpDataP = *(int *)dataP; newNodeP->dataP = tmpDataP; return (eOS_RET_SUCCESS);}eOsRet DataDeleteFun(tLinkListNode *deleteNodeP){ MEMFREE(deleteNodeP->dataP); return (eOS_RET_SUCCESS);}void DataDumpFun(void *dataP){ printf("## %d ##\n",*(int *)dataP);}eOsRet DataFindFun(void *linkNodeDataP, void *dataP){ if (*(int *)linkNodeDataP == *(int *)dataP) { return (eOS_RET_SUCCESS); } else { return (eOS_RET_FAILURE); }}intmain(int argc, char **argvPP){ tLinkListHeader *linkListHeaderP = NULL; tLinkListNode *linkListHeaderP1 = NULL; tLinkListNode *currentNodeP = NULL; tLinkListNode *tmpNodeP; eLinkListAddType addType; int indexI; int value; eOsRet ret; PRINTF("###\n"); value = 1; ret = LinkListInitOrDestroy(linkListHeaderP, DataCreateFun); ASSERT_RETURN(ret); linkListHeaderP1 = LinkListAddNode(linkListHeaderP, eLINK_LIST_ADD_TYPE_ADD_CHILD, DataCreateFun, &value); /* Add. */ PRINTF("###\n"); currentNodeP = linkListHeaderP->childP; for (indexI = eLINK_LIST_ADD_TYPE_ADD_Y_BROTHER; indexI < eLINK_LIST_ADD_TYPE_MAX; indexI++) { PRINTF("###\n"); value++; addType = (eLinkListAddType)indexI; currentNodeP = LinkListAddNode(currentNodeP, addType, DataCreateFun, &value); } /* Add. */ PRINTF("###\n"); currentNodeP = linkListHeaderP->childP; for (indexI = eLINK_LIST_ADD_TYPE_ADD_Y_BROTHER; indexI < eLINK_LIST_ADD_TYPE_MAX; indexI++) { PRINTF("###\n"); value++; addType = (eLinkListAddType)indexI; currentNodeP = LinkListAddNode(currentNodeP, addType, DataCreateFun, &value); } LinkListDump(linkListHeaderP, DataDumpFun); PRINTF("###\n"); /* find. */ value = 2; tmpNodeP = LinkListFind(linkListHeaderP, DataFindFun, &value); if (tmpNodeP == NULL) { PRINTF("###tmpNodeP == NULL\n"); } else { LinkListNodeDump(tmpNodeP, DataDumpFun); } PRINTF("###\n"); /* find. */ value = 4; tmpNodeP = LinkListFind(linkListHeaderP, DataFindFun, &value); if (tmpNodeP == NULL) { PRINTF("###tmpNodeP == NULL\n"); } else { LinkListNodeDump(tmpNodeP, DataDumpFun); LiniListNodeDelete(tmpNodeP, DataDeleteFun); PRINTF("###\n"); } PRINTF("###\n"); LinkListDump(linkListHeaderP, DataDumpFun); PRINTF("###\n"); LinkListInitOrDestroy(linkListHeaderP, DataDeleteFun); PRINTF("###\n"); return (0);}#endif /* MIKETEST */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -