数据结构 图(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();
}
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();
}
相关文章推荐
- 数据结构队列C++代码实现
- 数据结构——树(9)——二叉搜索树的操作实现C++代码
- 程序员代码面试指南:IT名企算法与数据结构题目最优解-字符串问题:C/C++语言实现
- 【C++数据结构】哈夫曼树代码实现
- C++ 数据结构链表的实现代码
- 数据结构—中缀表达式转后缀表达式算法及实现—栈的应用—计算表达式(C++代码实现)(1)
- 数据结构之栈的初始化、创建、入栈、出栈、销毁-c++代码实现及运行实例结果
- 自己动手实现数据结构——排序算法1(冒泡、插入、归并、简单选择)(C++实现)
- 数据结构的基础-单向链表所构造的栈 c++实现
- 数据结构(C++版) 栈的链接存储结构及实现
- B-tree的代码实现 - c / c++ 版本
- 每日进步之leetcode第16题C++实现代码(
- c++截取屏幕图片并保存(函数代码实现)
- C++全密码生成的实现代码
- C++实现数据结构线性表顺序存储结构
- 数据结构中最大值堆C++实现
- 桥接模式及C++代码实现
- 数据结构 hashtable C++实现 链式
- 螺旋队列C++代码实现实例及运行结果
- 子集和问题 及 c++ 代码实现