Files
gjm 164968b62e chore
把非utf8-bom编码的cpp/h文件改为 utf8 bom 编码, msvc识别utf8编码时,如果不是bom格式的,会使用当前cp_oem来解码.
2026-10-04 00:04:20 +08:00

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;
}