概述
1. 将邻接表转换成邻接矩阵
main.cpp
void Convert(ALGraph G,MGraph &M){
M.vexnum = G.vexnum;
M.arcnum = G.arcnum;
for(int i=1;i<=G.vexnum;i++)
for(int j=1;j<=G.vexnum;j++)
M.Edge[i][j] = 0;
for(int i=1;i<=G.vexnum;i++){
ArcNode *p = G.vertices[i].first->next;
M.Vex[i] = G.vertices[i].data;
while(p){
M.Edge[i][p->adjvex] = 1;
p = p->next;
}
}
}
// 图的邻接表转换成邻接矩阵
运行结果:
所表示的图为:
实现邻接表的参考代码在这篇博客:数据结构(C语言版)严蔚敏(线性表、队列、栈、串、树、图等数据结构参考代码,持续更新中。。。)
2. 将邻接矩阵转换成邻接表
main.cpp
void Convert2(MGraph M,ALGraph &G){
G.arcnum = M.arcnum;
G.vexnum = M.vexnum;
for(int i=1;i<=M.vexnum;i++){
G.vertices[i].data = M.Vex[i];
G.vertices[i].first = (ArcNode*)malloc(sizeof(ArcNode));
ArcNode *p = G.vertices[i].first,*q;
p->next = NULL;
for(int j=1;j<=M.vexnum;j++){
if(M.Edge[i][j]!=0){
q = (ArcNode*)malloc(sizeof(ArcNode));
q->adjvex = j;
q->next = p->next;
p->next = q;
}
}
}
}
// 图的邻接矩阵转换成邻接表
运行结果:
所表示的图和1一样。
3. 求图的拓扑排序序列
int indegree[MaxVertexNum];
void getIndegree(ALGraph G){
for(int i=1;i<=G.vexnum;i++)
indegree[i] = 0;
for(int i=1;i<=G.vexnum;i++){
ArcNode *p = G.vertices[i].first->next;
while(p){
indegree[p->adjvex]++;
p = p->next;
}
}
}
// 邻接表求图的各顶点的入度
bool TopologicalSort(ALGraph G){
int Gs[MaxVertexNum];
// 用栈,这里用数组代替
int i=0;
for(int v=1;v<=G.vexnum;v++)
if(indegree[v] == 0)
Gs[i++] = v;
// 将入度为0的顶点入栈
int count_1 = 0;
// 计数,记录当前已经输出的顶点数
while(i>0){
int v1 = Gs[--i];
printf("%d",v1);
count_1++;
for(ArcNode *p = G.vertices[v1].first->next;p;p=p->next){
if((--indegree[p->adjvex])==0)
Gs[i++] = p->adjvex;
}
}
if(count_1<G.vexnum) // 有向图中有回路
return false;
else
return true;
}
// 求拓扑排序序列
运行结果:
表示的有向图为:
有向无环图(DAG)
拓扑排序:
- 从AOV网中选择一个没有前驱的顶点并输出;
- 从网中删除该顶点和所有以它为起点的有向边;
- 重复1,2直到当前的AOV网为空或者当前网中不存在无前驱的顶点为止。
最后
以上就是独特牛排为你收集整理的数据结构(C语言版)严蔚敏---图的操作的相关代码的全部内容,希望文章能够帮你解决数据结构(C语言版)严蔚敏---图的操作的相关代码所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复