数据结构——图-有向图的邻接矩阵

博客围绕C语言展开,但具体内容缺失。C语言是后端开发常用语言,在众多领域有广泛应用。

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

 #include<stdio.h>
#include<string.h>
#define INF 32767
#define MAXVEX 30
typedef char VertexType;
typedef struct graph
{
	int n,e;
	VertexType vexs[MAXVEX];
	int edges[MAXVEX][MAXVEX];
}MGraph;

void CreateMGraph(MGraph &G)
{
	int n,e;
	int value;

	char temp_i;
	char temp_j;
	
	printf("请输入图的顶点数和边数(以空格分隔):");
    scanf("%d%d",&n,&e);
    G.n=n;G.e=e;
    
    
    
    for(int i=0;i<n;i++)
    {
    	for(int j=0;j<n;j++)
    	{
    		if(i==j)
    			G.edges[i][j]=0;
    		else
    			G.edges[i][j]=32767;
		}
		
	}
	
	
	
			printf("输入顶点信息:");
		for(int j=0;j<G.n;j++)
		{
			getchar();
			scanf("%c",&G.vexs[j]);
			
		}
		
			
		
		int temp_number_i;
		int temp_number_j;
		
		printf("请输入每条边的权值:\n");
		for(int j=0;j<e;j++)
		{
			getchar();
			scanf("%c %c %d",&temp_i,&temp_j,&value);
			for(int i=0;i<n;i++)
			{
				if(G.vexs[i]==temp_i)
					temp_number_i=i;
				if(G.vexs[i]==temp_j)
					temp_number_j=i;
			}
			G.edges[temp_number_i][temp_number_j]=value;
		}
	
	

		
		
	
}

void DispMGraph(MGraph &G)
{
	printf("输出顶点信息:\n");
	for(int i=0;i<G.n;i++)
	{
		printf("%c",G.vexs[i]);
	} 
	printf("\n输出邻接矩阵:\n");
	printf("\t");
    for(int i=0;i<G.n;i++)
        printf("%8c",G.vexs[i]); 
        
    for(int i=0;i<G.n;i++)
    {
    	printf("\n%8c",G.vexs[i]);
    	for(int j=0;j<G.n;j++)
    	{
    		if(G.edges[i][j]==32767) 
        //两点之间无连接时权值为默认的32767,
       // 在无向图中一般用"0"表示,在有向图中一般用"∞",
       // 这里为了方便统一输出 "∞"
            printf("%8s", "∞");
        else
            printf("%8d",G.edges[i][j]);
		}
		printf("\n");
	}
}

void Degree(MGraph G,VertexType v)
{

	int temp;
	int enter_degree=0;
	int out_degree=0; 	

	for(int i=0;i<G.n;i++)
	{
		if(G.vexs[i]==v)
			{
				temp=i;
				break;
			}
	}
	

	
	for(int i=0;i<G.n;i++)
	{
		if(G.edges[temp][i]>0&&G.edges[temp][i]<32767)
			out_degree++;
		if(G.edges[i][temp]>0&&G.edges[i][temp]<32767)
			enter_degree++;
	}
	printf("该有向图%c的顶点入度为:%d\n",v,enter_degree);
	printf("该有向图%c顶点的出度为:%d\n",v,out_degree); 
	
	return ;
}
void InsertVex(MGraph &G,VertexType v)
{
//向邻接矩阵中添加一个新顶点 
	G.n=G.n+1;
	G.vexs[G.n-1]=v;
	for(int i=0;i<G.n;i++)
	{
		G.edges[i][G.n-1]=32767;
		G.edges[G.n-1][i]=32767;
	}
	G.edges[G.n-1][G.n-1]=0;
	
	
}

void DeleteVex(MGraph &G,VertexType v) 
{
	int temp=0;
	for(int i=0;i<G.n;i++)
	{
		if(G.vexs[i]==v)
		{
			temp=i;
			break;
		}
	}
	for(int i=0;i<G.n;i++)
		for(int j=0;j<G.n;j++)
		{
			if(i>temp&&j>temp)
				G.edges[i-1][j-1]=G.edges[i][j];
			if(i>temp)
				G.edges[i-1][j]=G.edges[i][j];
			if(j>temp)
				G.edges[i][j-1]=G.edges[i][j];
		}
		for(int i=0;i<G.n;i++)
		{
			if(i>temp)
				G.vexs[i-1]=G.vexs[i];
				
		}
		
	
	
	
	G.n=G.n-1;
}
void InsertArc(MGraph &G,VertexType v,VertexType w)
{
	//向邻接矩阵里添加一个新的边; 
	int value;
	printf("输入新加入边的权值:");
	scanf("%d",&value);
		int temp_number_i;
		int temp_number_j;
	for(int i=0;i<G.n;i++)
	{
			if(G.vexs[i]==v)
				temp_number_i=i;
			if(G.vexs[i]==w)
				temp_number_j=i;
	}
	G.edges[temp_number_i][temp_number_j]=value;
 } 

void DeleteArc(MGraph &G,VertexType v,VertexType w)
{
	//删除一条指定的边 
		int temp_number_i;
		int temp_number_j;
	for(int i=0;i<G.n;i++)
	{
			if(G.vexs[i]==v)
				temp_number_i=i;
			if(G.vexs[i]==w)
				temp_number_j=i;
	}
	G.edges[temp_number_i][temp_number_j]=32767;
} 

int main()
{
	MGraph G;
	CreateMGraph(G);
	DispMGraph(G);
	char v,w;
	printf("输入要求(入度出度)的顶点:");
	getchar();
	scanf("%c",&v);
	Degree(G,v);
	
	
	printf("输入新加入的顶点:");
	getchar();
	scanf("%c",&v);
	InsertVex(G,v);
	DispMGraph(G);
	
	
	
	getchar();
	printf("输入新加入的边:");
	scanf("%c %c",&v,&w);
	InsertArc(G,v,w);
	DispMGraph(G);
	
	
	
	printf("输入删除的边:");
	getchar();
	scanf("%c %c",&v,&w);
	DeleteArc(G,v,w);
	DispMGraph(G);
	
	
	printf("输入要删除的顶点及其相关的边:");
	getchar();
	scanf("%c",&v); 
	DeleteVex(G,v);
	DispMGraph(G);
 } 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值