采用邻接矩阵创建图

采用邻接矩阵创建一个有向网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",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",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的:\n");//输出网N的弧
	printf("序号i=");
	for(i=0;i<N.vexnum ;i++)
		printf("%8d",i);
	printf("\n");
	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("\n");
	}
}
void CreateGraph(MGraph *N);
int LocateVertex(MGraph N,VertexType v);
void DestroyGraph(MGraph *N);
void DisplayGraph(MGraph N);
void main()
{
	MGraph N;
	printf("创建一个网:\n");
	CreateGraph(&N);
	printf("输出网的顶点和弧:\n");
	DisplayGraph(N);
		printf("销毁网:\n");
	DestroyGraph(&N);
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-03 20:48:34

采用邻接矩阵创建图的相关文章

邻接矩阵创建图,深度优先搜索

#include "stdio.h" #include "stdlib.h" #define TRUE 1 #define FALSE 0 typedef int Boolean; typedef char VertexType; typedef int EdgeType; #define MAXSIZE 9 #define MAXEDGE 15 #define MAXVEX 9 #define INFINITY 65535 typedef struct { Ver

PTA 邻接矩阵存储图的深度优先遍历

6-1 邻接矩阵存储图的深度优先遍历(20 分) 试实现邻接矩阵存储图的深度优先遍历. 函数接口定义: void DFS( MGraph Graph, Vertex V, void (*Visit)(Vertex) ); 其中MGraph是邻接矩阵存储的图,定义如下: typedef struct GNode *PtrToGNode; struct GNode{ int Nv; /* 顶点数 */ int Ne; /* 边数 */ WeightType G[MaxVertexNum][MaxVe

练习6.1 邻接矩阵存储图的深度优先遍历 (20分)

试实现邻接矩阵存储图的深度优先遍历. 函数接口定义: void DFS( MGraph Graph, Vertex V, void (*Visit)(Vertex) ); 其中MGraph是邻接矩阵存储的图,定义如下: typedef struct GNode *PtrToGNode; struct GNode{ int Nv; /* 顶点数 */ int Ne; /* 边数 */ WeightType G[MaxVertexNum][MaxVertexNum]; /* 邻接矩阵 */ }; t

java 数据结构 图中使用的一些常用算法 图的存储结构 邻接矩阵:图的邻接矩阵存储方式是用两个数组来标示图。一个一位数组存储图顶点的信息,一个二维数组(称为邻接矩阵)存储图中边或者弧的信息。 设图G有n个顶点,则邻接矩阵是一个n*n的方阵,定义为: 实例如下,左图是一个无向图。右图是邻接矩阵表示:

以下内容主要来自大话数据结构之中,部分内容参考互联网中其他前辈的博客. 图的定义 图是由顶点的有穷非空集合和顶点之间边的集合组成,通过表示为G(V,E),其中,G标示一个图,V是图G中顶点的集合,E是图G中边的集合. 无边图:若顶点Vi到Vj之间的边没有方向,则称这条边为无项边(Edge),用序偶对(Vi,Vj)标示. 对于下图无向图G1来说,G1=(V1, {E1}),其中顶点集合V1={A,B,C,D}:边集合E1={(A,B),(B,C),(C,D),(D,A),(A,C)}: 有向图:若

7、创建图及图的遍历(java实现)

1.顺序表用于图的深度优先遍历 public class SeqList { public final int MaxSize = 10; public Object list[]; public int size; /** * 初始化 */ public SeqList() { list = new Object[MaxSize]; this.size = 0; } /* public SeqList initSeqList(SeqList seqList) { seqList.list =

Cocos2d-X采用CCScrollView创建滚动视图

CCScrollView滚动视图可以让游戏有效果,并能够通过滚动视图切换游戏场景,滚动视图通常用来选择在游戏中的级别 实例1:使用CCScrollView创建一个简单的滚动视图 首先创建一个ScrollView类 然后在ScrollView.h中加入以下的代码 #ifndef __ScrollView_H__ #define __ScrollView_H__ #include "cocos2d.h" #include "cocos-ext.h" USING_NS_C

通过android XML 创建图行,减少对美工的依赖

在开发中总会需要自定义各种View的样式,如果总是依赖美工作图弄出需要的UI样式图片(比如:一个按钮要选中和默认两张图片),不但时间上会浪费.往往也会有适配问题.虽然可以通过.9图来解决一些适配问题,依然要花不少时间,毕竟美工通常不懂.9图的制作(得自己动手).所以有时可以通过简单的创建android XML的方式制作需要的View的UI样式(不但快捷,更不会有适配问题). 以下XML代码创建了一个4dip圆角带2px边框的样式(start_use_btn_selector.xml).(带有点击

Java用邻接矩阵实现图并进行深度优先搜索

先定义节点类 class Vertex{ char label; boolean wasVisited; public Vertex(char label){ this.label = label; wasVisited = false; } } 图: class Graph{ private final int MAX_VERTS = 20; private Vertex vertexList[];//节点列表 private int adjMat[][];//邻接矩阵 private int

DNA Sequence POJ - 2778 邻接矩阵 trie图 矩阵快速幂

首先构造trie图. 我们明确一点的是,给出trie图,那么所有点的转移方式都是唯一可以确定的.即使是没有这个字符,他也会指向根节点. 我们根据离散数学的知识可以知道.计算有向图的邻接矩阵,然后k次方,就能够计算出从某一个点到另一个点,有多少条长度为k的路径. 故,我们构造出来trie图,拿出该图的邻接矩阵,就能计算路径数目.--(注意改图是有向图)-- trie图的构造不说了,模板. 邻接矩阵的构造根据trie图来的.我们在trie图上找到每一个节点,查看他的相邻节点,即A,G,C,T四个点指