实现图的邻接矩阵存储结构及相关操作函数。
对图的基本操作进行测试,包括创建图、插入删除顶点和边等。
实现求顶点度和搜索顶点功能的函数。
代码实现:
void InserdEdge(MatGraph& g, char* v1, char* v2, int w) { //该函数的作用是在无向图中插入一条边,其中v1和v2为边的两个顶点,w为边的权值。
int i = SearchVexs(g, v1);//查询顶点v1是否在图g中存在
int j = SearchVexs(g, v2);//查询顶点v2是否在图g中存在
if (i == -1 || j == -1) {
printf("顶点不存在");
return; //调用SearchVexs函数查找v1和v2在图中的位置,如果返回值为-1则说明该顶点不存在,插入边失败
}
g.edges[i][j] = w;
g.edges[j][i] = w; //由于是无向图,因此需要将邻接矩阵对称地赋值。
}
void DeletedEdge(MatGraph& g, char* v1, char* v2) { //若顶点v1,v2存在并且存在一条无向边,则删除这对顶点之间的无向边
int i = SearchVexs(g, v1);//查询顶点v1是否在图g中存在
int j = SearchVexs(g, v2);//查询顶点v2是否在图g中存在
if (i == -1 || j == -1) {
printf("顶点不存在");//调用SearchVexs函数查找v1和v2在图中的位置,如果返回值为-1则说明该顶点不存在,删除边失败
return;
}
g.edges[i][j] = INF;
g.edges[j][i] = INF;// 将邻接矩阵中对应位置的值赋为INF,表示v1和v2之间的边被删除
} //由于是无向图,因此需要将邻接矩阵对称地赋值。
void InserdVexs(MatGraph& g, char* v) { //在无向图g中插入一个新顶点v
int i;
if (g.n > MAXVEX)
{
printf("顶点数量已达上限"); return;
}
strcpy(g.vexs[g.n].data, v);//把新顶点v存入数组g.vexs顶点集合
g.vexs[g.n].adjvex = g.n + 1;//顶点编号+1
for (i = 0; i <= g.n; i++) {//初始化为无从大
g.edges[i][g.n] = INF;
g.edges[g.n][i] = INF;//将顶点v的数据存入图的顶点数组中,然后将该顶点与其他顶点之间的边的权值初始化为INF
}
g.n++;//最后,顶点数加1
}
void main() //主函数
{
MatGraph g;
int A[][MAXVEX] = {
{INF, 2, 5, 3, INF,INF,INF},
{2, INF, 2, INF,INF, 8, INF},
{5,2,INF, 1, 3, 5, INF},
{3,INF,1,INF, 5, INF,INF},
{INF,INF,3,5, INF, 3, 9},
{INF,8,5,INF,3,INF, 5},
{INF,INF,INF,INF,9,5,INF} };
int n = 7, e = 12;
char* a, * b, * c, * d, * h;
a = (char*)malloc(10 * sizeof(char));
b = (char*)malloc(10 * sizeof(char));
c = (char*)malloc(10 * sizeof(char));
d = (char*)malloc(10 * sizeof(char));
h = (char*)malloc(10 * sizeof(char));
CreateGraph(g, A, n, e); //建立图的邻接矩阵
printf("图G的存储结构:\n");
DispGraph(g);
printf("图G中所有顶点的度:\n");
printf(" 顶点\t度\n");
for (int i = 0; i < g.n; i++)
printf(" %s\t%d\n", g.vexs[i].data, Degree(g, i + 1));
printf("\n");
printf("在无向图g中插入一个新顶点v\n");
printf("请输入要插入的顶点:");
scanf("%s", a, 10);
InserdVexs(g, a);//在无向图g中插入一个新顶点v
DispGraph(g);
printf("\n");
printf("若顶点v1,v2存在,则在这对顶点之间插入一条权值为w的无向边\n");
printf("请输入两个顶点:");
scanf("%s", b, 10);
scanf("%s", c, 10);
InserdEdge(g, b, c, 9); //若顶点v1,v2存在,则在这对顶点之间插入一条权值为w的无向边
DispGraph(g);
printf("\n");
printf("若顶点v1,v2存在并且存在一条无向边,则删除这对顶点之间的无向边\n");
printf("请输入两个顶点:");
scanf("%s", d, 10);
scanf("%s", h, 10);
DeletedEdge(g, d, h);//若顶点v1,v2存在并且存在一条无向边,则删除这对顶点之间的无向边
DispGraph(g);
printf("\n");
printf("销毁图\n");
DestroyGraph(g);
}