图——邻接矩阵
题目:采用邻接矩阵存储结构,编写拓扑排序算法输出拓扑序列。
算法逻辑:
①首先,定义一个邻接矩阵存储结构的图g;定义createAdjMatrixGraph函数用于创建邻接矩阵;定义一个LocateVertex函数,用于返回顶点v在图g中的位置;调用这两个函数创建邻接矩阵;
②使用循环输出邻接矩阵;
③定义一个队列Q,用于输出拓扑排序;
④定义一个createAOVsorted函数用于进行拓扑排序;调用该函数进行拓扑排序,并输出;
源代码:
#include<stdio.h>
#define MAX_VERTEX_NUM 10 /*最多顶点个数*/
#define INFINITY 32767 /*无穷大*/
typedef int ElemType;
#include"sqQueue.h" /*使用队列输出拓扑排序*/
typedef char VertexData; /*假设顶点数据为字符型*/
typedef int ArcNode;
typedef struct{
VertexData vexs[MAX_VERTEX_NUM]; /*顶点向量*/
ArcNode arcs [MAX_VERTEX_NUM][MAX_VERTEX_NUM]; /*邻接矩阵*/
int vexnum, arcnum; /*图的顶点数和弧数*/
int rudushu[MAX_VERTEX_NUM]; /*顶点的入度数*/
} AdjMatrix; /*(Adjacency Matrix Graph)*/
//若顶点v在图G中存在,则返回顶点v在图G中的位置。
//若图G中没有顶点v,则函数返回值为“空”。
int LocateVertex(AdjMatrix *g,VertexData v)
{
int i;
for(i=0;i<g->vexnum;i++){
if(g->vexs[i]==v){
return i;
}
}
return -1;
}
//返回图G中的第i个顶点的值。
VertexData GetVertex(AdjMatrix *g,int i)
{
return g->vexs[i];
}
//创建邻接矩阵
void createAdjMatrixGraph(AdjMatrix *g){
int n;
int i,j;
char v,w;
int vi,vw;
printf("请输入图的顶点个数:");
scanf("%d",&n);
g->vexnum=n;
for(i=1;i<=n;i++){
printf("请输入第%d个顶点的信息:",i);
scanf(" %c",&v);
g->vexs[i-1] = v;
for (j=0;j<n;j++){
g->arcs[i-1][j]=0;
}
g->rudushu[i-1]=0;
}
printf("请输入图的边数:");
scanf("%d",&n);
g->arcnum=n;
for(i=1;i<=n;i++){
printf("请输入第%d条边的信息:",i);
scanf(" %c,%c",&v,&w);
vi=LocateVertex(g,v);
vw=LocateVertex(g,w);
if(vi==-1 || vw==-1){
continue;
}
g->arcs[vi][vw]=1;
}
}
//进行拓扑排序
void createAOVsorted(AdjMatrix *g,Queue *Q){
int i,j,k;
for (i=0;i<g->vexnum;i++){ //计算每个顶点的入度数
for (j=0;j<g->vexnum;j++){
if (g->arcs[j][i]!=0){
g->rudushu[i]++;
}
}
}
printf("\n");
for (i=0;i<g->vexnum;i++){ //输出每个顶点的入度数
printf("%c顶点的入度数为:%d\n",g->vexs[i],g->rudushu[i]);
}
printf("\n");
//遍历图的每个顶点,若有入度数为0的顶点,将其入队
for (i=0;i<g->vexnum;i++){
if (g->rudushu[i]==0){
EnQueue(Q,i);
}
}
ElemType e; //e用来接受出队的数据
printf("拓扑排序为:\n");
while ( !(QueueEmpty(Q)) ){ //队列不为空就循环
DeQueue(Q,&e); //从队列中取出第一个顶点,出队
printf("%d-",e); //并将其输出
for (k=0;k<g->vexnum;k++){ //设置循环,找出该顶点的所有邻接点
if (g->arcs[e][k]!=0){ //若是邻接点
g->rudushu[k]--; //该邻接点入减一
g->arcs[e][k]=0;
//若减后的该邻接点入度为0,则将其入队
if (g->rudushu[k]==0){
EnQueue(Q,k);
}
}
}
}
}
int main()
{
AdjMatrix g; //定义一个邻接矩阵存储结构的图g
int i,j;
int v,w;
createAdjMatrixGraph(&g); //创建邻接矩阵
printf("\n");
for(i=0;i<g.vexnum;i++){ //输出邻接矩阵
for(j=0;j<g.vexnum;j++){
printf("%2d",g.arcs[i][j]);
}
printf("\n");
}
Queue Q; //使用队列输出拓扑排序
InitQueue(&Q); //初始化队列
createAOVsorted(&g,&Q); //进行拓扑排序
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类