#define _CRT_SECURE_NO_WARNINGS 1
//图--邻接矩阵
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
#define MAXVex 100
typedef struct
{
char vexs[MAXVex]; //顶点表
int arcs[MAXVex][MAXVex];//邻接矩阵
int vexnum, arcnum;//顶点个数,边数
}AMGraph;
//定位顶点在顶点集的位置
int VexLocate(AMGraph* G,char ch)
{
/*for (int i = 0; i < G->vexnum; i++)
printf("%c ", G->vexs[i]);
*/
for (int i = 0; i < G->vexnum; i++)
{
if (ch == G->vexs[i])
return i;
}
}
//创建邻接矩阵
void CreateAMGraph(AMGraph* G)
{
printf("输入图的总顶点数和总边数:");
scanf("%d %d", &G->vexnum, &G->arcnum);
printf("输入顶点信息: ");
char ch;
for (int i = 0; i < G->vexnum; i++)
{
getchar();
scanf("%c", &ch);
G->vexs[i] = ch;
}
for (int i = 0; i < G->vexnum; i++)
for (int j = 0; j < G->vexnum; j++)
G->arcs[i][j] = 0;
char v1, v2;
int w,n,m;
printf("输入两顶点以及边的权重: ");
for (int i = 0; i < G->arcnum; i++)
{
getchar();
scanf("%c %c %d", &v1, &v2, &w);
m = VexLocate(G, v1);
n = VexLocate(G, v2);
printf("m-%d n-%d w-%d\n", m, n, w);
G->arcs[m][n] = w;
G->arcs[n][m] = w;//若为有向图可以省略
}
}
//打印邻接矩阵
void AMGraphPrint(AMGraph* G)
{
printf("邻接矩阵展示: \n");
for (int i = 0; i < G->vexnum; i++)
{
printf("%c : ", G->vexs[i]);
for (int j = 0; j < G->vexnum; j++)
printf("%d ", G->arcs[i][j]);
printf("\n");
}
getchar();
}
//增添新顶点
void InsertVex(AMGraph* G)
{
char ch;
printf("输入新顶点: ");
scanf("%c", &G->vexs[G->vexnum]);
ch = G->vexs[G->vexnum];
G->vexnum++;
for (int i = 0; i < G->vexnum; i++)
G->arcs[i][VexLocate(G, ch)] = 0;
for (int i = 0; i < G->vexnum; i++)
G->arcs[VexLocate(G, ch)][i] = 0;
}
//增添新边数
void InsertArc(AMGraph* G)
{
char v1, v2;
int w,n,m,p;
printf("需要新增几条边: ");
scanf("%d", &p);
for (int i = 0; i < p; i++)
{
getchar();
scanf("%c %c %d", &v1, &v2, &w);
m = VexLocate(G, v1);
n = VexLocate(G, v2);
G->arcs[m][n] = w;
G->arcs[n][m] = w;
}
}
//删除顶点
void DeleteVex(AMGraph* G)
{
char ch;
printf("输入要删除的顶点: ");
scanf("%c", &ch);
int p;
p = VexLocate(G, ch);
for (int i = p + 1; i < G->vexnum; i++)
for (int j = 0; j < G->vexnum; j++)
G->arcs[i - 1][j] = G->arcs[i][j];
for (int i = 0; i < G->vexnum - 1; i++)
for (int j = p + 1; j < G->vexnum; j++)
G->arcs[i][j - 1] = G->arcs[i][j];
for (int i = p + 1; i < G->vexnum; i++)
G->vexs[i - 1] = G->vexs[i];
G->vexnum--;
}
int main()
{
AMGraph G;
CreateAMGraph(&G);
AMGraphPrint(&G);
InsertVex(&G);
AMGraphPrint(&G);
InsertArc(&G);
AMGraphPrint(&G);
DeleteVex(&G);
AMGraphPrint(&G);
return 0;
}