数据结构 图(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();
}
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();
}
阅读全文
0 0
- 严蔚敏《数据结构》的全部代码实现(C语言)
- 数据结构线性表各种结构代码实现(C语言)
- 小顶堆数据结构C/C++代码实现
- 数据结构 B+树c代码实现
- 数据结构 图(C++实现代码)
- 数据结构(C语言)读书笔记6:栈的应用之括号匹配的C代码实现
- 数据结构(C实现)------- 单链表
- 数据结构(C实现)------- 链栈
- 数据结构(C实现)------- 串
- 数据结构-Vector实现(C++)
- 【数据结构】实现单链表(c++)
- 数据结构(栈)c/c++/java实现
- 数据结构与算法分析(C语言版)第二章习题2.7代码实现
- 树的三种遍历方法代码实现 (数据结构)C语言
- 数据结构中栈与队列的c语言代码实现
- 数据结构中线性表的c语言代码实现
- 数据结构中顺序栈c语言代码实现
- 数据结构伪C代码:7.图
- HDU 6168 Numbers(数列,思维)
- 《剑指offer》问题5 替换空格 Java实现
- Hadoop发行版本比较与选型
- Fizz Buzz
- HDU 6162 Ch’s gift
- 数据结构 图(C++实现代码)
- ThreadPoolTaskExecutor的配置解释
- 【Redis手册二】redis.conf 配置参数说明
- Java-最大堆的排序,插入,删除
- 分金子(360公司2017春招真题)
- Rhel7链路聚合
- [算法]行列递增数组中查找某个元素
- rabbitMQ与Spring集成
- 字符集、字符编码与存储方式的理解