免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 12909 | 回复: 4
打印 上一主题 下一主题

[其他] 在一个死亡的论坛上发一个从未活过的代码, 致我已经风飘云散的过去 [复制链接]

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2022-11-02 14:44 |只看该作者 |倒序浏览
本帖最后由 zylthinking 于 2022-11-02 14:49 编辑

在一个死亡的论坛上发一个从未活过的 symbian 代码


致我已经风飘云散的过去



  1. #ifndef _RBTree_H_
  2. #define _RBTree_H_
  3. #include <e32base.h>

  4. #define EFailed ((TAny *)(-1))
  5. typedef void (*TFree)(void*);
  6. typedef TInt (*TComp)(void*, void*);

  7. struct TUserOP{
  8.     TFree iFree;
  9.     TComp iCompare;
  10. };

  11. class TTreeNode;
  12. class TTreeIterator;

  13. class CRBTree : public CBase{
  14. public:
  15.     // TUser must not be NULL and iCompare should be
  16.     // provided too. while, iFree can be NULL if not needed
  17.     static IMPORT_C CRBTree* NewL(TUserOP* op);
  18.     IMPORT_C ~CRBTree();

  19.     // add a node to tree
  20.     // aUser, data proviced by user which will be added to tree
  21.     // aRep, if the data has exists, would it replace the old one
  22.     // or failed
  23.     // return value: EFailed, error occured
  24.     // the old one being replaced by the aUser, if aRep is false or
  25.     // there is data which is equal to aUser, return NULL
  26.     IMPORT_C TAny* AddL(TAny* aUser, TBool aRep);

  27.     // remove node
  28.     IMPORT_C TAny* Unlink(TAny* aUser);
  29.     IMPORT_C void Remove(TAny* aUser);

  30.     // clear all nodes in the tree
  31.     // the tree will be empty, while ok to add nodes again
  32.     IMPORT_C void Reset();

  33.     // number of nodes of the tree
  34.     IMPORT_C TInt Length();

  35.     // the min node in the tree
  36.     // the compare is provided by TUserOP
  37.     IMPORT_C TAny* Min();

  38.     // the max node in the tree
  39.     // the compare is provided by TUserOP
  40.     IMPORT_C TAny* Max();

  41.     // find the node in the tree, which is euqal to aUser
  42.     // compared with TUserOP::iCompare
  43.     IMPORT_C TAny* Find(TAny* aUser);

  44.     // generate a handle for later FindNext
  45.     // return -1, when can't find the aUser
  46.     // the handle will be used for forward search only
  47.     IMPORT_C TInt FindFirst(TAny* aUser);

  48.     // generate a handle for later RFindNext
  49.     // return -1, when can't find the aUser
  50.     // the handle will be used for backward search only
  51.     IMPORT_C TInt RFindFirst(TAny* aUser);

  52.     // return data referenced by handle, and reposition the
  53.     // handle to nexr data
  54.     // return value: the data referenced by handle
  55.     // EFailed if error occured
  56.     // NULL when there is no more data
  57.     IMPORT_C TAny* FindNext(TInt aHandle);

  58.     // same with FindNext, but is a safer method, meaning, the
  59.     // method will validate the handle provided by user, while
  60.     // FindNext will not. The method is slower.
  61.     IMPORT_C TAny* FindNextSafe(TInt aHandle);

  62.     // return data referenced by handle, and reposition the
  63.     // handle to previous data
  64.     // return value: the data referenced by handle
  65.     // EFailed if error occured
  66.     // NULL when there is no more data
  67.     IMPORT_C TAny* RFindNext(TInt aHandle);

  68.     // same with RFindNext, but is a safer method, meaning, the
  69.     // method will validate the handle provided by user, while
  70.     // RFindNext will not. The method is slower.
  71.     IMPORT_C TAny* RFindNextSafe(TInt aHandle);

  72.     // Close the handle when finish using it.
  73.     // must be called after using it to release resouce used internal
  74.     IMPORT_C void CloseFindHandle(TInt handle);

  75.     // A safe version of CloseFindHandle
  76.     IMPORT_C void CloseFindHandleSafe(TInt handle);

  77. #ifdef _DEBUG
  78.     IMPORT_C TInt BlackHeight();
  79. private:
  80.     TInt CRBTree::BlackHeight(TTreeNode* aNode);
  81. #endif

  82. public:
  83.     enum TColor{EBlack, ERed};
  84.     enum TDirect{EForward, EBackward};

  85. private:
  86.     CRBTree(TUserOP* op);
  87.     CRBTree::CRBTree(const CRBTree&);
  88.     CRBTree& operator = (const CRBTree&);
  89.     void ConstructL();
  90.    
  91.     void AdjustBeforeInsert(TTreeNode* aNode);
  92.     void AdjustBeforeRemove(TTreeNode* aNode);
  93.     void InsertL(TAny* aUser, TTreeNode* aFather, TInt aFlag);
  94.     void InsertRotate(TTreeNode* aFather, TTreeNode* aNode);
  95.     TAny* RemoveNode(TTreeNode* aNode);
  96.    
  97.     TTreeNode* Find(TAny* aUser, TInt& aFlag);
  98.     TInt FindFirst(TAny* aUser, TDirect aDirect);
  99.     TTreeNode* FindNext(TTreeNode* aNode);
  100.     TTreeNode* RFindNext(TTreeNode* aNode);
  101.     void AdjustFindHandles(TTreeNode* aNode);
  102.    
  103.     TInt ValidateHandle(TInt aHandle);
  104.     TTreeNode** PointerOf(TTreeNode* aNode);
  105.     void RotateLeft(TTreeNode* aFather, TTreeNode* aNode, TTreeNode** aPPNode);
  106.     void RotateRight(TTreeNode* aFather, TTreeNode* aNode, TTreeNode** aPPNode);
  107.    
  108. private:
  109.     TUserOP* iOps;
  110.     TTreeNode* iRoot;
  111.     TTreeIterator* iIterator;
  112.     TInt iNrNodes;
  113. };

  114. #endif


  115. #include "rbtree.h"
  116. #include <e32std.h>

  117. #define BLACK(x)    (x == NULL || x->iColor == EBlack)

  118. class TTreeNode{
  119. public:
  120.     TTreeNode(CRBTree::TColor aColor){
  121.         iLChild = iRChild = iFather = NULL;
  122.         iColor = aColor;
  123.     }
  124. public:
  125.     TTreeNode* iFather;
  126.     TTreeNode* iLChild;
  127.     TTreeNode* iRChild;
  128.     CRBTree::TColor iColor;
  129.     TAny* iUser;
  130. };

  131. class TTreeIterator{
  132. public:
  133.     TTreeIterator(TTreeNode* aNode, CRBTree::TDirect aDirection){
  134.         ASSERT(aNode);

  135.         iNext = iPrev = NULL;
  136.         iNode = aNode;
  137.         iDirection = aDirection;
  138.     }

  139.     TTreeNode* iNode;
  140.     CRBTree::TDirect iDirection;
  141.     TTreeIterator* iNext;
  142.     TTreeIterator* iPrev;
  143. };

  144. //========================================================

  145. CRBTree::CRBTree(TUserOP* aOp){
  146.     iOps = aOp;
  147. }

  148. EXPORT_C CRBTree::~CRBTree(){
  149.     Reset();
  150. }

  151. EXPORT_C CRBTree* CRBTree::NewL(TUserOP* aOp){
  152.     CRBTree* self = new (ELeave) CRBTree(aOp);
  153.     CleanupStack::PushL(self);
  154.     self->ConstructL();
  155.     CleanupStack::Pop();
  156.     return self;
  157. }

  158. void CRBTree::ConstructL(){
  159.     if(iOps == NULL || iOps->iCompare == NULL)
  160.         User::Leave(KErrArgument);
  161. }

  162. EXPORT_C TInt CRBTree::Length(){
  163.     return iNrNodes;
  164. }

  165. EXPORT_C TAny* CRBTree::Min(){
  166.     TTreeNode* cur = iRoot;
  167.     if(cur != NULL){
  168.         while(cur->iLChild){
  169.             cur = cur->iLChild;
  170.         }
  171.     }
  172.     return cur->iUser;
  173. }

  174. EXPORT_C TAny* CRBTree::Max(){
  175.     TTreeNode* cur = iRoot;
  176.     if(cur != NULL){
  177.         while(cur->iRChild){
  178.             cur = cur->iRChild;
  179.         }
  180.     }
  181.     return cur->iUser;
  182. }

  183. EXPORT_C void CRBTree::Reset(){
  184.     TTreeNode* cur = iRoot;
  185. LABEL:
  186.     if(cur){
  187.         if(cur->iLChild){
  188.             cur = cur->iLChild;
  189.             goto LABEL;
  190.         }

  191.         if(cur->iRChild){
  192.             cur = cur->iRChild;
  193.             goto LABEL;
  194.         }

  195.         if(iOps->iFree){
  196.             iOps->iFree(cur->iUser);
  197.         }

  198.         TTreeNode* father = cur->iFather;
  199.         delete cur;

  200.         if(cur != iRoot){
  201.             if(father->iLChild == cur)
  202.                 father->iLChild = NULL;
  203.             else
  204.                 father->iRChild = NULL;

  205.             cur = father;
  206.             goto LABEL;
  207.         }
  208.     }

  209.     TTreeIterator* it = iIterator;
  210.     while(it){
  211.         TTreeIterator* next = it->iNext;
  212.         delete it;
  213.         it = next;
  214.     }

  215.     iRoot = NULL;
  216.     iIterator = NULL;
  217.     iNrNodes = 0;
  218. }

  219. EXPORT_C TAny* CRBTree::AddL(TAny* aUser, TBool aRep){
  220.     if(aUser == NULL)
  221.         User::Leave(KErrArgument);

  222.     if(iRoot == NULL){
  223.         TTreeNode* node = new (ELeave) TTreeNode(EBlack);
  224.         ++iNrNodes;

  225.         iRoot = node;
  226.         iRoot->iUser = aUser;
  227.         return NULL;
  228.     }
  229.    
  230.     TInt flag = 1;
  231.     TTreeNode* node = Find(aUser, flag);
  232.     ASSERT(node);

  233.     TAny* oldkey = node->iUser;
  234.     if(flag == 0){
  235.         if(aRep){
  236.             node->iUser = oldkey;
  237.             return oldkey;
  238.         }
  239.         User::Leave(KErrAlreadyExists);
  240.     }

  241.     InsertL(aUser, node, flag);
  242.     ++iNrNodes;
  243.     return NULL;
  244. }

  245. void CRBTree::InsertL(TAny* aUser, TTreeNode* aFather, TInt aFlag){
  246.     TTreeNode* newNode = new (ELeave) TTreeNode(ERed);
  247.     newNode->iUser = aUser;

  248.     if(aFlag > 0){
  249.         aFather->iLChild = newNode;
  250.         newNode->iFather = aFather;
  251.     }else{
  252.         aFather->iRChild = newNode;
  253.         newNode->iFather = aFather;
  254.     }

  255.     if(aFather->iColor == ERed){
  256.         InsertRotate(aFather, newNode);
  257.     }
  258. }

  259. TTreeNode* CRBTree::Find(TAny* aUser, TInt& aFlag){
  260.     ASSERT(aUser);

  261.     TInt adjust = aFlag;
  262.     TTreeNode* cur = iRoot;

  263.     while(cur){
  264.         aFlag = iOps->iCompare(cur->iUser, aUser);
  265.         if(aFlag == 0)
  266.             return cur;
  267.         
  268.         if(adjust && cur->iLChild && cur->iRChild &&
  269.            cur->iColor == EBlack && cur->iLChild->iColor == ERed &&
  270.            cur->iRChild->iColor == ERed){
  271.             AdjustBeforeInsert(cur);
  272.         }

  273.         if(aFlag > 0 && cur->iLChild){
  274.             cur = cur->iLChild;
  275.         }else if(aFlag < 0 && cur->iRChild){
  276.             cur = cur->iRChild;
  277.         }else{
  278.             return cur;
  279.         }
  280.     }

  281.     return NULL;
  282. }

  283. void CRBTree::AdjustBeforeInsert(TTreeNode* aNode){
  284.     aNode->iLChild->iColor = EBlack;
  285.     aNode->iRChild->iColor = EBlack;

  286.     if(aNode->iFather){
  287.         aNode->iColor = ERed;
  288.         if(aNode->iFather->iColor == ERed)
  289.             InsertRotate(aNode->iFather, aNode);
  290.     }
  291. }

  292. void CRBTree::InsertRotate(TTreeNode* aFather, TTreeNode* aNode){
  293.     ASSERT(aNode->iColor == ERed);
  294.     ASSERT(aFather->iColor == ERed);
  295.     ASSERT(aFather->iFather);
  296.    
  297.     TTreeNode* grandpa = aFather->iFather;
  298.     TBool left1 = (aFather->iLChild == aNode);
  299.     TBool left2 = (grandpa->iLChild == aFather);
  300.     TBool same = (left1 == left2);

  301.     if(same){
  302.         aNode = aFather;
  303.         aFather = aNode->iFather;
  304.     }

  305. LABEL:
  306.     TTreeNode** pp_node = PointerOf(aFather);
  307.     if(left1){
  308.         RotateRight(aFather, aNode, pp_node);
  309.     }else{
  310.         RotateLeft(aFather, aNode, pp_node);
  311.     }

  312.     if(!same){
  313.         left1 = !left1;
  314.         aFather = aNode->iFather;
  315.         same = true;
  316.         goto LABEL;
  317.     }

  318.     aNode->iColor = EBlack;
  319.     if(left1){
  320.         aNode->iRChild->iColor = ERed;
  321.     }else{
  322.         aNode->iLChild->iColor = ERed;
  323.     }
  324. }

  325. void CRBTree::RotateLeft(TTreeNode* aFather, TTreeNode* aNode, TTreeNode** aPPNode){
  326.     *aPPNode = aNode;
  327.     aNode->iFather = aFather->iFather;
  328.    
  329.     aFather->iRChild = aNode->iLChild;
  330.     if(aNode->iLChild){
  331.         aNode->iLChild->iFather = aFather;
  332.     }

  333.     aNode->iLChild = aFather;
  334.     aFather->iFather = aNode;
  335. }
  336.    
  337. void CRBTree::RotateRight(TTreeNode* aFather, TTreeNode* aNode, TTreeNode** aPPNode){
  338.     *aPPNode = aNode;
  339.     aNode->iFather = aFather->iFather;
  340.    
  341.     aFather->iLChild = aNode->iRChild;
  342.     if(aNode->iRChild){
  343.         aNode->iRChild->iFather = aFather;
  344.     }

  345.     aNode->iRChild = aFather;
  346.     aFather->iFather = aNode;
  347. }

  348. EXPORT_C TAny* CRBTree::Unlink(TAny* aUser){
  349.     if(aUser == NULL){
  350.         return NULL;
  351.     }

  352.     TAny* user = NULL;
  353.     TInt flag = 0;

  354.     TTreeNode* node = Find(aUser, flag);
  355.     if(node != NULL && flag == 0){
  356.         AdjustFindHandles(node);
  357.         user = RemoveNode(node);
  358.         --iNrNodes;
  359.     }
  360.     return user;
  361. }

  362. EXPORT_C void CRBTree::Remove(TAny* aUser){
  363.     TAny* user = Unlink(aUser);
  364.     if(user && iOps->iFree){
  365.         iOps->iFree(user);
  366.     }
  367. }

  368. TAny* CRBTree::RemoveNode(TTreeNode* aNode){
  369.     ASSERT(aNode);

  370.     if(aNode->iLChild && aNode->iRChild){
  371.         TTreeNode* next = FindNext(aNode);
  372.         TAny* saved_key = next->iUser;
  373.         next->iUser = aNode->iUser;
  374.         aNode->iUser = saved_key;
  375.         aNode = next;
  376.     }

  377.     TTreeNode** pp_node = PointerOf(aNode);
  378.     if(aNode->iRChild != NULL){
  379.         aNode->iRChild->iFather = aNode->iFather;
  380.         aNode->iRChild->iColor = EBlack;
  381.         *pp_node = aNode->iRChild;
  382.     }else if(aNode->iLChild != NULL){
  383.         aNode->iLChild->iFather = aNode->iFather;
  384.         aNode->iLChild->iColor = EBlack;
  385.         *pp_node = aNode->iLChild;
  386.     }else{
  387.         if(aNode->iColor == EBlack){
  388.             AdjustBeforeRemove(aNode);
  389.         }
  390.         *pp_node = NULL;
  391.     }

  392.     TAny* user = aNode->iUser;
  393.     delete aNode;
  394.     return user;
  395. }

  396. void CRBTree::AdjustBeforeRemove(TTreeNode* aNode){
  397. LABEL:
  398.     TTreeNode* father = aNode->iFather;
  399.     if(father == NULL){
  400.         return;
  401.     }

  402.     TTreeNode* brother;
  403.     TBool left = father->iLChild == aNode;
  404.     if(left){
  405.         brother = father->iRChild;
  406.     }else{
  407.         brother = father->iLChild;
  408.     }
  409.     ASSERT(brother);

  410.     if(brother->iColor == ERed){
  411.         TTreeNode** pp_node = PointerOf(father);

  412.         if(left){
  413.             RotateLeft(father, brother, pp_node);
  414.             brother = father->iRChild;
  415.         }else{
  416.             RotateRight(father, brother, pp_node);
  417.             brother = father->iLChild;
  418.         }

  419.         father->iColor = ERed;
  420.         father->iFather->iColor = EBlack;
  421.     }

  422.     if(BLACK(brother->iLChild) && BLACK(brother->iRChild)){
  423.         if(father->iColor == ERed){
  424.             father->iColor = EBlack;
  425.             brother->iColor = ERed;
  426.             return;
  427.         }

  428.         brother->iColor = ERed;
  429.         aNode = father;
  430.         goto LABEL;
  431.     }

  432.     if(left){
  433.         if(BLACK(brother->iRChild)){
  434.             ASSERT(brother->iLChild->iColor == ERed);
  435.             RotateRight(brother, brother->iLChild, &(father->iRChild));

  436.             brother = brother->iFather;
  437.             brother->iColor = EBlack;
  438.             brother->iRChild->iColor = ERed;
  439.         }
  440.     }else if(BLACK(brother->iLChild)){
  441.         ASSERT(brother->iRChild->iColor == ERed);
  442.         RotateLeft(brother, brother->iRChild, &(father->iLChild));

  443.         brother = brother->iFather;
  444.         brother->iColor = EBlack;
  445.         brother->iLChild->iColor = ERed;
  446.     }

  447.     TTreeNode** pp_node = PointerOf(father);
  448.     if(left){
  449.         RotateLeft(father, brother, pp_node);
  450.         brother->iRChild->iColor = EBlack;
  451.     }else{
  452.         RotateRight(father, brother, pp_node);
  453.         brother->iLChild->iColor = EBlack;
  454.     }

  455.     brother->iColor = father->iColor;
  456.     father->iColor = EBlack;
  457. }

  458. TTreeNode** CRBTree::PointerOf(TTreeNode* aNode){
  459.     ASSERT(aNode);

  460.     TTreeNode** pp_node;
  461.     if(aNode->iFather){
  462.         if(aNode->iFather->iLChild == aNode)
  463.             pp_node = &aNode->iFather->iLChild;
  464.         else
  465.             pp_node = &aNode->iFather->iRChild;
  466.     }else{
  467.         pp_node = &iRoot;
  468.     }

  469.     return pp_node;
  470. }

  471. TTreeNode* CRBTree::FindNext(TTreeNode* aNode){
  472.     ASSERT(aNode);

  473.     TTreeNode* cur = aNode->iRChild;
  474.     if(cur){
  475.         while(cur->iLChild){
  476.             cur = cur->iLChild;
  477.         }
  478.         return cur;
  479.     }

  480.     cur = aNode->iFather;
  481.     while(cur){
  482.         if(cur->iLChild == aNode){
  483.             return cur;
  484.         }
  485.         aNode = cur;
  486.         cur = cur->iFather;
  487.     }

  488.     return NULL;
  489. }

  490. TTreeNode* CRBTree::RFindNext(TTreeNode* aNode){
  491.     ASSERT(aNode);

  492.     TTreeNode* cur = aNode->iLChild;
  493.     if(cur){
  494.         while(cur->iRChild){
  495.             cur = cur->iRChild;
  496.         }
  497.         return cur;
  498.     }

  499.     cur = aNode->iFather;
  500.     while(cur){
  501.         if(cur->iRChild == aNode){
  502.             return cur;
  503.         }
  504.         aNode = cur;
  505.         cur = cur->iFather;
  506.     }

  507.     return NULL;
  508. }

  509. void CRBTree::AdjustFindHandles(TTreeNode* aNode){
  510.     TTreeIterator* it = iIterator;
  511.     while(it){
  512.         if(it->iNode == aNode){
  513.             if(it->iDirection == EForward){
  514.                 it->iNode = FindNext(aNode);
  515.             }else{
  516.                 it->iNode = RFindNext(aNode);
  517.             }
  518.         }
  519.         it = it->iNext;
  520.     }
  521. }

  522. TInt CRBTree::ValidateHandle(TInt aHandle){
  523.     TTreeIterator* it = iIterator;
  524.     TTreeIterator* in = (TTreeIterator *) aHandle;
  525.     while(it){
  526.         if(it == in){
  527.             break;
  528.         }
  529.         it = it->iNext;
  530.     }

  531.     if(it == NULL){
  532.         return -1;
  533.     }
  534.     return 0;
  535. }

  536. EXPORT_C TAny* CRBTree::Find(TAny* aUser){
  537.     if(aUser == NULL){
  538.         return NULL;
  539.     }

  540.     TInt flag = 0;
  541.     TTreeNode* node = Find(aUser, flag);
  542.     if(node == NULL || flag != 0){
  543.         return NULL;
  544.     }
  545.     return node->iUser;   
  546. }

  547. TInt CRBTree::FindFirst(TAny* aUser, TDirect aDirect){
  548.     if(aUser == NULL){
  549.         return -1;
  550.     }

  551.     TInt flag = 0;
  552.     TTreeNode* node = Find(aUser, flag);
  553.     if(node == NULL){
  554.         return -1;
  555.     }

  556.     if(flag == 0){
  557.         TTreeIterator* it;
  558.         TRAPD(err, it = new (ELeave) TTreeIterator(node, aDirect));
  559.         if(KErrNone != err){
  560.             return -1;
  561.         }

  562.         if(iIterator != NULL){
  563.             it->iNext = iIterator;
  564.             iIterator->iPrev = it;
  565.         }

  566.         iIterator = it;
  567.         return (TInt) (iIterator);
  568.     }

  569.     return -1;
  570. }

  571. EXPORT_C TInt CRBTree::FindFirst(TAny* aUser){
  572.     return FindFirst(aUser, EForward);
  573. }

  574. EXPORT_C TInt CRBTree::RFindFirst(TAny* aUser){
  575.     return FindFirst(aUser, EBackward);
  576. }

  577. EXPORT_C TAny* CRBTree::FindNext(TInt handle){
  578.     TTreeIterator* it = (TTreeIterator *) handle;
  579.     if(it->iDirection != EForward){
  580.         return EFailed;
  581.     }

  582.     TTreeNode* node = it->iNode;
  583.     if(node == NULL){
  584.         return NULL;
  585.     }

  586.     TTreeNode* next = FindNext(node);
  587.     it->iNode = next;
  588.     return node->iUser;
  589. }

  590. EXPORT_C TAny* CRBTree::FindNextSafe(TInt handle){
  591.     if(-1 == ValidateHandle(handle)){
  592.         return EFailed;
  593.     }
  594.     return FindNext(handle);
  595. }

  596. EXPORT_C TAny* CRBTree::RFindNext(TInt handle){
  597.     TTreeIterator* it = (TTreeIterator *) handle;
  598.     if(it->iDirection != EBackward){
  599.         return EFailed;
  600.     }

  601.     TTreeNode* node = it->iNode;
  602.     if(node == NULL){
  603.         return NULL;
  604.     }

  605.     TTreeNode* next = RFindNext(node);
  606.     it->iNode = next;
  607.     return node->iUser;
  608. }

  609. EXPORT_C TAny* CRBTree::RFindNextSafe(TInt handle){
  610.     if(-1 == ValidateHandle(handle)){
  611.         return EFailed;
  612.     }
  613.     return RFindNext(handle);
  614. }

  615. EXPORT_C void CRBTree::CloseFindHandle(TInt handle){
  616.     if(iIterator == NULL){
  617.         return;
  618.     }

  619.     TTreeIterator* in = (TTreeIterator *) handle;
  620.     if(iIterator == in){
  621.         iIterator = in->iNext;
  622.         if(iIterator)
  623.             iIterator->iPrev = NULL;
  624.     }else{
  625.         in->iPrev->iNext = in->iNext;
  626.         if(in->iNext)
  627.             in->iNext->iPrev = in->iPrev;
  628.     }

  629.     delete in;
  630. }
  631.    
  632. EXPORT_C void CRBTree::CloseFindHandleSafe(TInt handle){
  633.     if(-1 != ValidateHandle(handle)){
  634.         CloseFindHandle(handle);
  635.     }
  636. }

  637. #ifdef _DEBUG
  638. EXPORT_C TInt CRBTree::BlackHeight(){
  639.     ASSERT(BLACK(iRoot));
  640.     return BlackHeight(iRoot);
  641. }

  642. TInt CRBTree::BlackHeight(TTreeNode* aNode){
  643.     TInt n = 0;
  644.     if(BLACK(aNode)){
  645.         n = 1;
  646.     }else{
  647.         ASSERT(BLACK(aNode->iLChild));
  648.         ASSERT(BLACK(aNode->iRChild));
  649.     }

  650.     TInt n1 = 0;
  651.     TInt n2 = 0;
  652.     if(aNode){
  653.         n1 = BlackHeight(aNode->iLChild);
  654.         n2 = BlackHeight(aNode->iRChild);
  655.     }
  656.     ASSERT(n1 == n2);

  657.     return (n + n1);
  658. }
  659. #endif

复制代码

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
2 [报告]
发表于 2022-11-11 12:10 |只看该作者
  1.     TAny* oldkey = node->iUser;
  2.     if(flag == 0){
  3.         if(aRep){
  4.             node->iUser = oldkey;
  5.             return oldkey;
  6.         }
  7.         User::Leave(KErrAlreadyExists);
  8.     }
复制代码


AddL的这一段,应该是赋值aUser而不是oldkey吧?

论坛徽章:
3
巳蛇
日期:2013-10-03 10:41:48申猴
日期:2014-07-29 16:12:04天蝎座
日期:2014-08-21 09:24:52
3 [报告]
发表于 2022-11-21 13:37 |只看该作者
人都已经散了。。

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
4 [报告]
发表于 2022-11-30 13:18 |只看该作者
回复 2# starwing83

看上去像

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
5 [报告]
发表于 2022-11-30 13:21 |只看该作者
pandaiam 发表于 2022-11-21 13:37
人都已经散了。。

这代码以为早丢了, 然后科学上网上了一次 gmail 居然发现了
无论如何当时也写了好几天, 总要让它吹吹风
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP