//-----------------------------------------------------------------------------+ // Copyright (C), 1998-2007, Beijing Tangent Software Co. Ltd. // = FileName : TGraphNode.cpp // = Version : ver2.0 // = Author : xlc // = CreateDate : 2002-09-09 // = Description: 类的定义 // = Maintainers: // //-----------------------------------------------------------------------------+ #include "StdAfx.h" #include "TGraphNode.h" #include "TWPushVar.h" TGraphNode* TGraphNode::s_pStartNode = NULL; TGraphNode::~TGraphNode() { UnConnect(); } void TGraphNode::ClearArc() { TDualPtrList temp; temp.Conbine(m_allArc); } bool TGraphNode::IsAloneNode()const { return m_allArc.IsEmpty(); } bool TGraphNode::IsEndNode()const { return m_allArc.GetLength() == 1; } long TGraphNode::GetArcNum()const { return m_allArc.GetLength(); } TGraphArc* TGraphNode::GetArc(long i)const { return m_allArc.GetAt(i); } long TGraphNode::FindArc(TGraphArc*pArc)const { return m_allArc.Find(pArc); } int TGraphNode::CmpNode(const TGraphNode&n)const { return (int)(this-(&n)); } bool TGraphNode::operator == (const TGraphNode&n)const { return CmpNode(n) == 0; } bool TGraphNode::operator != (const TGraphNode&n)const { return CmpNode(n) != 0; } bool TGraphNode::operator> (const TGraphNode&n)const { return CmpNode(n)>0; } bool TGraphNode::operator< (const TGraphNode&n)const { return CmpNode(n)<0; } void TGraphNode::UnConnect() { for (m_allArc.MoveToFirst();!m_allArc.IsOut();m_allArc.MoveToNext()) { TGraphArc *pArc=m_allArc.GetCurData(); if (pArc->GetNode(0) == this) { pArc->SetNode(0,NULL); } if (pArc->GetNode(1) == this) { pArc->SetNode(1,NULL); } } ClearArc(); } bool TGraphNode::AppendArc(TGraphArc*pArc) { TWPushVar vTemp(s_pStartNode,this); return m_allArc.SortIn(pArc); } bool TGraphNode::RemoveArc(TGraphArc*pArc) { if (m_allArc.FindTo(pArc)) { m_allArc.FetchCur(); return true; } else { return false; } } void TGraphNode::Conbine(TGraphNode*pNode) { for (long i = 0;iGetArcNum();i++) { TGraphArc *pArc = pNode->GetArc(i); if (pArc->GetNode(0) == pNode) { pArc->SetNode(0,this); } if (pArc->GetNode(1) == pNode) { pArc->SetNode(1,this); } AppendArc(pArc); } pNode->ClearArc(); } TGraphArc* TGraphNode::FindNextArc(TGraphArc*pArc) { if (GetArcNum()>1 && m_allArc.FindTo(pArc)) { long iCur = m_allArc.GetCur(); return m_allArc[(iCur + 1) % m_allArc.GetLength()]; } else { return NULL; } } TGraphArc* TGraphNode::FindPreArc(TGraphArc*pArc) { if (GetArcNum()>1 && m_allArc.FindTo(pArc)) { long iCur = m_allArc.GetCur(); return m_allArc[(iCur - 1 + m_allArc.GetLength()) % m_allArc.GetLength()]; } else { return NULL; } } void TGraphNode::GetArcOut(TTable &lstArc) { for (m_allArc.MoveToFirst();!m_allArc.IsOut();m_allArc.MoveToNext()) { TGraphArc* pArc = m_allArc.GetCurData(); if (pArc->GetNode(0) == this) { lstArc< &lstArc) { for (m_allArc.MoveToFirst();!m_allArc.IsOut();m_allArc.MoveToNext()) { TGraphArc* pArc = m_allArc.GetCurData(); if (pArc->GetNode(1) == this) { lstArc<