⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 linklist.c

📁 多叉树实现
💻 C
📖 第 1 页 / 共 2 页
字号:
/****************************************************************************  Copyright (c) 2008 OCC, Inc.****  Project: Link List**  File:    linklist.c**  Author:  Michael**  Date:    10/31/2008****  Purpose:**    Api for link list.**************************************************************************//* Include files. */#include "linklist.h"/* Macro constant definitions. *//* Type definitions. *//* Local function declarations. *//* Macro API definitions. *//* Global variable declarations. *//****************************************************************************  Function Name: LinkListAddNode**  Purpose:**    Add a node to link list.**  Parameters:**    tLinkListNode *linkListNodeP - point to the node.**    eLinkListAddType addType - Add action type.**    void *dataP - Data of node to add.**    void *dataCreateFunP - Function for create the data of node.**  Return:**    None.**  Notes:**    We must have a parent node to record the header of link list.**    So you must use LinkListInitOrDestroy() to get a link list header.**************************************************************************/tLinkListNode *LinkListAddNode(tLinkListNode *linkListNodeP, eLinkListAddType addType,  void *dataCreateFunP, void *dataP){    tLinkListNode *newNodeP;    tLinkListNode *tmpNodeP;    /* We must have a parent node to record the header of link list. */    if ((dataCreateFunP == NULL) ||      ((linkListNodeP == NULL) && (addType != eLINK_LIST_ADD_TYPE_CREATE_HEARDER)))    {        return (NULL);    }    newNodeP = LinkListNodeCreate(dataCreateFunP, dataP);    if (newNodeP == NULL)    {        return (NULL);    }    switch (addType)    {        /* add young brother(next) node. */        case eLINK_LIST_ADD_TYPE_ADD_Y_BROTHER:            newNodeP->parentP = linkListNodeP->parentP;            newNodeP->oldBrotherP = linkListNodeP;            newNodeP->youngBrotherP = linkListNodeP->youngBrotherP;            /* current node has a young brother node. */            if (linkListNodeP->youngBrotherP != NULL)            {                linkListNodeP->youngBrotherP->oldBrotherP = newNodeP;            }            break;        /* add old brother(previous) node. */        case eLINK_LIST_ADD_TYPE_ADD_O_BROTHER:            newNodeP->parentP = linkListNodeP->parentP;            newNodeP->oldBrotherP = linkListNodeP->oldBrotherP;            newNodeP->youngBrotherP = linkListNodeP;            linkListNodeP->oldBrotherP = newNodeP;            /*            **  if current node is the first node of his list.And now            **  add a new node to be his old brother,modify his parent            **  node's child node pointer.            */            if ((linkListNodeP->oldBrotherP == NULL) &&              (linkListNodeP->parentP != NULL))            {                linkListNodeP->parentP->childP = newNodeP;            }            break;        /* add child node. */        case eLINK_LIST_ADD_TYPE_ADD_CHILD:            newNodeP->parentP = linkListNodeP;            tmpNodeP = linkListNodeP->childP;            if (tmpNodeP != NULL)            {                /*                **  current node have child node(s),add to                **  the youngest one.                */                for (;;tmpNodeP = tmpNodeP->youngBrotherP)                {                    if (tmpNodeP->youngBrotherP == NULL)                    {                        break;                    }                }                newNodeP->oldBrotherP = tmpNodeP;                newNodeP->youngBrotherP = NULL;                tmpNodeP->youngBrotherP = newNodeP;            }            else            {                /* current node have no child node. */                newNodeP->oldBrotherP = NULL;                newNodeP->youngBrotherP = NULL;            }            break;        case eLINK_LIST_ADD_TYPE_CREATE_HEARDER:            /* for init to creat a link list header node. */;            break;        default:            return (NULL);            break;    }    return (newNodeP);} /* End of LinkListAddNode() *//****************************************************************************  Function Name: LinkListNodeCreate**  Purpose:**    Create a link list node.**  Parameters:**    void *dataCreateFunP - Function for create the data of node.**    void *dataP - the data of new node.**  Return:**    None.**  Notes:**    None.**************************************************************************/tLinkListNode *LinkListNodeCreate(void *dataCreateFunP, void *dataP){    eOsRet ret;    tLinkListNode *newNodeP;    if (!dataCreateFunP)    {        return (NULL);    }    newNodeP = MEMALLOC(sizeof(tLinkListNode));    if (newNodeP == NULL)    {        PRINTF("Alloc memory for link list node failed.\n");        return (NULL);    }    memset (newNodeP, MEM_SET_DEFAULT_VALUE, sizeof(tLinkListNode));    (*(DataCreateFunP)dataCreateFunP)(newNodeP, dataP);    if (newNodeP->dataP == NULL)    {        MEMFREE(newNodeP);        return (NULL);    }    newNodeP->childP = NULL;    return (newNodeP);} /* End of LinkListNodeCreate() *//****************************************************************************  Function Name: LiniListNodeDelete**  Purpose:**    Delete a link list node.**  Parameters:**    tLinkListNode *deleteNodeP - Pointe to the node that will be delete.**    void *dataDeleteFunP - Function for delete the data of node.**  Return:**    None.**  Notes:**    None.**************************************************************************/eOsRetLiniListNodeDelete(tLinkListNode *deleteNodeP, void *dataDeleteFunP){    eOsRet ret;    ASSERT_POINTER(deleteNodeP);    ASSERT_POINTER(dataDeleteFunP);    if (deleteNodeP->childP != NULL)    {        ret = LinkListDelete(deleteNodeP->childP, dataDeleteFunP);        ASSERT_RETURN(ret);    }    /*    **  if current node has a old brother.then his old brother's young     **  brother pointer point to his young brother.    **  if current node has no old brother.point his parent's child pointer    **  point to his young brother.and set his young brother's old brother    **  pointer to NULL.    */    if (deleteNodeP->oldBrotherP != NULL)    {        deleteNodeP->oldBrotherP->youngBrotherP = deleteNodeP->youngBrotherP;    }    else if (deleteNodeP->parentP != NULL)    {        deleteNodeP->parentP = deleteNodeP->youngBrotherP;        if (deleteNodeP->youngBrotherP != NULL)        {            deleteNodeP->youngBrotherP->oldBrotherP = NULL;        }    }    /* delete data of current node. */    ret = (*(DataDeleteFunP)dataDeleteFunP)(deleteNodeP);    ASSERT_RETURN(ret);    /* free current node. */    MEMFREE(deleteNodeP);    return (eOS_RET_SUCCESS);} /* End of LiniListNodeDelete() *//****************************************************************************  Function Name: LinkListDelete**  Purpose:**    Destroy a link list node.**  Parameters:**    tLinkListNode *linkListNodeP - Point to link list header.**    void *dataDeleteFunP - Function for delete the data of node.**  Return:**    None.**  Notes:**    None.**************************************************************************/eOsRetLinkListDelete(tLinkListNode *linkListNodeP, void *dataDeleteFunP){    eOsRet ret;    ASSERT_POINTER(linkListNodeP);    /* Delete brother node. */    if (linkListNodeP->youngBrotherP != NULL)    {        ret = LinkListDelete(linkListNodeP->youngBrotherP, dataDeleteFunP);        ASSERT_RETURN(ret);    }    /* Delete child node. */    if (linkListNodeP->childP != NULL)    {        LinkListDelete(linkListNodeP->childP, dataDeleteFunP);        ASSERT_RETURN(ret);    }    /* Delete itself. */    ret = LiniListNodeDelete(linkListNodeP, dataDeleteFunP);    ASSERT_RETURN(ret);    return (eOS_RET_SUCCESS);} /* End of LinkListDelete() *//****************************************************************************  Function Name: LinkListNodeDump**  Purpose:**    Dump link list node.**  Parameters:**    tLinkListNode *linkListNodeP - Pointer to the link list node to dump.**    void *dataDumpFunP - Function for dump the data of node.**  Return:**    None.**  Notes:**    None.**************************************************************************/eOsRetLinkListNodeDump(tLinkListNode *linkListNodeP, void *dataDumpFunP){    ASSERT_POINTER(linkListNodeP);    ASSERT_POINTER(dataDumpFunP);    (*(DataDumpFunP)dataDumpFunP)(linkListNodeP->dataP);    return (eOS_RET_SUCCESS);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -