//_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");
}

最新文章

  1. 在ASP.NET Core中实现一个Token base的身份认证
  2. .NET C#微信公众号开发远程断点调试(本地远程调试生产环境代码)
  3. 攻城狮在路上(叁)Linux(二十七)--- 压缩与打包之常见的压缩命令
  4. spring框架设计理念(上)
  5. NHibernate 基本配置 (第一篇)
  6. java高薪之路__001_类
  7. Oracle 10gR2 &amp; 10.2.0.5 的百度网盘下载地址 :)
  8. wordpress内存不足问题“Fatal error:out of memoryin etc...”
  9. 遇到 Error creating the Web Proxy specified in the &#39;system.net/defaultProxy&#39; configuration section的解决办法
  10. Caused by: 元素类型为 &quot;package&quot; 的内容必须匹配 &quot;(result-types?,interceptors?,default-interceptor-ref?,default-action-ref?,default-class-ref?,global-results?,global-exception-mappings?,action*)&quot;
  11. 使用JavaScript实现弹出层效果
  12. React vs Angular 2: 冰与火之歌
  13. Unity3D之Mecanim动画系统学习笔记(六):使用脚本控制动画
  14. Android 使用XmlPullParser解析xml
  15. JTextField限制输入长度的完美解决方案(转)
  16. javascript编写一个简单的编译器(理解抽象语法树AST)
  17. Java学习--抽象类和接口
  18. idea 2017破解的三种方式
  19. 2017-9-8-RaspberryPi安装过程
  20. Linux账号管理

热门文章

  1. jQuery(四):HTML代码操作
  2. Android Studio xcode单步调试 WebRTC Android &amp; iOS
  3. jQuery&amp;CSS 顶部和底部固定浮动工具栏 兼容IE6
  4. jsp页面利用JS做即时时间显示
  5. SpagoBI 教程 Lesson 2: OLAP with JPIVOT
  6. (笔记)linux设备驱动--LED驱动
  7. JDBC驱动程序类型
  8. JUnit断言
  9. nodejs基础 -- 多进程
  10. c# 递归函数使用案例