• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            聚星亭

            吾笨笨且懶散兮 急須改之而奮進
            posts - 74, comments - 166, trackbacks - 0, articles - 0
              C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理
            /********************************************************************
              created:  2009/01/09
              created:  9:1:2009   12:42
              author:    cooldiyer
              site:    
            http://www.xcodez.com/
              
              purpose:  多叉樹類文件
            ********************************************************************
            */

            #include 
            <windows.h>
            #include 
            <stdio.h>

            VOID
            FORCEINLINE
            InitializeListHead(
                       IN PLIST_ENTRY ListHead
                       )
            {
                ListHead
            ->Flink = ListHead->Blink = ListHead;
            }

            #define IsListEmpty(ListHead) \
            ((ListHead)
            ->Flink == (ListHead))

            VOID
            FORCEINLINE
            RemoveEntryList(
                    IN PLIST_ENTRY Entry
                    )
            {
                PLIST_ENTRY Blink;
                PLIST_ENTRY Flink;
              
                Flink 
            = Entry->Flink;
                Blink 
            = Entry->Blink;
                Blink
            ->Flink = Flink;
                Flink
            ->Blink = Blink;
            }

            VOID
            FORCEINLINE
            InsertTailList(
                     IN PLIST_ENTRY ListHead,
                     IN PLIST_ENTRY Entry
                     )
            {
                PLIST_ENTRY Blink;
              
                Blink 
            = ListHead->Blink;
                Entry
            ->Flink = ListHead;
                Entry
            ->Blink = Blink;
                Blink
            ->Flink = Entry;
                ListHead
            ->Blink = Entry;
            }


            VOID
            FORCEINLINE
            InsertHeadList(
                     IN PLIST_ENTRY ListHead,
                     IN PLIST_ENTRY Entry
                     )
            {
                PLIST_ENTRY Flink;
              
                Flink 
            = ListHead->Flink;
                Entry
            ->Flink = Flink;
                Entry
            ->Blink = ListHead;
                Flink
            ->Blink = Entry;
                ListHead
            ->Flink = Entry;
            }


            typedef 
            struct tagTREENODE
            {
              LPARAM      lParam;      
            // 關聯的值
              int        cChildren;    // 子節點個數
              LIST_ENTRY    ListEntry;    // 同一等級的節點
              LIST_ENTRY    ChildListEntry;  // 子節點頭
              tagTREENODE *  pParentNode;  // 父節點
            } TREENODE, *PTREENODE;



            #define TN_ROOT                ((HTREENODE)(ULONG_PTR)-0x10000)
            #define TN_FIRST               ((HTREENODE)(ULONG_PTR)-0x0FFFF)
            #define TN_LAST                ((HTREENODE)(ULONG_PTR)-0x0FFFE)
            typedef PTREENODE  HTREENODE;


            class CTree
            {  
            public:
              CTree() {
                m_nCount 
            = 0;
                m_nRootChildCount 
            = 0;
                InitializeListHead(
            &m_ListHead);
              }
              
            ~CTree() {
                DeleteAllNodes();
              }

            private:
              
            int m_nCount;
              
            int  m_nRootChildCount;
              LIST_ENTRY m_ListHead;

            public:

              
            int getCount() {
                
            return m_nCount;
              }

              
            int  getChildNodeCount(HTREENODE hNode) {
                
            if (isRootNode(hNode)) {
                  
            return m_nRootChildCount;
                }
                
            else {
                  
            return hNode->cChildren;
                }
              }

              HTREENODE getChildNode(HTREENODE hNode) {

                
            if (NodeHasChildren(hNode) > 0) {
                  
            if (isRootNode(hNode)) {
                    
            return CONTAINING_RECORD(m_ListHead.Flink, TREENODE, ListEntry);
                  }
                  
            else {
                    
            return CONTAINING_RECORD(hNode->ChildListEntry.Flink, TREENODE, ListEntry);
                  }

                }
                
            else {
                  
            return NULL;
                }
              }

              BOOL isRootNode(HTREENODE hNode) {
                
            return TN_ROOT == hNode;
              }

              HTREENODE getRootNode(){
                
            return TN_ROOT;
              }

              HTREENODE GetParentNode(HTREENODE hNode) {
                
            return hNode->pParentNode;
              }


              HTREENODE getNextNode( HTREENODE hNode ) {

                PLIST_ENTRY  pListHead;

                
            if (isRootNode(hNode)) {
                  
            return NULL;
                }

                
            if (isRootNode(hNode->pParentNode)) {
                  pListHead 
            = &m_ListHead;
                }
                
            else {
                
                  pListHead 
            = &hNode->pParentNode->ChildListEntry;
                }

                PLIST_ENTRY  pNext 
            = hNode->ListEntry.Flink;

                
            if (pListHead == pNext) {
                  
            return NULL;
                }
                
            else {
                  
            return CONTAINING_RECORD(pNext, TREENODE, ListEntry);
                }
              }

              BOOL NodeHasChildren( HTREENODE hNode ) {
                
            if (isRootNode(hNode)) {
                  
            return m_nRootChildCount > 0;
                }
                
            else {
                  
            return hNode->cChildren > 0;
                }
              }

              HTREENODE InsertNode(LPARAM lparam, HTREENODE hParent 
            = TN_ROOT, HTREENODE hInsertAfter = TN_LAST ) {

                TREENODE 
            *  pTreeNode = new TREENODE;
                pTreeNode
            ->cChildren = 0;
                pTreeNode
            ->lParam = lparam;
                pTreeNode
            ->pParentNode = hParent;

                InitializeListHead(
            &pTreeNode->ListEntry);
                InitializeListHead(
            &pTreeNode->ChildListEntry);


                PLIST_ENTRY  pListEntry 
            = NULL;

                
            if (TN_ROOT == hParent) {
                  pListEntry 
            = &m_ListHead;

                  m_nRootChildCount
            ++;
                }
                
            else {
                  pListEntry 
            = &hParent->ChildListEntry;
                  hParent
            ->cChildren++;
                }

                
            if (TN_LAST == hInsertAfter) {
                  InsertTailList(pListEntry, 
            &pTreeNode->ListEntry);
                }
                
            else if (TN_FIRST == hInsertAfter){
                  InsertHeadList(pListEntry, 
            &pTreeNode->ListEntry);
                }
                
            else {
                  InsertHeadList(
            &hInsertAfter->ListEntry, &pTreeNode->ListEntry);
                }

                m_nCount
            ++;

                
            return pTreeNode;
              }

              DWORD GetNodeData( HTREENODE hNode ) {
                
            if (isRootNode(hNode)) {
                  
            return -1;
                }
                
            else {
                  
            return hNode->lParam;
                }
              }

              BOOL SetNodeData( HTREENODE hNode, DWORD dwData ) {
                
            if (isRootNode(hNode)) {
                  
            return FALSE;
                }
                
            else {
                  hNode
            ->lParam = dwData;
                }
                
                
            return TRUE;
              }

              BOOL DeleteAllNodes() {
                
            return DeleteNode(TN_ROOT);
              }

              BOOL DeleteNode(HTREENODE hNode) {
                
                HTREENODE hNext 
            = getChildNode(hNode);

                
            while (hNext) {
                  HTREENODE hNextNode 
            = getNextNode(hNext);
                  DeleteNode(hNext);
                  hNext 
            = hNextNode;
                }

                
            if (!isRootNode(hNode)) {
                  
            if (isRootNode(hNode->pParentNode))  {
                    m_nRootChildCount
            --;
                  }
                  
            else {
                    hNode
            ->pParentNode->cChildren--;
                  }
                  m_nCount
            --;

                  RemoveEntryList(
            &hNode->ListEntry);
                  delete hNode;
                }
                
            return TRUE;
              }
            };


            void PrintNode(CTree * pTree, HTREENODE hNode, BOOL bIsRecursive)
            {
              HTREENODE hNext 
            = pTree->getChildNode(hNode);
              
              
            while (hNext)
              {
                printf(
            "0x%X 0x%X\t%d\n", hNext, pTree->GetParentNode(hNext), pTree->GetNodeData(hNext));

                
            if (bIsRecursive){
                  PrintNode(pTree, hNext, bIsRecursive);
                }
                
                hNext 
            = pTree->getNextNode(hNext);
              }
            }

            int main(int argc, char* argv[])
            {
              CTree  tree;
              HTREENODE hTreeNode 
            = tree.InsertNode(1);
              tree.InsertNode(
            2);
              tree.InsertNode(
            3);

              HTREENODE hTreeChild 
            = tree.InsertNode(4);
              tree.InsertNode(
            6, hTreeChild);
              tree.InsertNode(
            5, hTreeChild, TN_FIRST);
              HTREENODE hNewChild 
            = tree.InsertNode(7, hTreeChild);

              tree.InsertNode(
            8, hNewChild);
              tree.InsertNode(
            9, hNewChild);

              PrintNode(
            &tree, tree.getRootNode(), TRUE);


              
            return 0;

            說明:以上代碼轉載與 看雪學院 論壇
            原帖地址:http://bbs.pediy.com/showthread.php?t=80173
            国产69精品久久久久99| 伊人 久久 精品| 亚洲国产精品无码久久SM| 久久精品综合网| 漂亮人妻被中出中文字幕久久| 久久天天日天天操综合伊人av| 久久99国产精品成人欧美| 九九久久99综合一区二区| 国产99精品久久| 久久国产视屏| 思思久久精品在热线热| 香蕉久久夜色精品升级完成| 亚洲狠狠婷婷综合久久蜜芽| 久久人人爽人人爽人人片AV不| 好属妞这里只有精品久久| 99久久精品这里只有精品| 青草久久久国产线免观| 亚洲国产一成久久精品国产成人综合 | 一本色道久久综合亚洲精品| 无码专区久久综合久中文字幕| 大伊人青草狠狠久久| 久久精品亚洲福利| 99久久综合国产精品免费| 国产精品免费看久久久| 久久国产成人亚洲精品影院| 精品伊人久久久| 久久综合久久久| 囯产极品美女高潮无套久久久| 97久久久久人妻精品专区| 欧美久久天天综合香蕉伊| 新狼窝色AV性久久久久久| 久久精品成人免费国产片小草| 久久久无码精品亚洲日韩京东传媒 | 国产一级持黄大片99久久| 要久久爱在线免费观看| 久久青青草原国产精品免费| 国产精品一区二区久久精品涩爱| 国产精品久久自在自线观看| 亚洲成av人片不卡无码久久| .精品久久久麻豆国产精品| 久久中文字幕精品|