⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mrgentreenodeint.h

📁 Games programming all in one code chapter 17
💻 H
字号:
#ifndef MRGENTREENODEINT_H
#define MRGENTREENODEINT_H

#include "mrListNodeGenTreeInt.h"
#include "mrDatatypes.h"
#include <iostream.h>

// a general tree-node class using integers.
class mrGenTreeNodeInt
{
public:
    mrInt m_iValue;
    mrListNodeGenTreeInt* m_kFirstChild;
    mrListNodeGenTreeInt* m_kCurrent;

    mrGenTreeNodeInt( mrInt value );
    ~mrGenTreeNodeInt();
    void Start();
    void MoveForward();
    mrGenTreeNodeInt* GetChild();
    mrBool32 IsChildValid();
    void RemoveCurrentChild();
    void AppendChild( mrGenTreeNodeInt* child );
    void PreOrder();
    void PostOrder();
};


// default constructor:
mrGenTreeNodeInt::mrGenTreeNodeInt( mrInt value )
{
    m_iValue = value;
    m_kFirstChild = 0;
    m_kCurrent = 0;
}

mrGenTreeNodeInt::~mrGenTreeNodeInt()
{
    Start();
    while( IsChildValid() )
    {
        delete GetChild();
        RemoveCurrentChild();
    }
}
 
// Move the child pointer to the first child
void mrGenTreeNodeInt::Start()
{
    m_kCurrent = m_kFirstChild;
}

// Move the current child pointer to the next child.
void mrGenTreeNodeInt::MoveForward()
{
    if( 0 != m_kCurrent )
        m_kCurrent = m_kCurrent->m_kNext;
}

// return a pointer to the current child node
mrGenTreeNodeInt* mrGenTreeNodeInt::GetChild()
{
    return m_kCurrent->m_kNode;
}

// determine whether the current child is valid or not
mrBool32 mrGenTreeNodeInt::IsChildValid()
{
    if( 0 != m_kCurrent )
        return mrTrue;
    return mrFalse;
}

// remove the current node
void mrGenTreeNodeInt::RemoveCurrentChild() 
{
    mrListNodeGenTreeInt* previous;
    if( 0 == m_kCurrent )
        return;
    if( m_kFirstChild == m_kCurrent ) 
    {
        m_kCurrent = m_kFirstChild->m_kNext;
        delete m_kFirstChild;
        m_kFirstChild = m_kCurrent;
    }
    else 
    {
        previous = m_kFirstChild;
        while( previous->m_kNext != m_kCurrent )
            previous = previous->m_kNext;
        m_kCurrent = m_kCurrent->m_kNext;
        delete previous->m_kNext;
        previous->m_kNext = m_kCurrent;
    }
}

// append a child node to the end of the list
void mrGenTreeNodeInt::AppendChild( mrGenTreeNodeInt* child ) 
{
    mrListNodeGenTreeInt* node = new mrListNodeGenTreeInt;
    node->m_kNext = 0;
    node->m_kNode = child;
    mrListNodeGenTreeInt* temp = m_kFirstChild;
    if( 0 != temp ) 
    {
        while( 0 != temp->m_kNext )
        temp = temp->m_kNext;
        temp->m_kNext = node;
    }
    else 
    {
        m_kFirstChild = node;
    }
}


void mrGenTreeNodeInt::PreOrder()
{
    cout << m_iValue << ", ";
    for( Start(); IsChildValid(); MoveForward() )
        GetChild()->PreOrder();
}

void mrGenTreeNodeInt::PostOrder()
{
    for( Start(); IsChildValid(); MoveForward() )
        GetChild()->PostOrder();
    cout << m_iValue << ", ";
}


#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -