メインページ | アルファベット順一覧 | 構成 | ファイル一覧 | 構成メンバ | ファイルメンバ | 関連ページ

# dkcRedBlackTree.c

Red Black Tree [詳細]

`#include "dkcRedBlackTree.h"`

dkcRedBlackTree.cのインクルード依存関係図

ソースコードを見る。

## 関数
DKC_INLINE DKC_RB_TREE_ROOT *WINAPI | dkcAllocRedBlackTreeRoot (size_t node_max, size_t pool_max, DKC_RED_BLACK_TREE_DESTRUCTOR_F_TYPE destructor_)
int WINAPI | dkcFreeRedBlackTreeRoot (DKC_RB_TREE_ROOT **ptr)
void WINAPI | dkcRedBlackTreeAllErase (DKC_RB_TREE_ROOT *p)
| すべてのノードを削除する。

## 説明

Red Black Tree

作者:
  d金魚

dkcRedBlackTree.c で定義されています。

## 関数

DKC_INLINE DKC_RB_TREE_ROOT* WINAPI dkcAllocRedBlackTreeRoot | ( | size_t | node_max,
|  | size_t | pool_max,
|  | DKC_RED_BLACK_TREE_DESTRUCTOR_F_TYPE | destructor_
| ) |

  | 引数:
  | node_max[in] | 確保されたRootが確保できるnodeの数
  | pool_max[in] | 内部で使うノードプールの最大数
  | destructor_[in] | dkcRedBlackTreeAllErase()等でで使用されるDKC_RED_BLACK_NODEのdataメンバに対する開放関数を登録する。
戻り値: メモリ領域が確保された Red Black Tree オブジェクトへのポインタ。NULLで失敗 覚え書き: node_maxとpool_maxを同じにするとすべてのノードがプールされて メモリ確保処理がすべて簡略化される分処理が安定して高速になります。 ですが、メモリとの兼ね合いを考えてください。 dkcRedBlackTree.c の 12 行で定義されています。 参照先 dkc_RedBlackRoot::destructor, dkcAllocate(), dkcAllocSameObjectPool(), dkcFree(), dkcmREDBLACKTREE_NIL, dkcRedBlackTreeInitSentinelNode(), dkc_RedBlackRoot::node_count, dkc_RedBlackRoot::node_max, dkc_RedBlackRoot::node_pool, NULL, と dkc_RedBlackRoot::root.
    00014 {
    00015     DKC_RB_TREE_ROOT *p;
    00016     if(NULL==destructor_) return NULL;
    00017     p = dkcAllocate(sizeof(DKC_RB_TREE_ROOT));
    00018     if(NULL==p) return NULL;
    00019
    00020     dkcRedBlackTreeInitSentinelNode(
    00021         dkcmREDBLACKTREE_NIL(p)
    00022     );
    00023
    00024     p->root = dkcmREDBLACKTREE_NIL(p);
    00025     p->node_pool = dkcAllocSameObjectPool(
    00026         sizeof(DKC_RED_BLACK_NODE),pool_max,NULL,NULL
    00027     );
    00028     if(NULL==p->node_pool){
    00029         goto Error;
    00030     }
    00031     p->node_max = node_max;
    00032     p->node_count = 0;
    00033     p->destructor = destructor_;
    00034     return p;
    00035 Error:
    00036     dkcFree(&p);
    00037     return NULL;
    00038 }

int WINAPI dkcFreeRedBlackTreeRoot | ( | DKC_RB_TREE_ROOT ** | ptr | ) |

| dkcRedBlackTree.c の 40 行で定義されています。 参照先 dkcFree(), dkcFreeSameObjectPool(), dkcRedBlackTreeAllErase(), dkc_RedBlackRoot::node_pool, と NULL.
    00041 {
    00042     if(NULL==ptr || NULL==*ptr)
    00043     {
    00044         return edk_ArgumentException;
    00045     }
    00046
    00047     {
    00048         DKC_RB_TREE_ROOT *p = *ptr;
    00049
    00050         dkcRedBlackTreeAllErase(p);
    00051
    00052         dkcFreeSameObjectPool(&(p->node_pool));
    00053     }
    00054     return dkcFree(ptr);
    00055 }

void WINAPI dkcRedBlackTreeAllErase | ( | DKC_RB_TREE_ROOT * | p | ) |

| すべてのノードを削除する。 dkcRedBlackTree.c の 57 行で定義されています。 参照先 dkc_RedBlackRoot::destructor, dkcRedBlackTree_deleteNode(), dkc_RedBlackRoot::node_count, NULL, と dkc_RedBlackRoot::root. 参照元 dkcFreeRedBlackTreeRoot().
    00058 {
    00059     rb_tree_data_type data = NULL;
    00060     while(p->node_count != 0)
    00061     {
    00062         dkcRedBlackTree_deleteNode(p,p->root,&data);
    00063         p->destructor(data);
    00064     }
    00065
    00066 }