16,472
社区成员
发帖
与我相关
我的任务
分享
// 图遍历.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
return 0;
}
#include <iostream>
using namespace std;
#include <vector>
#include <list>
#include <string>
#define MAX_VERTEX_NUM 8
class CEdge
{
friend class CGraph;
private:
int ivex;
int jvex;
bool mark;
public:
//CEdge *info;
CEdge *ilink;
CEdge *jlink;
int GetIvex()const{return ivex;}
int GetJvex()const{return jvex;}
bool GetMark()const{return mark;}
void SetIvex(const int i){ivex=i;}
void SetJvex(const int j){jvex=j;}
void SetMark(const bool m){mark=m;}
CEdge():ivex(0),jvex(0),mark(0){}
CEdge (const CEdge&ce):ivex(ce.GetIvex()),jvex(ce.GetJvex()),mark(ce.GetMark()),ilink(ce.ilink),jlink(ce.jlink){}
CEdge (const int i, const int j,const bool m):ivex(i),jvex(j),mark(m){}
};
class CVertex
{
friend class CGraph;
private:
string data;
public:
CVertex *parent;
CVertex *children;
CEdge *firstedge;
string GetData()const{return data;}
void SetData(const string d){data=d;}
CVertex():data("0"){}
CVertex(const CVertex&v):data(v.GetData()),firstedge(v.firstedge){}
CVertex(const string d):data(d){}
};
typedef vector<CVertex>VecVertex;
typedef vector<CEdge>VecEdge;
class CGraph
{
public:
VecVertex vertexes;
VecEdge edges;
void addAnEdge(int i,int j);
void addAnVertex(string i);
void linkVertexToEdge(CVertex *v,CEdge *e);
void InitEdge(CEdge *e);
//void linkIlinkToEdge(CEdge *e1,CEdge *e2);
//void linkJlinkToEdge(CEdge *e1,CEdge *e2);
void linkAllEdge();
};
void CGraph::addAnVertex(string i)
{
CVertex *ver=new CVertex;
ver->SetData(i);
vertexes.push_back(*ver);
}
void CGraph::addAnEdge(int i,int j)
{
CEdge *ed=new CEdge;
ed->SetIvex(i);
ed->SetJvex(j);
ed->SetMark(0);
edges.push_back(*ed);
}
void CGraph::InitEdge(CEdge *e)
{
e->ilink=new CEdge;
e->ilink=NULL;
e->jlink=new CEdge;
e->jlink=NULL;
}
void CGraph::linkVertexToEdge(CVertex *v,CEdge *e)
{
v->firstedge=new CEdge;
v->firstedge=e;
}
/*void CGraph::linkIlinkToEdge(CEdge *e1,CEdge *e2)
{
//InitEdge(e1);
//InitEdge(e2);
e1->ilink=e2;
e2->ilink=NULL;
e2->jlink=NULL;
}
void CGraph::linkJlinkToEdge(CEdge *e1,CEdge *e2)
{
//InitEdge(e1);
//InitEdge(e2);
e1->jlink=e2;
e2->ilink=NULL;
e2->jlink=NULL;
}*/
void CGraph::linkAllEdge()
{
int iorj;
for(unsigned int i=0;i<edges.size();i++)
{
InitEdge(&edges[i]);
}//全部初始化
for(unsigned int i=0;i<vertexes.size();i++)
{
unsigned int j=0;
while(j<edges.size())
{
while(edges[j].GetIvex()!=i||edges[i].GetJvex()!=i)
j++;
if(edges[j].GetIvex()==i)
iorj=0;
else if(edges[j].GetJvex()==i)
iorj=1;
unsigned int k=j;
while((edges[k].GetIvex()!=i||edges[k].GetJvex()!=i)&&k<edges.size())
k++;
if((edges[k].GetIvex()==i||edges[k].GetJvex()==i)&&iorj==0)
{
*edges[j].ilink=edges[k];
j=k;
}
else if((edges[k].GetIvex()==i||edges[k].GetJvex()==i)&&iorj==1)
{
*edges[j].jlink=edges[k];
j=k;
}
}
}
}
void main()
{
CGraph g;
g.addAnVertex("A");
g.addAnVertex("B");
g.addAnVertex("C");
g.addAnVertex("D");
g.addAnEdge(0,1);
g.addAnEdge(0,2);
g.addAnEdge(1,3);
g.linkAllEdge();
system("pause");
}