图的基本操作(C语言)
图的基本操作
- 图(顺序存储)
- 无向图、有向图、无向网、有向网
编译器: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. 分别用DFS和BFS的方法实现一个无向图的遍 ...
- 邻接表1试在邻接表存储结构上实现图的基本操作 insert_vertex 和 insert_arc,相关定义如下:icoding---算法改进--配详细注释
邻接表1 试在邻接表存储结构上实现图的基本操作 insert_vertex 和 insert_arc,相关定义如下: typedef int VertexType; typedef enum{DG, ...
- 邻接表2 -试在邻接表存储结构上实现图的基本操作 del_vertex-数据结构-图-icoding
邻接表2 试在邻接表存储结构上实现图的基本操作 del_vertex,相关定义如下: typedef int VertexType;typedef enum{DG, UDG }GraphType;ty ...
- 邻接表1 - 试在邻接表存储结构上实现图的基本操作 insert_vertex 和 insert_arc-数据结构-图-icoding
邻接表1 试在邻接表存储结构上实现图的基本操作 insert_vertex 和 insert_arc,相关定义如下: typedef int VertexType;typedef enum{DG, U ...
- 数据结构-图-邻接矩阵-试在邻接矩阵存储结构上实现图的基本操作 matrix_insert_vertex 和matrix_insert_arc-icoding
邻接矩阵 试在邻接矩阵存储结构上实现图的基本操作 matrix_insert_vertex 和matrix_insert_arc,相关定义如下: typedef int VertexType;type ...
- 数据结构之图的基本操作
图的基本操作 基本操作: 判断边是否存在: 列出与某节点相邻的边: 在图中插入一个顶点: 在图中删除一个顶点: 在图中添加一条边: 在图中删除一个边: 查找某顶点的第一个邻接点: 查找某边的权值: 查 ...
- python数据结构实验目的_图的基本操作实现(数据结构实验)
课程名称:数据结构 实验项目名称:图结构基本操作的实现 实验目的: 1.掌握图的基本操作-遍历. 实验要求: 1. 分别用DFS和BFS的方法实现一个无向图的遍历. 实验过程: 1. 创建一个图(可用 ...
- 6-5图-图的基本操作
图的基本操作 一.先学几个单词 adjacent [əˈdʒeɪsnt] 邻近的adj. neighbors [ˈneɪbəz] 邻近v.n. insert [ɪnˈsɜːt , ˈɪnsɜːt] 插 ...
- C++数据结构实验--图的基本操作
实验四 图的基本操作 1.实验内容与要求 理解邻接矩阵和邻接表的概念 任选一种存储方式实现以下操作:图的构造.深度优先遍历以及广度优先遍历 选作:最小生成树和最短路径. 2.实验环境 硬件环境:计算机 ...
最新文章
- 永洪报表工具_该怎么选BI工具
- 生成对抗网络(GAN)相比传统训练方法有什么优势?(一)
- 微信小程序 rpx和px转换
- vue官方eslint插件配置eslint-plugin-vue-libs
- 微机个人笔记-随机存取存储器(RAM)
- Windows2003四大必知版本
- 普通用户从非80端口启动tomcat,通过端口转发监听80端口
- 列转行 带逗号_Excel 统计压岁钱?按逗号拆分单元格且纵向排列,分离中文和数字...
- 高级商务办公软件应用【14】
- imdisk虚拟光驱安装linux,imdisk使用教程_Imdisk工具使用方法介绍_imdisk_imdisk虚拟光驱...
- 手机qq怎么添加相册表情包_手机qq怎么制作表情包配文字
- oracle dsi 培训,DSI学习笔记
- Theos-tweak工程
- 《游戏设计艺术(第2版)》——学习笔记(13)第13章 游戏机制必须平衡
- ORB-SLAM3安装遇到的问题及解决
- mysql左联和右联_MySQL左联、右联查询接where和and条件的区别
- python实现趋势外推法
- 小功率直流电机的驱动电路
- 【有奖众测】快服务开发者俱乐部第一期来咯!
- 《感动中国》2005年度人物评选揭晓