_DataStructure_C_Impl:图的邻接矩阵存储
- //_DataStructure_C_Impl:邻接矩阵
- #include<stdio.h>
- #include<stdlib.h>
- #include<string.h>
- typedef char VertexType[4];
- typedef char InfoPtr;
- typedef int VRType;
- #define INFINITY 10000 //定义一个无限大的值
- #define MaxSize 50 //最大顶点个数
- 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;
- //在顶点向量中查找顶点v。找到返回在向量的序号。否则返回-1
- int LocateVertex(MGraph N,VertexType v){
- int i;
- for(i=0;i<N.vexnum;++i)
- if(strcmp(N.vex[i],v)==0)
- return i;
- return -1;
- }
- //採用邻接矩阵表示法创建有向网N
- void CreateGraph(MGraph *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; //图的类型为有向网
- }
- //销毁网N
- 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){
- 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 main(){
- MGraph N;
- printf("创建一个网:\n");
- CreateGraph(&N);
- printf("输出网的顶点和弧:\n");
- DisplayGraph(N);
- printf("销毁网:\n");
- DestroyGraph(&N);
- system("pause");
- }
_DataStructure_C_Impl:图的邻接矩阵存储的更多相关文章
- 图的邻接矩阵存储实现,C++描述
body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...
- java 图的邻接矩阵
有向图 在有向图中,结点对<x ,y>是有序的,结点对<x,y>称为从结点x到结点y的一条有向边,因此,<x,y>与<y,x>是两条不同的边.有向图中的 ...
- PTA 邻接矩阵存储图的深度优先遍历
6-1 邻接矩阵存储图的深度优先遍历(20 分) 试实现邻接矩阵存储图的深度优先遍历. 函数接口定义: void DFS( MGraph Graph, Vertex V, void (*Visit)( ...
- 数据结构C++实现邻接矩阵存储图
定义邻接矩阵存储的图类.[实验要求] 1. 创建一个邻接矩阵存储的图: 2. 返回图中指定边的权值: 3. 查找图中某顶点的第一个邻接顶点.某顶点关于另一个顶点的下一个邻接顶点序号: 4. 图的深度优 ...
- 数据结构(12) -- 图的邻接矩阵的DFS和BFS
//////////////////////////////////////////////////////// //图的邻接矩阵的DFS和BFS ////////////////////////// ...
- Java图的邻接矩阵实现
/** * * 图的邻接矩阵实现 * @author John * * @param <T> */ class AMWGraph<T> { private ArrayList& ...
- 算法与数据结构(四) 图的物理存储结构与深搜、广搜(Swift版)
开门见山,本篇博客就介绍图相关的东西.图其实就是树结构的升级版.上篇博客我们聊了树的一种,在后边的博客中我们还会介绍其他类型的树,比如红黑树,B树等等,以及这些树结构的应用.本篇博客我们就讲图的存储结 ...
- E1_1 用邻接矩阵存储有向图,并输出各顶点的出度和入度
参考书:图论算法理论.实现及应用(北京大学出版社) 输入数据:(test.txt) 程序: /* 邻接矩阵存储有向图 */ #include <cstring> #include < ...
- 图的邻接矩阵实现(c)
参考:算法:c语言实现 一书 图的邻接矩阵实现 #ifndef GRAPH #define GRAPH /* 图的邻接矩阵实现 */ #include<stdio.h> #include& ...
随机推荐
- QT:QObject 简单介绍
QObject 是所有Qt对象的基类. QObject 是Qt模块的核心.它的最主要特征是关于对象间无缝通信的机制:信号与槽.使用connect()建立信号到槽的连接,使用disconnect()销毁 ...
- C++头文件的工作原理
一.C++编译模式通常,在一个C++程序中,只包含两类文件——.cpp文件和.h文件.其中,.cpp文件被称作C++源文件,里面放的都是C++的源代码:而.h文件则被称作C++头文件,里面放的也是C+ ...
- ThinkPHP使用memcache缓存服务器
(1)Thinkphp的默认缓存方式是以File方式,在/Runtime/Temp 下生成了好多缓存文件. 服务器装了memcached后想给更改成memecache方式 在Conf/config.p ...
- linux计算文件大小
- 实验四 使用ASP.NET内置对象 总结
这次实验内容是ASP.NET的一些内置对象的熟悉,感觉看到了上学期JSP的影子,很多地方都很像.像Response对象,Request对象,Context对象等等.以前我老是搞混Response对象和 ...
- yizhihx ubuntu config
install shadowsocks:http://www.cnblogs.com/huangshiyu13/p/8973967.html download: https://pan.baidu.c ...
- selenium+java+chrome环境搭建
我只能说因为版本冲突,简直太折腾了,而搜了无数个博友的帖子才找到正确条案,就不能好好的写篇文章吗? 最近真的是太闲太闲了,平时没事总得搞点技术,不然心里感觉好空虚, 最近看上了selenium,所以试 ...
- java.lang.IllegalArgumentException: Request header is too large 解决方案
错误描述: java.lang.IllegalArgumentException: Request header is too large 问题分析: 请求头超过了tomcat的限值.本来post请求 ...
- 在Android平台下搭建PhoneGap开发环境--用HTML5开发游戏
一.在Android平台下搭建PhoneGap开发环境具体怎么搭建我这里就不详细说了,如有需要我后面再讲 . PhoneGap 官方地址有详细说明:http://www.phonegap.com. 在 ...
- php的MCRYPT_RIJNDAEL_256 和mcrypt_encrypt 用法
<?php $key = "miyao";//密钥 $string="jiami";//需要加密的字符 $d = new d(); //加密 $crypt ...