您的位置:首页 > 理论基础 > 数据结构算法

数据结构 图(C++实现代码)

2017-08-23 16:30 36 查看
#define SIZE 10

class Edge

{

public:
Edge(int i = 0):destvalue(i),link(NULL){}
int destvalue;
Edge *link;

};

class Vertex

{

public:
Vertex():list(NULL){}
char value;
Edge *list;

};

class Graph

{

public:
Graph()
{
MaxVertex = SIZE;
NumVertex = NumEdge = 0;
vertexTable = new Vertex[MaxVertex];
}
void insertVertex(char vertex)
{
if(NumVertex < MaxVertex)
{
vertexTable[NumVertex].value = vertex;
NumVertex++;
}
}
int GetVertexPos(char v)
{
for(int i =0;i<NumVertex;i++)
{
if(vertexTable[i].value == v)
return i;
}
return -1;
}
void InsertEdge(char vertex1,char vertex2)
{
int p1 = GetVertexPos(vertex1);
int p2 = GetVertexPos(vertex2);
if(p1 == -1 || p2 == -1)
return;

//v1 - v2
Edge *ed = new Edge(p2);
ed->link = vertexTable[p1].list;
vertexTable[p1].list = ed;

//v2 - v1
ed = new Edge(p1);
ed->link = vertexTable[p2].list;
vertexTable[p2].list = ed;

NumEdge++;
}
void showGraph()
{
int i;
Edge *p = NULL;
for(i = 0;i<NumVertex;i++)
{
cout<<i<<" "<<vertexTable[i].value<<"->";
p = vertexTable[i].list;
while(p)
{
cout<<p->destvalue<<"->";
p = p->link;
}
cout<<"nul"<<endl;
}
}
void removeVertex(char vertex)
{
//删除和顶点vertex相关的边
int v = GetVertexPos(vertex);
Edge *p = vertexTable[v].list; //p指向v的链表
Edge *s,*t = NULL;
int k;
while(p != NULL)
{
k = p->destvalue; //k表示的是相关的边的下标
s = vertexTable[k].list;
while(s != NULL && s->destvalue != v)
{
t = s;
s = s->link;
}
if(s != NULL)
{
if(t == NULL)
vertexTable[k].list = s->link;
else
t->link = s->link;
delete s;
s = NULL;
}
vertexTable[v].list = p->link;
delete p;
p = vertexTable[v].list;
}

NumVertex--;
vertexTable[v].value = vertexTable[NumVertex].value;
vertexTable[v].list = vertexTable[NumVertex].list;

s = vertexTable[v].list;
while(s != NULL)
{
k = s->destvalue;
p = vertexTable[k].list;
while(p != NULL)
{
if(p->destvalue == NumVertex)
{
p->destvalue = v;
break;
}
p = p->link;
}
s = s->link;
}
}
void removeEdge(char vertex1,char vertex2)
{
int p1 = GetVertexPos(vertex1);  //c
int p2 = GetVertexPos(vertex2);  //b
if(p1 == -1 || p2 == -1)
return;

Edge *pre=NULL,*curr=NULL;
//v1 -- v2
curr = vertexTable[p1].list;
while(curr != NULL && curr->destvalue != p2)
{
pre = curr;
curr = curr->link;
}
if(curr == NULL)
return;
else
{
if(pre == NULL)
{
vertexTable[p1].list = curr->link;
}
else
{
pre->link = curr->link;
}
delete curr;
curr = NULL;
}

//v2 -- v1

pre = NULL;
curr = vertexTable[p2].list;
while(curr != NULL && curr->destvalue != p1)
{
pre = curr;
curr = curr->link;
}
if(pre == NULL)
vertexTable[p2].list = curr->link;
else
pre->link = curr->link;
delete curr;
curr = NULL;

NumEdge--;
}

private:
int MaxVertex;
int NumVertex;
Vertex *vertexTable;
int NumEdge;

};

void main()

{
Graph g;
g.insertVertex('a');
g.insertVertex('b');
g.insertVertex('c');
g.insertVertex('d');
g.insertVertex('e');
g.showGraph();
g.InsertEdge('a','b');
g.InsertEdge('a','d');
g.InsertEdge('b','c');
g.InsertEdge('b','e');
g.InsertEdge('c','d');
g.InsertEdge('c','e');
g.showGraph();

// g.removeEdge('c','b');
//g.showGraph();

g.removeVertex('c');
g.showGraph();

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: