採用邻接矩阵创建图

採用邻接矩阵创建一个有向网N

分析:图的创建主要利用输入的各个顶点。并存储到一个向量(一维数组)中。然后通过输入两个顶点及权重创建弧。利用二维数组表示,因此。利用邻接矩阵创建图的存储须要两个数组:一个一维数组和一个二维数组。

#include<stdio.h>
#include<string.h>
#include<malloc.h>
#include<stdlib.h>
typedef char VertexType[4];
typedef char InfoPtr;
typedef int VRType;
#define INFINITY 10000//定义一个无限大的值
#define MAXSIZE 100//最大顶点个数
typedef enum {DG,DN,UG,UN}GraphKind;
//图的类型:有向图,有向网,无向图和无向网
typedef struct
{
	VRType adj;//对于无权图。用1表示相邻,0表示不相邻。对于带权图,存储权值
	InfoPtr *info;//与弧或边的相关信息
}ArcNode,AdjMatrix[MAXSIZE][MAXSIZE];
typedef struct//图的类型定义
{
	VertexType vex[MAXSIZE];//用于存储顶点
	AdjMatrix arc;//邻接矩阵。存储边或弧的信息
	int vexnum,arcnum;//顶点数和边的数目
	GraphKind kind;//图的类型
}MGraph;

int LocateVertex(MGraph N,VertexType v)
//在顶点向量中查找顶点v,找到返回在向量的序号,否则返回-1
{
	int i;
	for(i=0;i<N.vexnum ;++i)
		if(strcmp(N.vex [i],v)==0)
			return i;
		return -1;
}

void CreateGraph(MGraph *N)//採用邻接矩阵表示法创建有向网N
{
	int i,j,k,w,InfoFlag,len;
	char s[MAXSIZE];
	VertexType v1,v2;
	printf("请输入有向网N的顶点数。弧数,弧的信息(是:1,否:0):");
	scanf("%d,%d,%d",&(*N).vexnum ,&(*N).arcnum ,&InfoFlag);
	printf("请输入%d个顶点的值(<%d个字符):
",N->vexnum ,MAXSIZE);
	for(i=0;i<N->vexnum;i++)//创建一个数组。用于保存网的各个顶点
		scanf("%s",N->vex [i]);
	for(i=0;i<N->vexnum ;i++)//初始化邻接矩阵
		for(j=0;j<N->vexnum ;j++)
		{
			N->arc [i][j].adj =INFINITY;
			N->arc [i][j].info =NULL;//弧的信息初始化为空
		}
		printf("请输入%d条弧的弧尾 弧头 权值(以空格作为间隔):
",N->arcnum );
		for(k=0;k<N->arcnum ;k++)
		{
			scanf("%s%s%d",v1,v2,&w);//输入两个顶点和弧的权值
			i=LocateVertex(*N,v1);
			j=LocateVertex(*N,v2);
			N->arc [i][j].adj =w;
			if(InfoFlag)//假设弧包括其它信息
			{
				printf("请输入弧的相关信息:");
				gets(s);
				len=strlen(s);
				if(len)
				{
					N->arc [i][j].info =(char*)malloc((len+1)*sizeof(char));//有向
					strcpy(N->arc [i][j].info ,s);
				}
			}
		}
		N->kind =DN;//图的类型为有向网
} 

void DestroyGraph(MGraph *N)//销毁网
{
	int i,j;
	for(i=0;i<N->vexnum ;i++)
		for(j=0;j<N->vexnum ;j++)
			if(N->arc [i][j].adj !=INFINITY)//假设存在弧
				if(N->arc [i][j].info !=NULL)
					//假设弧有相关信息,释放该信息所占用空间
				{
					free(N->arc [i][j].info );
					N->arc [i][j].info =NULL;
				}
				N->vexnum =0;//将网的顶点数置为0
				N->arcnum =0;//将网的弧的数目置为0
}
void DisplayGraph(MGraph N)//输出邻接矩阵存储表示的图N
{
	int i,j;
	printf("有向网具有%d个顶点%d条弧,顶点依次是:",N.vexnum ,N.arcnum );
	for(i=0;i<N.vexnum ;++i)
		printf("%s",N.vex [i]);//输出网的顶点
	printf("
有向网N的:
");//输出网N的弧
	printf("序号i=");
	for(i=0;i<N.vexnum ;i++)
		printf("%8d",i);
	printf("
");
	for(i=0;i<N.vexnum ;i++)
	{
		printf("%8d",i);
		for(j=0;j<N.vexnum ;j++)
			printf("%8d",N.arc [i][j].adj );
		printf("
");
	}
}
void CreateGraph(MGraph *N);
int LocateVertex(MGraph N,VertexType v);
void DestroyGraph(MGraph *N);
void DisplayGraph(MGraph N);
void main()
{
	MGraph N;
	printf("创建一个网:
");
	CreateGraph(&N);
	printf("输出网的顶点和弧:
");
	DisplayGraph(N);
		printf("销毁网:
");
	DestroyGraph(&N);
}

原文地址:https://www.cnblogs.com/wzzkaifa/p/6957484.html