• <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
            亚洲精品成人网久久久久久| 久久久噜噜噜久久中文字幕色伊伊| 久久综合给久久狠狠97色| 欧美大香线蕉线伊人久久| 亚洲国产精品久久| 精品国产乱码久久久久久呢| 久久精品国产影库免费看| 久久伊人精品一区二区三区| a高清免费毛片久久| 久久天天躁夜夜躁狠狠躁2022| a级成人毛片久久| 五月丁香综合激情六月久久| 久久精品国产亚洲5555| 久久777国产线看观看精品| 一本一本久久a久久精品综合麻豆| 久久九九亚洲精品| 亚洲国产精品18久久久久久| 久久婷婷五月综合成人D啪| 久久91精品国产91久久小草| 久久国产AVJUST麻豆| 国产精品久久久久一区二区三区| 色婷婷综合久久久久中文| 久久综合亚洲色HEZYO社区| 久久er国产精品免费观看8| 国产成人精品久久二区二区| 性欧美丰满熟妇XXXX性久久久| 久久综合亚洲色HEZYO国产| 中文字幕亚洲综合久久| 久久精品国产99国产精偷| 国产精品青草久久久久婷婷| 久久久久无码精品国产| 久久久久亚洲AV无码麻豆| 人妻丰满AV无码久久不卡| 日韩人妻无码精品久久免费一 | 91麻豆国产精品91久久久| 99久久精品免费观看国产| 91精品国产高清久久久久久国产嫩草| 久久精品国产亚洲AV大全| 欧美一区二区三区久久综合| 色诱久久久久综合网ywww| 俺来也俺去啦久久综合网|