如何用C语言编写实现图的邻接矩阵存储的代码?
- 内容介绍
- 文章标签
- 相关推荐
本文共计828个文字,预计阅读时间需要4分钟。
使用邻接矩阵可以方便地判断任意两个顶点之间是否存在边(或路径),并计算每个顶点的度。
以下是用C语言实现的基本代码示例:
c#include
#define MAX_VERTICES 100
int graph[MAX_VERTICES][MAX_VERTICES]; // 邻接矩阵int numVertices; // 顶点数
// 初始化邻接矩阵void initializeGraph(int n) { numVertices=n; for (int i=0; i // 添加边void addEdge(int start, int end) { graph[start][end]=1; graph[end][start]=1; // 无向图} // 检查两个顶点之间是否有边int isEdge(int start, int end) { return graph[start][end]==1;} // 计算顶点的度int vertexDegree(int vertex) { int degree=0; for (int i=0; i int main() { int n=4; // 示例图,4个顶点 initializeGraph(n); addEdge(0, 1); addEdge(0, 2); addEdge(1, 3); // 输出两个顶点之间的边关系 printf(Edge between vertex 0 and vertex 1: %s\n, isEdge(0, 1) ? Yes : No); printf(Degree of vertex 0: %d\n, vertexDegree(0)); printf(Degree of vertex 1: %d\n, vertexDegree(1)); printf(Degree of vertex 2: %d\n, vertexDegree(2)); printf(Degree of vertex 3: %d\n, vertexDegree(3)); return 0;} 利用邻接矩阵容易判定任意两个顶点之间是否有边(或弧)相连,并容易求得各个顶点的度。 c语言代码实现如下:
#include<stdio.h>
#include<stdlib.h>
#define MAX_VER_NUM 50
typedef char VertexType;
typedef enum
{
DG,UDG
}GraphType;
typedef struct
{
VertexType vexs[MAX_VER_NUM]; //顶点向量
int arcs[MAX_VER_NUM][MAX_VER_NUM]; //邻接矩阵
int vexnum,arcnum; //图的当前顶点数和弧数
GraphType type; //图的种类标志
}MGraph;
//根据名称得到指定顶点在顶点集合中的下标
//vex 顶点
//return 如果找到,则返回下标,否则,返回0
int getIndexOfVexs(char vex,MGraph *MG)
{
int i;
for(i=1;i<=MG->vexnum;i++)
{
if(MG->vexs[i]==vex)
{
return i;
}
}
return 0;
}
//创建邻接矩阵
void create_MG(MGraph *MG)
{
int i,j,k;
int v1,v2,type;
char c1,c2;
printf("Please input graph type DG(0) or UDG(1):");
scanf("%d",&type);
if(type==0)
{
MG->type=DG;
}
else if(type==1)
{
MG->type=UDG;
}
else
{
printf("Please input correct graph type DG(0) or UDG(1)!");
return;
}
printf("Please input vexnum:");
scanf("%d",&MG->vexnum);
printf("Please input arcnum:");
scanf("%d",&MG->arcnum);
getchar();
for(i=1;i<=MG->vexnum;i++)
{
printf("Please input %dth vex(char):",i);
scanf("%c",&MG->vexs[i]);
getchar();
}
//初始化邻接矩阵
for(i=1;i<=MG->vexnum;i++)
{
for (j=1;j<=MG->vexnum;j++)
{
MG->arcs[i][j]=0;
}
}
//输入边的信息,建立邻接矩阵
for(k=1;k<=MG->arcnum;k++)
{
printf("Please input %dth arc v1(char) v2(char):",k);
scanf("%c %c",&c1,&c2);
v1=getIndexOfVexs(c1,MG);
v2=getIndexOfVexs(c2,MG);
if(MG->type==-1)
{
MG->arcs[v1][v2]=MG->arcs[v2][v1]=1;
}
else
{
MG->arcs[v1][v2]=1;
}
getchar();
}
}
//打印邻接矩阵和顶点信息
void print_MG(MGraph MG)
{
int i,j;
if(MG.type==DG)
{
printf("Graph type: Direct graph\n");
}
else
{
printf("Graph type: Undirect graph\n");
}
printf("Graph vertex number: %d\n",MG.vexnum);
printf("Graph arc number: %d\n",MG.arcnum);
printf("Vertex set:");
for(i=1;i<=MG.vexnum;i++)
{
printf("%c",MG.vexs[i]);
}
printf("\nAdjacency Matrix:\n");
for(i=1;i<=MG.vexnum;i++)
{
for(j=1;j<=MG.vexnum;j++)
{
printf("%d",MG.arcs[i][j]);
}
printf("\n");
}
}
//主函数
int main(void)
{
MGraph MG;
create_MG(&MG);
print_MG(MG);
return 0;
}
得到的结果如下图所示: 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持自由互联。
本文共计828个文字,预计阅读时间需要4分钟。
使用邻接矩阵可以方便地判断任意两个顶点之间是否存在边(或路径),并计算每个顶点的度。
以下是用C语言实现的基本代码示例:
c#include
#define MAX_VERTICES 100
int graph[MAX_VERTICES][MAX_VERTICES]; // 邻接矩阵int numVertices; // 顶点数
// 初始化邻接矩阵void initializeGraph(int n) { numVertices=n; for (int i=0; i // 添加边void addEdge(int start, int end) { graph[start][end]=1; graph[end][start]=1; // 无向图} // 检查两个顶点之间是否有边int isEdge(int start, int end) { return graph[start][end]==1;} // 计算顶点的度int vertexDegree(int vertex) { int degree=0; for (int i=0; i int main() { int n=4; // 示例图,4个顶点 initializeGraph(n); addEdge(0, 1); addEdge(0, 2); addEdge(1, 3); // 输出两个顶点之间的边关系 printf(Edge between vertex 0 and vertex 1: %s\n, isEdge(0, 1) ? Yes : No); printf(Degree of vertex 0: %d\n, vertexDegree(0)); printf(Degree of vertex 1: %d\n, vertexDegree(1)); printf(Degree of vertex 2: %d\n, vertexDegree(2)); printf(Degree of vertex 3: %d\n, vertexDegree(3)); return 0;} 利用邻接矩阵容易判定任意两个顶点之间是否有边(或弧)相连,并容易求得各个顶点的度。 c语言代码实现如下:
#include<stdio.h>
#include<stdlib.h>
#define MAX_VER_NUM 50
typedef char VertexType;
typedef enum
{
DG,UDG
}GraphType;
typedef struct
{
VertexType vexs[MAX_VER_NUM]; //顶点向量
int arcs[MAX_VER_NUM][MAX_VER_NUM]; //邻接矩阵
int vexnum,arcnum; //图的当前顶点数和弧数
GraphType type; //图的种类标志
}MGraph;
//根据名称得到指定顶点在顶点集合中的下标
//vex 顶点
//return 如果找到,则返回下标,否则,返回0
int getIndexOfVexs(char vex,MGraph *MG)
{
int i;
for(i=1;i<=MG->vexnum;i++)
{
if(MG->vexs[i]==vex)
{
return i;
}
}
return 0;
}
//创建邻接矩阵
void create_MG(MGraph *MG)
{
int i,j,k;
int v1,v2,type;
char c1,c2;
printf("Please input graph type DG(0) or UDG(1):");
scanf("%d",&type);
if(type==0)
{
MG->type=DG;
}
else if(type==1)
{
MG->type=UDG;
}
else
{
printf("Please input correct graph type DG(0) or UDG(1)!");
return;
}
printf("Please input vexnum:");
scanf("%d",&MG->vexnum);
printf("Please input arcnum:");
scanf("%d",&MG->arcnum);
getchar();
for(i=1;i<=MG->vexnum;i++)
{
printf("Please input %dth vex(char):",i);
scanf("%c",&MG->vexs[i]);
getchar();
}
//初始化邻接矩阵
for(i=1;i<=MG->vexnum;i++)
{
for (j=1;j<=MG->vexnum;j++)
{
MG->arcs[i][j]=0;
}
}
//输入边的信息,建立邻接矩阵
for(k=1;k<=MG->arcnum;k++)
{
printf("Please input %dth arc v1(char) v2(char):",k);
scanf("%c %c",&c1,&c2);
v1=getIndexOfVexs(c1,MG);
v2=getIndexOfVexs(c2,MG);
if(MG->type==-1)
{
MG->arcs[v1][v2]=MG->arcs[v2][v1]=1;
}
else
{
MG->arcs[v1][v2]=1;
}
getchar();
}
}
//打印邻接矩阵和顶点信息
void print_MG(MGraph MG)
{
int i,j;
if(MG.type==DG)
{
printf("Graph type: Direct graph\n");
}
else
{
printf("Graph type: Undirect graph\n");
}
printf("Graph vertex number: %d\n",MG.vexnum);
printf("Graph arc number: %d\n",MG.arcnum);
printf("Vertex set:");
for(i=1;i<=MG.vexnum;i++)
{
printf("%c",MG.vexs[i]);
}
printf("\nAdjacency Matrix:\n");
for(i=1;i<=MG.vexnum;i++)
{
for(j=1;j<=MG.vexnum;j++)
{
printf("%d",MG.arcs[i][j]);
}
printf("\n");
}
}
//主函数
int main(void)
{
MGraph MG;
create_MG(&MG);
print_MG(MG);
return 0;
}
得到的结果如下图所示: 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持自由互联。

