图的基本操作

  • 图(顺序存储)
    • 无向图、有向图、无向网、有向网

编译器:VS Code
语言:C语言

图(顺序存储)

无向图、有向图、无向网、有向网

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define maxvertnum 100  //最大的顶点个数
typedef enum{DG,UDG,DN,UDN}  graghkind;  //图的类型(保存的是常量)typedef struct{int adj;      //对于无权图,用1表示相邻,0表示不相邻;对于权重图,直接为权重值int  info;   //边的描述信息(弧、边、额外信息指针)
}Edge,adjmatrix[maxvertnum][maxvertnum];  //后者为二维数组(邻接矩阵)typedef struct {char vert[maxvertnum];  //图得所有顶点得名称(int、char类型)adjmatrix edges;          //邻接矩阵adjmatrix命名为edges(记录顶点之间的关系)int vertnum,edgenum;     //图的顶点数和(弧/边)数graghkind kind;          //图的类型
}amgragh;
//根据点的名称查找下标
int locatevex(amgragh g,char v)
{int k=0;//遍历一位数组,找到变量vfor(;k<g.vertnum;k++){if(g.vert[k]==v){  //如果下标存在就跳出循环break;}}//如果找不到。输入提示语句if(k>g.vertnum){printf("没有这样的值\n");return false;}return k;
}
//创建无向图
int create_UG(amgragh &g)
{/*
边数=顶点数*(顶点数)/2
邻接矩阵关于对角线堆成
*/printf("=====无向图=====\n");printf("请输入无向图的顶点数和边数:");    scanf("%d %d",&g.vertnum,&g.edgenum);if(g.edgenum>g.vertnum*(g.vertnum-1)/2){  //边数=顶点数*(顶点数)/2int edgenum;printf("边数<=%d\n",g.vertnum*(g.vertnum-1)/2);printf("输入错误\n");return false;}//输入无向图的顶点的名称printf("请输入顶点的名称(空号隔开):");for(int i=0;i<g.vertnum;i++){scanf("%s",&g.vert[i]);    //输入每个顶点的名称}//strcpy(&g.vert[0],"男18");//strcpy(&g.vert[1],"男17");//strcpy(&g.vert[2],"男16");//strcpy(&g.vert[3],"男15");//strcpy(&g.vert[4],"男14");//strcpy(&g.vert[5],"男13");//strcpy(&g.vert[6],"男12"); //初始化邻接矩阵,即0矩阵for(int i=0;i<g.vertnum;i++){for(int j=0;j<g.vertnum;j++){g.edges[i][j].adj=0;  //初始化邻接矩阵g.edges[i][j].info=NULL;  //无向图没有权重值}}//图转为邻接矩阵存储char v1[40],v2[40];int i=0,j=0;for(int k=0;k<g.edgenum;k++){printf("请输入弧头、弧尾:");scanf("%s %s",v1,v2);  //输入下一个点的名称i=locatevex(g,*v1);  //根据顶点名称找到其在邻接矩阵中的下标j=locatevex(g,*v2);  //第二个元素printf("下标=%d %d\n",i,j);g.edges[i][j].adj=1;   //无向图的二维矩阵沿对角线堆成g.edges[j][i].adj=1;}printf("无向图创建成功!!!\n"); //输出无向图的邻接矩阵printf("====无向图的邻接矩阵====\n");for(int i=0;i<g.vertnum;i++){for(int j=0;j<g.vertnum;j++){printf("%3d",g.edges[i][j].adj);}printf("\n");}return true;
}
//创建有向图
int create_DG(amgragh &dg)
{
/*
边数=顶点数*(顶点数)
弧头:head
弧尾:tail
顶点之间的关:tail->head
*/printf("=====有向图=====\n");printf("请输入有向图的顶点数和弧数:");  scanf("%d %d",&dg.vertnum,&dg.edgenum);  //输入顶点数个边数//依次输入顶点的名称printf("请输入顶点的名称(空号隔开):");for(int i=0;i<dg.vertnum;i++){scanf("%s",&dg.vert[i]);    //输入每个顶点的名称}if(dg.edgenum>dg.vertnum*(dg.vertnum-1)){  //边数=顶点数*(顶点数)int edgenum;printf("边数<=%d\n",dg.vertnum*(dg.vertnum-1));printf("输入错误\n");return false;}//初始化邻接矩阵,即0矩阵for(int i=0;i<dg.vertnum;i++){for(int j=0;j<dg.vertnum;j++){dg.edges[i][j].adj=0;  //初始化邻接矩阵dg.edges[i][j].info=NULL;  //无向图没有权重值}}//有向图转为邻接矩阵存储char head[40],tail[40];int i=0,j=0;for(int k=0;k<dg.edgenum;k++){printf("请输入边邻接顶点的名称(空号隔开):");scanf("%s %s",head,tail);  //输入下一个点的名称if(strlen(head)!=strlen(tail)){printf("输入错误!!!");return false;}i=locatevex(dg,*head);  //弧头为ij=locatevex(dg,*tail);  //弧尾为jprintf("下标=%d %d\n",i,j);dg.edges[i][j].adj=1;   //有向图的二维矩阵}printf("无向图创建成功!!!\n"); //输出有向图的邻接矩阵printf("====无向图的邻接矩阵====\n");for(int i=0;i<dg.vertnum;i++){for(int j=0;j<dg.vertnum;j++){printf("%3d",dg.edges[i][j].adj);}printf("\n");}return true;
}
//创建无向网
/*和无向图的唯一区别就是,邻接矩阵存储的是权重值*/
int create_UDN(amgragh &g)
{printf("=====无向网=====\n");printf("请输入无向网的顶点数和边数:");    scanf("%d %d",&g.vertnum,&g.edgenum);if(g.edgenum>g.vertnum*(g.vertnum-1)/2){  //边数=顶点数*(顶点数)/2int edgenum;printf("边数<=%d\n",g.vertnum*(g.vertnum-1)/2);printf("输入错误\n");return false;}//初始化邻接矩阵for(int i=0;i<g.vertnum;i++){for(int j=0;j<g.vertnum;j++){g.edges[i][j].adj=0;  //初始化邻接矩阵g.edges[i][j].info=1000;  //无向网边的信息}} //输入无向网的顶点的名称printf("请输入顶点的名称(空号隔开):");for(int i=0;i<g.vertnum;i++){scanf("%s",&g.vert[i]);    //输入每个顶点的名称}//将无向网转化为邻接矩阵存储char v1[40],v2[40];int w;for(int k=0;k<g.edgenum;k++){printf("请输入边邻接顶点的名称、弧长的信息(空号隔开):");scanf("%s %s %d",v1,v2,&w);  //输入下一个点的名称int i=locatevex(g,*v1);  //根据顶点名称找到其在邻接矩阵中的下标int j=locatevex(g,*v2);  //第二个元素printf("下标=%d %d\n",i,j);g.edges[i][j].info=w;   //无向图的二维矩阵沿对角线对称g.edges[j][i].info=w;}   //输出无向网的邻接矩阵for(int i=0;i<g.edgenum;i++){for(int j=0;j<g.edgenum;j++){printf("%6d",g.edges[i][j].info);  //输出的是弧的信息}printf("\n");}
}
//创建有向网
/*和有向图的唯一区别就是:邻接矩阵是权重值*/
int create_DN(amgragh &dg)
{printf("=====有向网=====\n");printf("请输入有向网的顶点数和弧数:");  scanf("%d %d",&dg.vertnum,&dg.edgenum);  //输入顶点数个边数if(dg.edgenum>dg.vertnum*(dg.vertnum-1)){  //边数=顶点数*(顶点数)int edgenum;printf("边数<=%d\n",dg.vertnum*(dg.vertnum-1));printf("输入错误\n");return false;}    //依次输入顶点的名称printf("请依次输入顶点的名称:");for(int i=0;i<dg.vertnum;i++){scanf("%s",&dg.vert[i]);    //输入每个顶点的名称}//初始化邻接矩阵,即0矩阵for(int i=0;i<dg.vertnum;i++){for(int j=0;j<dg.vertnum;j++){dg.edges[i][j].adj=0;  //初始化邻接矩阵dg.edges[i][j].info=1000;  //无向图没有权重值}}//有向图转为邻接矩阵存储char head[40],tail[40];int w;for(int k=0;k<dg.edgenum;k++){printf("请输入弧头、弧尾、弧的信息(空号隔开):");scanf("%s %s %d",head,tail,&w);  //输入下一个点的名称if(strlen(head)!=strlen(tail)){printf("输入错误!!!");return false;}int i=locatevex(dg,*head);  //弧头为iint j=locatevex(dg,*tail);  //弧尾为jprintf("下标=%d %d\n",i,j);dg.edges[i][j].info=w;   //有向图的二维矩阵}printf("有向网创建成功!!!\n"); //输出有向图的邻接矩阵printf("====有向网的邻接矩阵====\n");for(int i=0;i<dg.vertnum;i++){for(int j=0;j<dg.vertnum;j++){printf("%6d",dg.edges[i][j].info);}printf("\n");}return true;
}
//选择创建的图
int creategragh(amgragh &g)
{int expression;printf("0.退出\n1.UDG\n2.DG\n3.UDN\n4.DN\n");printf("请选择:");scanf("%d",&expression);switch (expression){case 1:{create_UG(g);   //创建无向图break;}case 2:{create_DG(g);  //创建有向图   break;}case 3:{create_UDN(g);  //创建无向网  break;}case 4:{create_DN(g);  //创建有向网break;}default:break;}return true;
}int main()
{amgragh G; creategragh(G);return true;
}

测试结果如下:

图的基本操作(C语言)相关推荐

  1. 图的基本操作实现(数据结构实验)

    实验项目六 图结构基本操作的实现 课程名称:数据结构 实验项目名称:图结构基本操作的实现 实验目的: 1.掌握图的基本操作-遍历. 实验要求: 1.    分别用DFS和BFS的方法实现一个无向图的遍 ...

  2. 邻接表1试在邻接表存储结构上实现图的基本操作 insert_vertex 和 insert_arc,相关定义如下:icoding---算法改进--配详细注释

    邻接表1 试在邻接表存储结构上实现图的基本操作 insert_vertex 和 insert_arc,相关定义如下: typedef int VertexType; typedef enum{DG, ...

  3. 邻接表2 -试在邻接表存储结构上实现图的基本操作 del_vertex-数据结构-图-icoding

    邻接表2 试在邻接表存储结构上实现图的基本操作 del_vertex,相关定义如下: typedef int VertexType;typedef enum{DG, UDG }GraphType;ty ...

  4. 邻接表1 - 试在邻接表存储结构上实现图的基本操作 insert_vertex 和 insert_arc-数据结构-图-icoding

    邻接表1 试在邻接表存储结构上实现图的基本操作 insert_vertex 和 insert_arc,相关定义如下: typedef int VertexType;typedef enum{DG, U ...

  5. 数据结构-图-邻接矩阵-试在邻接矩阵存储结构上实现图的基本操作 matrix_insert_vertex 和matrix_insert_arc-icoding

    邻接矩阵 试在邻接矩阵存储结构上实现图的基本操作 matrix_insert_vertex 和matrix_insert_arc,相关定义如下: typedef int VertexType;type ...

  6. 数据结构之图的基本操作

    图的基本操作 基本操作: 判断边是否存在: 列出与某节点相邻的边: 在图中插入一个顶点: 在图中删除一个顶点: 在图中添加一条边: 在图中删除一个边: 查找某顶点的第一个邻接点: 查找某边的权值: 查 ...

  7. python数据结构实验目的_图的基本操作实现(数据结构实验)

    课程名称:数据结构 实验项目名称:图结构基本操作的实现 实验目的: 1.掌握图的基本操作-遍历. 实验要求: 1. 分别用DFS和BFS的方法实现一个无向图的遍历. 实验过程: 1. 创建一个图(可用 ...

  8. 6-5图-图的基本操作

    图的基本操作 一.先学几个单词 adjacent [əˈdʒeɪsnt] 邻近的adj. neighbors [ˈneɪbəz] 邻近v.n. insert [ɪnˈsɜːt , ˈɪnsɜːt] 插 ...

  9. C++数据结构实验--图的基本操作

    实验四 图的基本操作 1.实验内容与要求 理解邻接矩阵和邻接表的概念 任选一种存储方式实现以下操作:图的构造.深度优先遍历以及广度优先遍历 选作:最小生成树和最短路径. 2.实验环境 硬件环境:计算机 ...

最新文章

  1. 永洪报表工具_该怎么选BI工具
  2. 生成对抗网络(GAN)相比传统训练方法有什么优势?(一)
  3. 微信小程序 rpx和px转换
  4. vue官方eslint插件配置eslint-plugin-vue-libs
  5. 微机个人笔记-随机存取存储器(RAM)
  6. Windows2003四大必知版本
  7. 普通用户从非80端口启动tomcat,通过端口转发监听80端口
  8. 列转行 带逗号_Excel 统计压岁钱?按逗号拆分单元格且纵向排列,分离中文和数字...
  9. 高级商务办公软件应用【14】
  10. imdisk虚拟光驱安装linux,imdisk使用教程_Imdisk工具使用方法介绍_imdisk_imdisk虚拟光驱...
  11. 手机qq怎么添加相册表情包_手机qq怎么制作表情包配文字
  12. oracle dsi 培训,DSI学习笔记
  13. Theos-tweak工程
  14. 《游戏设计艺术(第2版)》——学习笔记(13)第13章 游戏机制必须平衡
  15. ORB-SLAM3安装遇到的问题及解决
  16. mysql左联和右联_MySQL左联、右联查询接where和and条件的区别
  17. python实现趋势外推法
  18. 小功率直流电机的驱动电路
  19. 【有奖众测】快服务开发者俱乐部第一期来咯!
  20. 《感动中国》2005年度人物评选揭晓

热门文章

  1. 笔记本计算机作文,介绍笔记本电脑的作文600字
  2. 产品负责人 VS 产品经理
  3. VIVO推送接入 OPPO推送接入 客户端+服务端
  4. 记一次阿里云黑客攻击事件
  5. 图片放大出现锯齿问题
  6. python之用scapy分层解析pcap报文(Ethernet帧、IP数据包、TCP数据包、UDP数据包、Raw数据包)
  7. DELL OMSA(SrvAdmin)-监控软件与Promethues结合
  8. Android软件安全与逆向分析下载电子书pdf下载
  9. 华为手机左侧快捷方式_华为手机的这六个快捷键,让使用更简便!
  10. python3切割圆形图片