亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? bintree.c

?? 《多任務下的數據結構》隨書的源代碼。探討多任務下的常用數據結構的實現
?? C
?? 第 1 頁 / 共 2 頁
字號:
/*
 * Copyright (c) 2000-2008
 * Author: Weiming Zhou
 *
 * Permission to use, copy, modify, distribute and sell this software
 * and its documentation for any purpose is hereby granted without fee,
 * provided that the above copyright notice appear in all copies and
 * that both that copyright notice and this permission notice appear
 * in supporting documentation.  
 */

#include <stdio.h>
#include <stdlib.h>
#include "CapiGlobal.h"
#include "BinTree.h"

/**	二叉搜索樹的創建函數

	@param	void - 無	
	@return	BINTREE * -成功返回創建的二叉樹指針,失敗返回NULL。	
*/
BINTREE *BinTree_Create(void)
{
    BINTREE *pBinTree;

    pBinTree = (BINTREE *)malloc(sizeof(BINTREE));
    if ( pBinTree != NULL )
    {
        pBinTree->pRoot = NULL;
        pBinTree->uNodeCount = 0;
    }
    return pBinTree;
}

/**	二叉搜索樹子樹釋放函數

	@param	BINTREEBASENODE *pRoot -子樹根節點指針	
	@param	DESTROYFUNC DestroyFunc - 數據釋放回調函數	
	@return	void - 無	
*/
void BinTreeBaseNode_Destroy(BINTREEBASENODE *pRoot, 
                             DESTROYFUNC DestroyFunc)
{
    if ( pRoot != NULL )
    {
        if ( pRoot->pLeft != NULL )
        {
            BinTreeBaseNode_Destroy(pRoot->pLeft, DestroyFunc);
        }
        if ( pRoot->pRight != NULL )
        {
            BinTreeBaseNode_Destroy(pRoot->pRight, DestroyFunc);
        }
        if ( DestroyFunc != NULL && pRoot->pData != NULL )
        {
            (*DestroyFunc)(pRoot->pData);
        }
        free(pRoot);
    }
}

/**	二叉搜索樹釋放函數

	@param	BINTREE *pBinTree - 二叉搜索樹指針	
	@param	DESTROYFUNC DestroyFunc - 數據釋放回調函數	
	@return	void - 無	
*/
void BinTree_Destroy(BINTREE *pBinTree, DESTROYFUNC DestroyFunc)
{
    if ( pBinTree == NULL )
    {
        return;
    }
    BinTreeBaseNode_Destroy(pBinTree->pRoot, DestroyFunc);
    free( pBinTree );
}

/**	二叉搜索樹增加節點函數,將指定數據插入到二叉樹中

	@param	BINTREE *pBinTree - 二叉搜索樹指針	
	@param	void *pData - 要增加的數據指針	
	@param	COMPAREFUNC CompareFunc - 數據比較函數	
	@return	INT - CAPI_SUCCESS表示成功,CAPI_FAILED表示失敗。	
*/
INT BinTree_Add(BINTREE *pBinTree, void *pData, COMPAREFUNC CompareFunc)
{
    BINTREEBASENODE *pNode;
    BINTREEBASENODE *pNewNode;
    INT         nRet = 0;

    if ( pBinTree == NULL || pData == NULL || CompareFunc == NULL )
    {
        return CAPI_FAILED;
    }

    pNode = pBinTree->pRoot;

    while ( pNode != NULL )
    {
        nRet = (*CompareFunc)(pNode->pData, pData);
        if ( nRet < 0 )
        {
            if ( pNode->pRight != NULL )
            {
                pNode = pNode->pRight;
                continue;
            }
        }
        else 
        {
            if ( pNode->pLeft != NULL )
            {
                pNode = pNode->pLeft;
                continue;
            }
        }
        break;
    }

    pNewNode = (BINTREEBASENODE *)malloc(sizeof(BINTREEBASENODE));
    if ( pNewNode == NULL )
    {
        return CAPI_FAILED;
    }
    pNewNode->pLeft = NULL;
    pNewNode->pRight = NULL;
    pNewNode->pData = pData;

    if ( pNode == NULL )
    {
        pBinTree->pRoot = pNewNode;
    }
    else 
    {
        if ( nRet < 0 )
        {
            pNode->pRight = pNewNode;
        }
        else
        {
            pNode->pLeft = pNewNode;
        }
    }
    pBinTree->uNodeCount += 1;
        
    return CAPI_SUCCESS;
}



/**	二叉搜索樹的查找函數

	@param	BINTREEBASENODE *pRoot - 二叉搜索樹的根節點指針	
	@param	void *pData - 要查找的數據指針	
	@param	COMPAREFUNC CompareFunc - 數據比較回調函數	
	@return	void * - 成功返回查找到的數據,失敗返回NULL。	
*/
void *BinTree_Find(BINTREEBASENODE *pRoot, void *pData, COMPAREFUNC CompareFunc)
{
    BINTREEBASENODE *pNode;
    
    pNode = pRoot;
    
    while ( pNode != NULL )
    {
        INT nRet = (*CompareFunc)(pNode->pData, pData);
        if ( nRet < 0 )
        {
            pNode = pNode->pRight;
        }
        else if ( nRet > 0 )
        {
            pNode = pNode->pLeft;
        }
        else
        {
            return pNode->pData;
        }
    }
    return NULL;
}


/**	二叉樹查找函數

	@param	BINTREEBASENODE *pRoot - 根節點指針	
	@param	void *pData - 數據指針	
	@param	COMPAREFUNC CompareFunc - 數據比較函數	
	@return	BINTREEBASENODE * - 根節點指針	
*/
BINTREEBASENODE *BinTree_FindNode(BINTREEBASENODE *pRoot, 
                              void *pData, COMPAREFUNC CompareFunc)
{
    BINTREEBASENODE *pNode;
    
    pNode = pRoot;
    
    while ( pNode != NULL )
    {
        INT nRet = (*CompareFunc)(pNode->pData, pData);
        if ( nRet < 0 )
        {
            pNode = pNode->pRight;
        }
        else if ( nRet > 0 )
        {
            pNode = pNode->pLeft;
        }
        else
        {
            return pNode;
        }
    }
    return NULL;
}

/**	二叉搜索樹的添加節點到指定節點的左子樹的函數

	@param	BINTREE *pBinTree - 二叉搜索樹指針	
	@param	void *pTagNodeData - 指定節點指針	
	@param	void *pData - 要添加的數據指針	
	@param	COMPAREFUNC CompareFunc - 數據比較函數	
	@return	INT - CAPI_SUCCESS表示成功,CAPI_FAILED表示失敗。	
*/
INT BinTree_AddLeft(BINTREE *pBinTree, void *pTagNodeData, 
                    void *pData, COMPAREFUNC CompareFunc)
{
    BINTREEBASENODE *pNode;
    INT         nRet;

    if ( pBinTree == NULL || pTagNodeData == NULL 
        || pData == NULL || CompareFunc == NULL )
    {
        return CAPI_FAILED;
    }
    /* 查找要插入的節點 */
    pNode = pBinTree->pRoot;
    while ( pNode != NULL )
    {
        nRet = (*CompareFunc)(pNode->pData, pTagNodeData);
        if ( nRet < 0 )
        {
            pNode = pNode->pRight;
        }
        else if ( nRet > 0 )
        {
            pNode = pNode->pLeft;
        }
        else
        {
            break;
        }
    }
    if ( pNode != NULL )
    {
        /* 
         *  找到了要插入的目標節點,生成新節點插入作為其左子樹
         * 如果原來有左子樹則將新節點左子樹指針指向它
         */
        BINTREEBASENODE *pNewNode;
        pNewNode = (BINTREEBASENODE *)malloc(sizeof(BINTREEBASENODE));
        if ( pNewNode != NULL )
        {
            pNewNode->pData = pData;
            pNewNode->pLeft = pNode->pLeft;
            pNewNode->pRight = NULL;
            pNode->pLeft = pNewNode;
            return CAPI_SUCCESS;
        }
    }
    return CAPI_FAILED;
}

/**	二叉搜索樹的添加節點到指定節點的右子樹的函數

	@param	BINTREE *pBinTree - 二叉搜索樹指針	
	@param	void *pTagNodeData - 指定節點指針	
	@param	void *pData - 數據指針	
	@param	COMPAREFUNC CompareFunc - 數據比較回調函數	
	@return	INT - CAPI_SUCCESS表示成功,CAPI_FAILED表示失敗。	
*/
INT BinTree_AddRight(BINTREE *pBinTree, void *pTagNodeData, 
                    void *pData, COMPAREFUNC CompareFunc)
{
    BINTREEBASENODE *pNode;
    INT         nRet;

    if ( pBinTree == NULL || pTagNodeData == NULL 
        || pData == NULL || CompareFunc == NULL )
    {
        return CAPI_FAILED;
    }
    /* 查找要插入的節點 */
    pNode = pBinTree->pRoot;
    while ( pNode != NULL )
    {
        nRet = (*CompareFunc)(pNode->pData, pTagNodeData);
        if ( nRet < 0 )
        {
            pNode = pNode->pRight;
        }
        else if ( nRet > 0 )
        {
            pNode = pNode->pLeft;
        }
        else
        {
            break;
        }
    }
    if ( pNode != NULL )
    {
        /* 
         *  找到了要插入的目標節點,生成新節點插入作為其左子樹
         * 如果原來有左子樹則將新節點左子樹指針指向它
         */
        BINTREEBASENODE *pNewNode;
        pNewNode = (BINTREEBASENODE *)malloc(sizeof(BINTREEBASENODE));
        if ( pNewNode != NULL )
        {
            pNewNode->pData = pData;
            pNewNode->pLeft = NULL;
            pNewNode->pRight = pNode->pRight;
            pNode->pRight = pNewNode;
            return CAPI_SUCCESS;
        }
    }
    return CAPI_FAILED;
}

/**	二叉搜索樹的刪除函數

	@param	BINTREE *pBinTree - 二叉樹指針	
	@param	void *pData - 要刪除的數據指針	
	@param	COMPAREFUNC  CompareFunc - 數據比較回調函數	
	@param	DESTROYFUNC  DestroyFunc - 數據釋放回調函數	
	@return	INT - CAPI_FAILED表示失敗,CAPI_SUCCESS表示成功	
*/
INT BinTree_Delete(BINTREE *pBinTree, void *pData, 
                   COMPAREFUNC  CompareFunc,
                   DESTROYFUNC  DestroyFunc)
{
    BINTREEBASENODE *pNode;
    BINTREEBASENODE *pMaxNode;
    INT         nRet;

    if ( pBinTree == NULL ||pBinTree->pRoot == NULL
        || pData == NULL || CompareFunc == NULL )
    {
        return CAPI_FAILED;
    }
    pNode = pBinTree->pRoot;
    while ( pNode != NULL )
    {
        nRet = (*CompareFunc)(pNode->pData, pData); 
        if ( nRet < 0 )
        {
            pNode = pNode->pRight;
        }
        else if ( nRet > 0 )
        {
            pNode = pNode->pLeft;
        }
        else
        {
            break;
        }
    }

    if ( pNode == NULL )
    {
        /* 未找到指定節點 */
        return CAPI_FAILED;
    }

    /* 處理查找到的pNode有兩個子節點的情況 */
    if ( pNode->pLeft != NULL && pNode->pRight != NULL )
    {
        pMaxNode = pNode->pLeft;
        while ( pMaxNode->pRight != NULL )
        {
            pMaxNode = pMaxNode->pRight;
        }
        if ( DestroyFunc != NULL && pNode->pData != NULL )
        {
            (*DestroyFunc)(pNode->pData);
        }
        pNode->pData = pMaxNode->pData;
        if ( pMaxNode == pNode->pLeft )
        {
            pNode->pLeft = pMaxNode->pLeft;
            if ( pMaxNode->pLeft != NULL )
            {
                pMaxNode->pLeft->pParent = pNode;
            }

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
色素色在线综合| jiyouzz国产精品久久| 欧美伦理电影网| 一区二区三区免费网站| 欧美在线小视频| 亚洲r级在线视频| 日韩午夜av电影| 激情五月播播久久久精品| 久久久99久久精品欧美| 国产一区91精品张津瑜| 中文字幕不卡一区| 色综合 综合色| 亚洲成人在线观看视频| 欧美一区二区三区色| 国产一区二区精品久久| 久久精品一区二区三区四区| 成人午夜看片网址| 一区二区免费视频| 欧美高清视频在线高清观看mv色露露十八| 视频一区二区三区入口| 精品国产一区二区三区久久久蜜月 | 日韩高清不卡一区二区三区| 欧美一级欧美一级在线播放| 国产一区二区三区视频在线播放| 日本一区二区成人| 欧洲一区在线观看| 久久国产夜色精品鲁鲁99| 国产欧美1区2区3区| 欧美综合天天夜夜久久| 毛片一区二区三区| 国产精品麻豆网站| 欧美一区二区三区思思人| 成人av网址在线观看| 亚洲国产精品视频| 精品国产不卡一区二区三区| 99久久777色| 日韩国产高清影视| 中文字幕一区av| 日韩欧美视频一区| 99久久er热在这里只有精品66| 亚洲18色成人| ●精品国产综合乱码久久久久| 911精品国产一区二区在线| 成人精品视频.| 伦理电影国产精品| 亚洲激情中文1区| 久久久亚洲欧洲日产国码αv| 欧美中文字幕亚洲一区二区va在线| 国产黑丝在线一区二区三区| 亚洲成在人线在线播放| 国产精品久久精品日日| 日韩欧美高清在线| 欧美日韩国产美| 97国产精品videossex| 精品一区二区在线视频| 亚洲成a人在线观看| 1区2区3区欧美| 久久久国产精品不卡| 日韩欧美综合在线| 欧美三日本三级三级在线播放| 成人自拍视频在线| 久久精品国产精品青草| 亚洲一区二区欧美| 亚洲视频一区二区在线观看| 欧美v国产在线一区二区三区| 色欧美88888久久久久久影院| 国产福利一区在线| 另类欧美日韩国产在线| 亚洲一区二区三区四区五区中文 | 欧美最猛黑人xxxxx猛交| 高清在线观看日韩| 国产成人av福利| 韩国女主播一区二区三区| 美女视频一区在线观看| 日本在线观看不卡视频| 性久久久久久久| 午夜欧美视频在线观看| 亚洲va中文字幕| 亚洲成a人片综合在线| 午夜一区二区三区在线观看| 亚洲免费成人av| 一区二区三区小说| 一区二区三区国产| 亚洲国产成人91porn| 亚洲一区二区高清| 亚洲地区一二三色| 偷拍亚洲欧洲综合| 日本特黄久久久高潮| 免播放器亚洲一区| 精品一区二区在线播放| 国产99久久精品| 91免费视频大全| 色婷婷综合久久久久中文 | 亚洲gay无套男同| 日韩中文欧美在线| 麻豆精品精品国产自在97香蕉| 韩国av一区二区三区| 国产91丝袜在线18| 色婷婷久久久久swag精品| 欧美亚洲国产bt| 日韩欧美国产一区二区在线播放 | 国产mv日韩mv欧美| 色婷婷精品久久二区二区蜜臂av| 91福利精品视频| 欧美日本国产一区| 日韩精品一区二区三区视频播放 | 色天天综合色天天久久| 在线成人av网站| 国产午夜亚洲精品不卡| 最新成人av在线| 偷窥少妇高潮呻吟av久久免费| 蜜桃久久久久久久| 成人爱爱电影网址| 欧美日韩一级片网站| 欧美成人三级在线| 亚洲欧美中日韩| 日韩激情在线观看| 国产盗摄精品一区二区三区在线 | 中文成人av在线| 一区二区欧美在线观看| 精品在线免费观看| 91麻豆精品在线观看| 91精品国产欧美日韩| 国产日产欧美一区二区视频| 亚洲精品中文在线影院| 久久99精品一区二区三区 | 欧美日韩小视频| 国产日韩成人精品| 日韩成人精品在线观看| 成人黄色免费短视频| 7777精品伊人久久久大香线蕉经典版下载| 久久这里只有精品视频网| 亚洲综合在线观看视频| 国产一区激情在线| 欧美日韩一级二级| 综合久久国产九一剧情麻豆| 人人精品人人爱| 在线免费观看成人短视频| 国产日韩亚洲欧美综合| 日本aⅴ亚洲精品中文乱码| 色婷婷综合久久久久中文| 欧美国产成人精品| 久久精品av麻豆的观看方式| 在线看国产一区| 国产精品理论片在线观看| 国内外精品视频| 欧美精品亚洲一区二区在线播放| 1024国产精品| 国产成人aaaa| 久久亚洲影视婷婷| 久久99日本精品| 91精品在线麻豆| 一个色在线综合| 91在线小视频| 国产精品乱码一区二三区小蝌蚪| 九九久久精品视频| 欧美电影免费观看高清完整版 | 美女诱惑一区二区| 欧美日韩综合不卡| 亚洲综合激情网| 91久久线看在观草草青青| 国产精品国产自产拍高清av | 蜜桃传媒麻豆第一区在线观看| 欧美中文字幕不卡| 亚洲一区二区三区三| 日本韩国欧美在线| 亚洲男同性视频| 色先锋资源久久综合| 亚洲精品免费电影| 日本道色综合久久| 亚洲国产成人高清精品| 欧美日本韩国一区二区三区视频| 亚洲成年人网站在线观看| 欧美精品一二三| 免费在线观看一区| 精品美女在线观看| 国产精品一区免费视频| 国产欧美日韩中文久久| 国产91精品在线观看| 国产精品免费久久| 99久久99久久久精品齐齐| 一区二区三区高清在线| 欧美精品777| 国产一区二区在线看| 亚洲国产精华液网站w| 91色在线porny| 亚洲一区av在线| 欧美日韩综合色| 久久精品国产99| 国产精品美女久久久久aⅴ国产馆 国产精品美女久久久久av爽李琼 国产精品美女久久久久高潮 | 欧美日韩在线一区二区| 日韩精品福利网| 精品国产伦一区二区三区免费| 国产一区二区三区四区五区美女 | 亚洲免费观看在线视频| 欧美性色黄大片手机版| 奇米四色…亚洲| 国产精品三级久久久久三级| 91国模大尺度私拍在线视频| 日韩中文欧美在线|