//-----------------------------------------------------------------------------+ // Copyright (C), 1998-2007, Beijing Tangent Software Co. Ltd. // = FileName : TGraph.cpp // = Version : ver2.0 // = Author : xlc // = CreateDate : 2002-09-09 // = Description: ÀàµÄ¶¨Òå // = Maintainers: // //-----------------------------------------------------------------------------+ #include "StdAfx.h" #include "TGraph.h" TGraph::~TGraph() { UnConnect(); } long TGraph::GetNodeNum()const { return m_allNode.GetLength(); } TGraphNode* TGraph::operator[](long i) { return m_allNode[i]; } void TGraph::DelNode(long i) { m_allNode.Del(i); } long TGraph::CheckNode(TGraphNode*pNode,TTable *pLstArcFree/*=NULL*/) { return CheckNode(Find(*pNode),pLstArcFree); } long TGraph::GetArcNum()const { return m_allArc.GetLength(); } TGraphArc* TGraph::operator()(long i) { return m_allArc[i]; } void TGraph::DelArc(long i) { m_allArc.Del(i); } long TGraph::CheckArc(TGraphArc*pArc) { return CheckArc(Find(*pArc)); } void TGraph::Clear() { UnConnect(); m_allNode.Clear(); m_allArc.Clear(); } void TGraph::ClearArc() { m_allArc.Clear(); } void TGraph::ClearNode() { m_allNode.Clear(); } void TGraph::UnConnect() { for (m_allNode.MoveToFirst();!m_allNode.IsOut();m_allNode.MoveToNext()) { m_allNode.GetCurData()->UnConnect(); } for (m_allArc.MoveToFirst();!m_allArc.IsOut();m_allArc.MoveToNext()) { m_allArc.GetCurData()->UnConnect(); } } long TGraph::Find(const TGraphNode&n) { if (m_allNode.BFindDataTo(n)) { return m_allNode.GetCur(); } else { return NOT_FOUND; } } long TGraph::Find(const TGraphArc&a) { if (m_allArc.BFindDataTo(a)) { return m_allArc.GetCur(); } else { return NOT_FOUND; } } long TGraph::operator << (TGraphNode* pNode) { if (!m_allNode.SortIn(pNode)) { m_allNode.GetCurData()->Conbine(pNode); delete pNode; } return m_allNode.GetCur(); } long TGraph::operator << (TGraphArc* pArc) { if (m_allArc.SortIn(pArc)) { pArc->Connect(); } else { delete pArc; } return m_allArc.GetCur(); } long TGraph::Create(TGraphArc*pArc) { long idNode0 = (*this) << pArc->GetNode(0); pArc->SetNode(0,(*this)[idNode0]); long idNode1 = (*this) << pArc->GetNode(1); pArc->SetNode(1,(*this)[idNode1]); return (*this) << pArc; } long TGraph::CheckArc(long i) { TGraphArc *pArc = m_allArc.Fetch(i); TGraphNode*pNode0 = pArc->GetNode(0); TGraphNode*pNode1 = pArc->GetNode(1); pArc->UnConnect(); pArc->SetNode(0,pNode0); pArc->SetNode(1,pNode1); return (*this) << pArc; } long TGraph::CheckNode(long i,TTable *pLstArcFree) { TGraphNode *pNode = m_allNode.Fetch(i); TList lstArc; for (long j = 0;jGetArcNum();j++) { TGraphArc *pArc = pNode->GetArc(j); TGraphNode*pNode0 = pArc->GetNode(0); TGraphNode*pNode1 = pArc->GetNode(1); pArc->UnConnect(); pArc->SetNode(0,pNode0); pArc->SetNode(1,pNode1); lstArc << pArc; } long iDest = (*this) << pNode; TGraphNode *pNodeDest = m_allNode[iDest]; for (lstArc.MoveToFirst();!lstArc.IsOut();lstArc.MoveToNext()) { TGraphArc *pArc = lstArc.GetCurData(); if (pArc->GetNode(0) == pNode) { pArc->SetNode(0,pNodeDest); } if (pArc->GetNode(1) == pNode) { pArc->SetNode(1,pNodeDest); } if (m_allArc.FindTo(pArc)) { m_allArc.FetchCur(); (*this) << pArc; } else if (pLstArcFree != NULL) { (*pLstArcFree) << pArc; } } return iDest; }