• <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色 | 色狠狠久久综合网| 久久人妻少妇嫩草AV蜜桃| 色综合久久久久无码专区| 伊人久久免费视频| 久久综合色老色| 91久久精品国产91性色也| 国内精品伊人久久久影院| a级成人毛片久久| 97久久婷婷五月综合色d啪蜜芽| 久久国产精品成人免费| 久久狠狠爱亚洲综合影院| 久久久久久综合一区中文字幕 | 无码人妻精品一区二区三区久久| 俺来也俺去啦久久综合网| 2020久久精品亚洲热综合一本| 久久综合狠狠综合久久激情 | 久久精品aⅴ无码中文字字幕不卡| 伊人久久综在合线亚洲2019| 人妻无码中文久久久久专区| 久久午夜免费视频| 久久久久亚洲AV综合波多野结衣 | 精品欧美一区二区三区久久久| 精品无码久久久久国产动漫3d| 久久人人爽人人精品视频| 久久久久国产精品三级网| 久久久精品一区二区三区| 99精品国产在热久久无毒不卡| 久久99精品国产麻豆宅宅| 久久精品国产99国产精品亚洲| 热久久最新网站获取| 午夜福利91久久福利| 久久精品无码免费不卡| A级毛片无码久久精品免费| 久久国产精品成人免费| 夜夜亚洲天天久久| 日韩中文久久| 久久人人爽人人爽人人片AV麻烦| 亚洲香蕉网久久综合影视|