• <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>

            聚星亭

            吾笨笨且懶散兮 急須改之而奮進(jìn)
            posts - 74, comments - 166, trackbacks - 0, articles - 0
              C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理
            /********************************************************************
              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;      
            // 關(guān)聯(lián)的值
              int        cChildren;    // 子節(jié)點(diǎn)個(gè)數(shù)
              LIST_ENTRY    ListEntry;    // 同一等級(jí)的節(jié)點(diǎn)
              LIST_ENTRY    ChildListEntry;  // 子節(jié)點(diǎn)頭
              tagTREENODE *  pParentNode;  // 父節(jié)點(diǎn)
            } 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;

            說明:以上代碼轉(zhuǎn)載與 看雪學(xué)院 論壇
            原帖地址:http://bbs.pediy.com/showthread.php?t=80173

            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            久久精品国产免费观看| 亚洲日本va午夜中文字幕久久| 久久久久久久久久久久久久| 欧美久久久久久午夜精品| 久久久无码精品亚洲日韩软件| 日本高清无卡码一区二区久久| av色综合久久天堂av色综合在| 久久99国产综合精品| 精品久久久久久国产三级| 国产精品久久新婚兰兰 | 久久精品国产99国产精品导航| 一本色道久久88—综合亚洲精品| 亚洲成色WWW久久网站| 999久久久免费国产精品播放| 久久99热这里只频精品6| 97热久久免费频精品99| 四虎影视久久久免费| 97精品久久天干天天天按摩| 开心久久婷婷综合中文字幕| 69SEX久久精品国产麻豆| 2021久久精品免费观看| 久久精品免费大片国产大片| 无码精品久久久天天影视 | 精品久久久无码人妻中文字幕 | 精品久久久中文字幕人妻| 久久国产免费直播| 好属妞这里只有精品久久| 日韩精品久久久久久久电影蜜臀 | 久久人人爽人人爽人人片AV麻豆 | 久久久久亚洲爆乳少妇无| 国产精品欧美久久久天天影视| 精品久久亚洲中文无码| 性做久久久久久久久浪潮| 欧美精品一区二区久久| 久久99精品久久久久久不卡| 久久99毛片免费观看不卡| 久久久久久久久无码精品亚洲日韩| 无码人妻久久一区二区三区蜜桃| 久久无码AV中文出轨人妻| 欧美精品丝袜久久久中文字幕 | 日批日出水久久亚洲精品tv|