_DataStructure_C_Impl:图的邻接矩阵存储
存储 impl 邻接矩阵
2023-09-14 09:08:54 时间
//_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"); }
相关文章
- 短链系统设计-存储设计
- 数据库的存储系列———将图片存储到数据库
- Tina Linux 存储开发指南
- MySQL存储引擎详解数据库
- 优化Oracle数据库存储方案(oracle存储方案)
- Linux如何增加存储目录空间(linux增加目录空间)
- 超越Oracle:实现存储过程调试跟踪(oracle存储过程跟踪)
- MySQL定时存储过程:实现自动化存储和处理数据(mysql定时存储过程)
- 用Redis存储开关状态字段(开关状态字段用redis)
- 爬虫技术突破redis存储之路(爬虫用redis存储)
- 使用MySQL创建千万条数据实现高效数据存储和查询(mysql中创建千万数据)
- Redis存储的哪些数据值得投资(哪些数据 redis)
- 千峰Redis笔记简明理解信息存储与处理(千峰redis笔记)
- MySQL5.0存储过程教程
- 分页存储过程代码
- aspsqlserver执行存储过程返回记录集报对象关闭时不允许操作
- JavaScript实现存储HTML字符串示例