_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& ...
随机推荐
- java 缩放算法 双线性插值,双三次插值
双线性插值的效果对于放大的图像而言较领域插值来得平滑,但是却使得图像变得模糊而且仍然会有一部分锯齿现象. 双三次插值更好比双线性插值更好. 图像缩放之双三次插值法 数字图像处理之双线性插值
- Spring Cloud Sleuth Zipkin - (1)
最近在学习spring cloud构建微服务,很多大牛都提供很多入门的例子帮助我们学习,对于我们这种英语不好的码农来说,效率着实提高不少.这两天学习到追踪微服务rest服务调用链路的问题,接触到zip ...
- C/C++-标准输入/输出重定向为文件输入/输出
/* Time: 2017-02-22 11:11:15 Describe: C++程序将标准输入/输出重定向为文件输入/输出. */ #include <iostream> #inclu ...
- socket阻塞与非阻塞,同步与异步、I/O模型
socket阻塞与非阻塞,同步与异步 1. 概念理解 在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式:同步: 所 ...
- C++复合类型(数组)
1.数组 数组之所以被称为复合类型, 是因为它是使用其他类型来创建的 例如: short months[12]: 那么格式为 typename arrayname [arraysize] 注意:ar ...
- 2017年第八届蓝桥杯C/C++B组省赛题目解析
一. 购物单 小明刚刚找到工作,老板人很好,只是老板夫人很爱购物.老板忙的时候经常让小明帮忙到商场代为购物.小明很厌烦,但又不好推辞. 这不,XX大促销又来了!老板夫人开出了长长的购物单,都是有打折优 ...
- 优化 PHP 代码技巧
优化 PHP 代码技巧1. 如果一个方法能被静态,那就声明他为静态的,速度可提高 1/4;2. echo 的效率高于 print,因为 echo 没有返回值,print 返回一个整型;3. 在循环之前 ...
- Java数组超出范围时如何处理多个异常?
在Java编程中,数组超出范围时如何处理多个异常? 此示例显示如何使用System类的System.err.println()方法处理多个异常方法. package com.yiibai; publi ...
- mysql limit分页查询效率
对于有大数据量的mysql表来说,使用LIMIT分页存在很严重的性能问题. 查询从第1000000之后的30条记录: SQL代码1:平均用时6.6秒 SELECT * FROM `cdb_posts` ...
- 嵌入式开发之zynq---Zynq PS侧sd驱动
http://blog.chinaunix.net/uid-29404121-id-4217026.html http://blog.chinaunix.net/uid-29709984-id-430 ...