205 lines
3.4 KiB
C++
205 lines
3.4 KiB
C++
//-----------------------------------------------------------------------------+
|
|
// 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<TGraphArc*> *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<TGraphArc*> *pLstArcFree)
|
|
{
|
|
TGraphNode *pNode = m_allNode.Fetch(i);
|
|
|
|
TList<TGraphArc*> lstArc;
|
|
for (long j = 0;j<pNode->GetArcNum();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;
|
|
}
|