• <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
            狠狠色丁香婷婷久久综合不卡| 好久久免费视频高清| 国产精品久久久久久久久久影院 | 久久亚洲色一区二区三区| 天天综合久久一二三区| 粉嫩小泬无遮挡久久久久久| 99久久99久久精品国产片| 成人午夜精品无码区久久| 国产精品一区二区久久精品无码| 国产亚洲美女精品久久久2020| 情人伊人久久综合亚洲| 亚洲AV日韩精品久久久久久| 久久综合九色欧美综合狠狠| 精品久久久久久久| 久久精品一区二区三区AV| 国产精自产拍久久久久久蜜| 久久精品无码一区二区无码| 久久久久av无码免费网| 久久精品国产精品亜洲毛片| 狠狠色丁香婷综合久久| 少妇内射兰兰久久| 国产亚洲精品久久久久秋霞| 久久精品免费全国观看国产| 三级韩国一区久久二区综合| 久久精品国产99国产精品| 成人午夜精品久久久久久久小说| 久久成人国产精品| 久久精品aⅴ无码中文字字幕不卡 久久精品aⅴ无码中文字字幕重口 | 996久久国产精品线观看| 深夜久久AAAAA级毛片免费看 | 色欲综合久久中文字幕网| 国产精品久久久久免费a∨| 久久精品国产一区二区| 久久精品国产亚洲5555| 国产精品女同一区二区久久| 久久国产精品国语对白| 伊人久久综在合线亚洲2019| 国产高清美女一级a毛片久久w| 国产99久久九九精品无码| 久久久久国产精品嫩草影院| 久久综合狠狠综合久久97色|