图--邻接矩阵

#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;
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值