#include<stdio.h>
#include<stdlib.h>
#include<limits.h>
#include<string.h>#define MAX_NAME 5//顶点字符串的最大长度+1
#define MAX_INFO 20//相关信息字符串的最大长度+1typedef int VRType;
typedef char InfoType;
typedef char VertexType[MAX_NAME];#define INFINITY INT_MAX // 用整型最大值代替∞
#define MAX_VEX_NUM 20typedef enum{DG,DN,UDG,UDN}GraphKind;typedef struct
{VRType adj;//顶点关系类型。对无权图,用1(是)或0(否)表示相邻否;对带权图,c则为权值类型InfoType *info;//该弧相关信息的指针
}ArcCell,AdjMatrix[MAX_VEX_NUM][MAX_VEX_NUM];
typedef struct
{VertexType vexs[MAX_VEX_NUM];AdjMatrix arcs;int vexnum,arcnum;//当前顶点数和弧数GraphKind kind;
}MGraph;/* 初始条件:图G存在,u和G中顶点有相同特征 */
/* 操作结果:若G中存在顶点u,则返回该顶点在图中位置;否则返回-1 */
/*获取定点在定点向量中的位置 如果出错就终止运行*/
int LocateVex(MGraph G,VertexType u)
{int i;for(i=0;i<G.vexnum;++i)if(strcmp(u,G.vexs[i])==0)return i;return -1;
}
/* 采用数组(邻接矩阵)表示法,构造有向图G */
int createDG(MGraph *G)
{int i,j,k,l,IncInfo;char s[MAX_INFO],*info;VertexType va,vb;printf("请输入有向图的顶点数,弧数,弧是否含有其他信息(是:1,否:0):\n");scanf("%d%d%d",&(*G).vexnum,&(*G).arcnum,&IncInfo);printf("请输入%d个顶点的值(<%d个字符):\n",(*G).vexnum,MAX_NAME);for(i=0;i<(*G).vexnum;++i)//构造顶点向量scanf("%s",(*G).vexs[i]);for(i=0;i<(*G).vexnum;++i)//初始化邻接矩阵for(j=0;j<(*G).vexnum;++j){(*G).arcs[i][j].adj=0;(*G).arcs[i][j].info=NULL;}printf("请输入%d条弧的弧尾 弧头(以空格作为间隔):\n",(*G).arcnum);for(k=0;k<(*G).arcnum;++k){scanf("%s%s%*c",va,vb);// %*c吃掉回车符i=LocateVex(*G,va);j=LocateVex(*G,vb);(*G).arcs[i][j].adj=1;//有向图if(IncInfo){printf("请输入该弧的相关信息(<%d个字符):\n",MAX_INFO);gets(s);l=strlen(s);if(l){info=(char *)malloc((l+1)*sizeof(char));strcpy(info,s);(*G).arcs[i][j].info=info;//有向}}}(*G).kind=DG;return 1;
}
/* 采用数组(邻接矩阵)表示法,构造有向网G */
int createDN(MGraph *G)
{int i,j,k,w,IncInfo;char s[MAX_INFO],*info;VertexType va,vb;printf("请输入有向网G的顶点数,弧数,弧是否含有其他信息(是:1,否:0)\n");scanf("%d%d%d",&(*G).vexnum,&(*G).arcnum,&IncInfo);printf("请输入%d个顶点的值(<%d个字符):\n",(*G).vexnum,MAX_NAME);for(i=0;i<(*G).vexnum;++i)//构造顶点向量scanf("%s",(*G).vexs[i]);for(i=0;i<(*G).vexnum;++i)//初始化邻接矩阵for(j=0;j<(*G).vexnum;++j){(*G).arcs[i][j].adj=INFINITY;//网(*G).arcs[i][j].info=NULL;}printf("请输入%d条弧的弧尾 弧头 权值(以空格作为间隔):\n",(*G).arcnum);for(k=0;k<(*G).arcnum;++k){scanf("%s%s%d%*c",va,vb,&w);//%*c吃掉回车符i=LocateVex(*G,va);j=LocateVex(*G,vb);(*G).arcs[i][j].adj=w;//有向网if(IncInfo){printf("请输入该弧的相关信息(<%d个字符):",MAX_INFO);gets(s);w=strlen(s);if(w){info=(char *)malloc((w+1)*sizeof(char));strcpy(info,s);(*G).arcs[i][j].info=info;//有向}}}(*G).kind=DN;return 1;
}
/* 采用数组(邻接矩阵)表示法,构造无向图G */
int createUDG(MGraph *G)
{int i,j,k,l,IncInfo;char s[MAX_INFO],*info;VertexType va,vb;printf("请输入无向图G的顶点数,边数,边是否含有其他信息(是:1,否:2):\n");scanf("%d%d%d",&(*G).vexnum,&(*G).arcnum,&IncInfo);printf("请输入%d个顶点的值(<%d个字符)\n",(*G).vexnum,MAX_NAME);for(i=0;i<(*G).vexnum;i++)//构造顶点向量scanf("%s",(*G).vexs[i]);for(i=0;i<(*G).vexnum;++i)//初始化邻接矩阵for(j=0;j<(*G).vexnum;++j){(*G).arcs[i][j].adj=0;(*G).arcs[i][j].info=NULL;}printf("请输入%d条边的顶点1 顶点2(以空格作为间隔):\n",(*G).arcnum);for(k=0;k<(*G).arcnum;++k){scanf("%s%s%*c",va,vb);//%*c吃掉回车符i=LocateVex(*G,va);j=LocateVex(*G,vb);(*G).arcs[i][j].adj=(*G).arcs[j][i].adj=1;//无向图if(IncInfo){printf("请输入该边的相关信息(<%d个字符):",MAX_INFO);gets(s);l=strlen(s);if(l){info=(char *)malloc((l+1)*sizeof(char));strcpy(info,s);(*G).arcs[i][j].info=(*G).arcs[j][i].info=info;//无向图}}}(*G).kind=UDG;return 1;}
/* 采用数组(邻接矩阵)表示法,构造无向网G。*/
int createUDN(MGraph *G)
{int i,j,k,w,IncInfo;char s[MAX_INFO],*info;VertexType va,vb;printf("请输入无向网G的顶点数,边数,边是否含有其他信息(是:1,否:0):\n");scanf("%d%d%d",&(*G).vexnum,&(*G).arcnum,&IncInfo);printf("请输入%d个顶点的值(<%d个字符):\n",(*G).vexnum,MAX_NAME);for(i=0;i<(*G).vexnum;++i)//构造顶点向量scanf("%s",(*G).vexs[i]);for(i=0;i<(*G).vexnum;++i)//初始化邻接矩阵for(j=0;j<(*G).vexnum;++j){(*G).arcs[i][j].adj=INFINITY;//网(*G).arcs[i][j].info=NULL;}printf("请输入%d条边的顶点1 顶点2 权值(以空格为间隔):\n",(*G).arcnum);for(k=0;k<(*G).arcnum;++k){scanf("%s%s%d%*c",va,vb,&w);//%*c吃掉回车符i=LocateVex(*G,va);j=LocateVex(*G,vb);(*G).arcs[i][j].adj=(*G).arcs[j][i].adj=w;//无向if(IncInfo){printf("请输入该边的相关信息(<%d个字符): ",MAX_INFO);gets(s);w=strlen(s);if(w){info=(char *)malloc((w+1)*sizeof(char));strcpy(info,s);(*G).arcs[i][j].info=(*G).arcs[j][i].info=info;//无向}}}(*G).kind=UDN;return 1;
}/* 采用数组(邻接矩阵)表示法,构造图G*/
int createGraph(MGraph *G)
{printf("请输入G的类型(有向图:0,有向网:1,无向图:2,无向网:3):\n");scanf("%d",&(*G).kind);switch((*G).kind){case DG:return createDG(G);case DN:return createDN(G);case UDG:return createUDG(G);case UDN:return createUDN(G);default:return 0;}
}
/* 输出邻接矩阵G */
void displayGraph(MGraph G)
{int i,j;char s[7],s1[3];switch(G.kind){case DG:strcpy(s,"有向图\0");strcpy(s1,"弧\0");break;case DN:strcpy(s,"有向网\0");strcpy(s1,"弧\0");break;case UDG:strcpy(s,"无向图\0");strcpy(s1,"边\0");break;case UDN:strcpy(s,"无向网\0");strcpy(s1,"边\0");break;}printf("%d个顶点%d条%s的%s\n",G.vexnum,G.arcnum,s1,s);for(i=0;i<G.vexnum;++i) /* 输出G.vexs */printf("G.vexs[%d]=%s\n",i,G.vexs[i]);printf("G.arcs.adj:\n"); /* 输出G.arcs.adj */for(i=0;i<G.vexnum;i++){for(j=0;j<G.vexnum;j++)printf("%6d",G.arcs[i][j].adj);printf("\n");}printf("G.arc.info:\n");//输出G.arcs.infoprintf("顶点1(弧尾) 顶点2(弧头) 该%s信息:\n",s1);if(G.kind<2)//有向for(i=0;i<G.vexnum;i++)for(j=0;j<G.vexnum;j++){if(G.arcs[i][j].info)printf("%5s%11s %s\n",G.vexs[i],G.vexs[j],G.arcs[i][j].info);}else//无向{for(i=0;i<G.vexnum;i++)for(j=i+1;j<G.vexnum;j++)if(G.arcs[i][j].info)printf("%5s %11s %s\n",G.vexs[i],G.vexs[j],G.arcs[i][j].info);}
}
/*初始化条件:图G存在*/
/*操作结果:销毁图G*/
void destroyGraph(MGraph *G)
{int i,j;if((*G).kind<2)//有向for(i=0;i<(*G).vexnum;i++)//释放相关信息(如果有){for(j=0;j<(*G).vexnum;j++)if((*G).arcs[i][j].adj==1&&(*G).kind==0||(*G).arcs[i][j].adj!=INFINITY&&(*G).kind==1)//有向图的弧||有向网的弧if((*G).arcs[i][j].info)//有相关信息{free((*G).arcs[i][j].info);(*G).arcs[i][j].info=NULL;}}else//无向{for(i=0;i<(*G).vexnum;i++)//释放相关信息(如果有)for(j=i+1;j<(*G).vexnum;j++)if((*G).arcs[i][j].adj==1&&(*G).kind||(*G).arcs[i][j].adj!=INFINITY&&(*G).kind==3)//无向图的边||无向网的边if((*G).arcs[i][j].info)//有相关信息{free((*G).arcs[i][j].info);(*G).arcs[i][j].info=(*G).arcs[j][i].info=NULL;}}(*G).vexnum=0;(*G).arcnum=0;printf("图销毁成功!");printf("\n\n");
}
int main()
{int i;MGraph G;for(i=0;i<3;i++){createGraph(&G);displayGraph(G);destroyGraph(&G);}return 0;
}

有向图、有向网、无向图、无向网相关推荐

  1. 邻接矩阵,构造有向图、无向图、有向网、无向网,深度优先、广度优先遍历(C++图)

    #include <iostream> using namespace std; #define INFINITY INT_MAX #define MAX_VERTEX_NUM 20//最 ...

  2. 图——有向图、无向图、有向网、无向网的邻接矩阵表示

    严版数据结构P162 算法7.1 - 7.2 依据此,延伸创建无向图.有向图.有向网 代码如下: #include<stdio.h> #include<iostream> #i ...

  3. 关于有向图强连通分量 和 无向图双联通分量的理解

    有向图的强连通分量 1.强连通 代表的是 这个连通块中的每两个点互相都是有一条路径是可以走到的 2.分量 就是子图: 从这张图上可以看出 A B C这三个点都是互相可以走到的 所以他们就是一个联通块 ...

  4. 【数据结构】图的基本概念—无/有向图、权和网、完全图、路径与回路

  5. 图的数组(邻接矩阵)存储结构

    图是比较复杂的数据结构,它由顶点和顶点之间的弧或边组成.任何两个顶点之间都 可能存在弧或边.在计算机存储图时,只要能表示出顶点的个数及每个顶点的特征.每对 顶点之间是否存在弧(边)及弧(边)的特征,就 ...

  6. 拓扑排序和关键路径课程设计

    目录 1.    设计任务书... 3 1.1设计任务... 3 1.2程序功能... 3 1.3运行环境... 3 2.    本组课题... 3 2.1课题... 3 2.2本人任务... 3 3 ...

  7. 最短路径——迪杰斯特拉算法——图的数据结构

    最短路径是在工程上经常用到的概念,在这里给出了从单源点到任意顶点的迪杰斯特拉算法. 先来看看基本概念: 用代码C语言实现如下: #include<string.h>#include< ...

  8. 最小生成树——普里姆算法和克鲁斯卡尔算法

    最小生成树 用来解决工程中的代价问题. 一:普里姆算法 具体代码用C语言实现如下: typedef int VRType;typedef char InfoType;#define MAX_NAME ...

  9. 图的遍历——深度优先搜索+广度优先搜索

    一:图的遍历--深度优先搜索 在本文其他内容中只是大体概括了主要的图论内容,更加详细的代码实现及算法分析在此给出. 深度优先搜索(DFS)类似树的先序遍历. 假设初始状态是图中所有顶点未曾被访问,则深 ...

  10. 图的知识点总结-数据结构

    一:图的基本概念和术语 1.图之间的关系可以是任意的,任意两个数据元素之间都可能相关. 2.顶点:数据元素. 3.边or弧:从一个顶点到另一个顶点的路径.<V, W>表示弧,(V,W)表示 ...

最新文章

  1. python制作桑基图_Python制作桑基图
  2. xshell突然连接不上虚拟机解决办法
  3. 风控评分模型全流程的开发及应用
  4. C++ begin( ) cbegin( ) end() cend()区别
  5. php和mysql的概述_MySQL_理解MySQL变量和条件,一、概述  变量在存 - phpStudy
  6. python金融网课_Python金融数据分析
  7. ABAQUS单位统一
  8. 推荐算法之DeepFM
  9. 上传图片的方法(大白话讲解)
  10. 郑码输入法 字根记忆表 一般根变通处理
  11. python bunch制作可导入数据_Python 之 Bunch Pattern
  12. 如何时重启打印机服务bat命令,打印机重启服务脚本 Win7打印机服务怎么开启 Win7开启打印机服务的设置的两种方法
  13. 基于single-spa+vue的前端微服务项目实践
  14. 解决NameError: name ‘xxx‘ is not defined
  15. 彻底搞懂a++和++a的区别
  16. 软件产品案例分析——福州大学微信小程序
  17. 计算机开机就进入安全模式,Win10一开机就安全模式?Win10电脑开机进入安全模式解决方法...
  18. 一周AI资讯|如果深度学习成为“侦探”,会发生什么?
  19. 远程桌面连接怎么使用?
  20. 求刷Kindle Fire HD的方法

热门文章

  1. 使用腾讯IM实现uni-app小程序中的客服聊天
  2. 第三个计算机时代为,计算机三个时代的各自特点?
  3. 科目一计算机答题错了能修改吗,科目一可要是错了可以修改吗
  4. [SCOI2012]滑雪 洛谷p2573
  5. 魔法少女 LJJ——线段树
  6. python和matlab读取SST数据(海洋的温度)(.nc文件)并绘图
  7. 一点点linux系统的学习心得
  8. 制作MacOS U盘安装盘教程
  9. 论文中文翻译——Double-Fetch情况如何演变为Double-Fetch漏洞:Linux内核中的双重获取研究
  10. Instructional Technology Notes at random