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

来源:互联网 发布:城市地图制作软件 编辑:程序博客网 时间:2024/06/05 06:44
#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();
}