数据结构实验三——图的创建及其基本操作(邻接矩阵C语言)

本文介绍如何使用邻接矩阵实现带权无向图的创建过程,并提供了统计图中边的数量、各顶点的度数、网图总权重及度为特定数值的顶点数量的方法。

采用邻接矩阵创建带权无向图:
①统计图中边的个数并输出;
②统计图中各顶点的度并输出;
③统计网图的总权重;
④统计度为n的顶点个数(n可以为0、1、2、…);

//邻接矩阵
#include <stdio.h>
#include <stdlib.h>
#define INFINITY 65535  //∞设为65535
#define MAXVERTEXNUM 100  //最大顶点数设为100 
int d[100];
typedef struct GNode *PtrToGNode;
struct GNode{
	int Nv;   //顶点数 
	int Ne;   //边数 
	int G[MAXVERTEXNUM][MAXVERTEXNUM];  //邻接矩阵
	char Data[MAXVERTEXNUM]; 
}; 
typedef PtrToGNode MGraph; //以邻接矩阵存储的图类型

MGraph BuildGraph()
{
	MGraph Graph;
	int i,j,k,weight;
	char a,b;
	 
	Graph = (PtrToGNode)malloc(sizeof(struct GNode));
	
	printf("请输入顶点数和边数:");
	scanf("%d %d",&Graph->Nv,&Graph->Ne);
	
	for(i = 0;i < Graph->Nv; i++)
	{
	    getchar();  //getchar()函数是输入一个字符,用此函数将scanf()未处理的量进行释放;
	    printf("请输入第%d个顶点,数组位置为%d:",i+1,i);
	    scanf("%c",&Graph->Data[i]);  //输入顶点数据 
	}
	
	for(i = 0;i < Graph->Nv; i++)
	   for(j = 0;j < Graph->Nv; j++)
	        Graph->G[i][j] = INFINITY;  //初始化邻接矩阵
			
	for(k = 0;k < Graph->Ne ; k++)
	{
	    printf("请输入第%d条边的顶点信息与边的权值(格式为:起点数据 终点数据 权重):",k+1);
	    getchar();
	    scanf("%c %c %d",&a,&b,&weight);
	       
	    for( i = 0; Graph->Data[i] != a;i++) 
		   ;   //找到顶点a在邻接矩阵中的下标 
	    for( j = 0; Graph->Data[j] != b;j++) 
		   ;   //找到顶点b在邻接矩阵中的下标
	       
	    Graph->G[i][j] = weight;
	    Graph->G[j][i] = weight;
	}
	return Graph; 
 }
MGraph pri(){                   //输出函数 
	MGraph Graph_1;
	int i,j,k,sum;
	sum=0;
	//图中边的个数
	printf("图中边的个数:%d\n",Graph_1->Ne);
	//统计图中各顶点的度并输出
	for(i = 0;i < Graph_1->Nv;i++){
		for(j = 0;j < Graph_1->Nv;j++){
			if(Graph_1->G[j][i] != INFINITY){
				sum++;
			}
		}
		d[i]=sum;
		sum=0;
	}
	for(i = 0;i<Graph_1->Nv;i++){
		printf("第%c个顶点度为:%d\n",i+'A',d[i]);
	}
	//网图的总权重
	sum=0;
	for(i = 0;i<Graph_1->Nv;i++){
		for(j=0;j<=i;j++){
			if(Graph_1->G[i][j]!=INFINITY){
				sum+=Graph_1->G[i][j];
			}
		}
	}
	printf("网图的总权重%d\n",sum);
	//统计度为n的顶点个数
	j=0;
	k=0;
	while(k!=Graph_1->Nv){
		sum=0;
		for(i = 0;i < Graph_1->Nv;i++){
			if(j == d[i]){
				sum++;
				k++;
			}
		}
		printf("度为%d的顶点个数:%d\n",j,sum);
		j++;
	}
}

 int main(void){
 	BuildGraph();
 	pri();
 	return 0;
 }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值