第十二周 项目一--图基本算法库
问题及代码:
main.cpp:
- /*
- Copyright (c)2016,烟台大学计算机与控制工程学院
- All rights reserved.
- 文件名称:tu.pp
- 作 者: 陈朋
- 完成日期:2016年11月24日
- 版 本 号:v1.0
- 问题描述:
- 输入描述:无
- 程序输出:若干。
- */
- #include <stdio.h>
- #include <malloc.h>
- #include "graph.h"
- int main()
- {
- MGraph g1,g2;
- ALGraph *G1,*G2;
- int A[6][6]=
- {
- {0,5,0,7,0,0},
- {0,0,4,0,0,0},
- {8,0,0,0,0,9},
- {0,0,5,0,0,6},
- {0,0,0,5,0,0},
- {3,0,0,0,1,0}
- };
- ArrayToMat(A[0], 6, g1); //取二维数组的起始地址作实参,用A[0],因其实质为一维数组地址,与形参匹配
- printf(" 有向图g1的邻接矩阵:\n");
- DispMat(g1);
- ArrayToList(A[0], 6, G1);
- printf(" 有向图G1的邻接表:\n");
- DispAdj(G1);
- MatToList(g1,G2);
- printf(" 图g1的邻接矩阵转换成邻接表G2:\n");
- DispAdj(G2);
- ListToMat(G1,g2);
- printf(" 图G1的邻接表转换成邻接邻阵g2:\n");
- DispMat(g2);
- printf("\n");
- return 0;
- }
graph.h
- #ifndef GRAPH_H_INCLUDED
- #define GRAPH_H_INCLUDED
- #define MAXV 100 //最大顶点个数
- #define INF 32767 //INF表示∞
- typedef int InfoType;
- //以下定义邻接矩阵类型
- typedef struct
- {
- int no; //顶点编号
- InfoType info; //顶点其他信息,在此存放带权图权值
- } VertexType; //顶点类型
- typedef struct //图的定义
- {
- int edges[MAXV][MAXV]; //邻接矩阵
- int n,e; //顶点数,弧数
- VertexType vexs[MAXV]; //存放顶点信息
- } MGraph; //图的邻接矩阵类型
- //以下定义邻接表类型
- typedef struct ANode //弧的结点结构类型
- {
- int adjvex; //该弧的终点位置
- struct ANode *nextarc; //指向下一条弧的指针
- InfoType info; //该弧的相关信息,这里用于存放权值
- } ArcNode;
- typedef int Vertex;
- typedef struct Vnode //邻接表头结点的类型
- {
- Vertex data; //顶点信息
- int count; //存放顶点入度,只在拓扑排序中用
- ArcNode *firstarc; //指向第一条弧
- } VNode;
- typedef VNode AdjList[MAXV]; //AdjList是邻接表类型
- typedef struct
- {
- AdjList adjlist; //邻接表
- int n,e; //图中顶点数n和边数e
- } ALGraph; //图的邻接表类型
- //功能:由一个反映图中顶点邻接关系的二维数组,构造出用邻接矩阵存储的图
- //参数:Arr - 数组名,由于形式参数为二维数组时必须给出每行的元素个数,在此将参数Arr声明为一维数组名(指向int的指针)
- // n - 矩阵的阶数
- // g - 要构造出来的邻接矩阵数据结构
- void ArrayToMat(int *Arr, int n, MGraph &g); //用普通数组构造图的邻接矩阵
- void ArrayToList(int *Arr, int n, ALGraph *&); //用普通数组构造图的邻接表
- void MatToList(MGraph g,ALGraph *&G);//将邻接矩阵g转换成邻接表G
- void ListToMat(ALGraph *G,MGraph &g);//将邻接表G转换成邻接矩阵g
- void DispMat(MGraph g);//输出邻接矩阵g
- void DispAdj(ALGraph *G);//输出邻接表G
- #endif // GRAPH_H_INCLUDED
graph.cpp
- #include <stdio.h>
- #include <malloc.h>
- #include "graph.h"
- //功能:由一个反映图中顶点邻接关系的二维数组,构造出用邻接矩阵存储的图
- //参数:Arr - 数组名,由于形式参数为二维数组时必须给出每行的元素个数,在此将参数Arr声明为一维数组名(指向int的指针)
- // n - 矩阵的阶数
- // g - 要构造出来的邻接矩阵数据结构
- void ArrayToMat(int *Arr, int n, MGraph &g)
- {
- int i,j,count=0; //count用于统计边数,即矩阵中非0元素个数
- g.n=n;
- for (i=0; i<g.n; i++)
- for (j=0; j<g.n; j++)
- {
- g.edges[i][j]=Arr[i*n+j]; //将Arr看作n×n的二维数组,Arr[i*n+j]即是Arr[i][j],计算存储位置的功夫在此应用
- if(g.edges[i][j]!=0 && g.edges[i][j]!=INF)
- count++;
- }
- g.e=count;
- }
- void ArrayToList(int *Arr, int n, ALGraph *&G)
- {
- int i,j,count=0; //count用于统计边数,即矩阵中非0元素个数
- ArcNode *p;
- G=(ALGraph *)malloc(sizeof(ALGraph));
- G->n=n;
- for (i=0; i<n; i++) //给邻接表中所有头节点的指针域置初值
- G->adjlist[i].firstarc=NULL;
- for (i=0; i<n; i++) //检查邻接矩阵中每个元素
- for (j=n-1; j>=0; j--)
- if (Arr[i*n+j]!=0) //存在一条边,将Arr看作n×n的二维数组,Arr[i*n+j]即是Arr[i][j]
- {
- p=(ArcNode *)malloc(sizeof(ArcNode)); //创建一个节点*p
- p->adjvex=j;
- p->info=Arr[i*n+j];
- p->nextarc=G->adjlist[i].firstarc; //采用头插法插入*p
- G->adjlist[i].firstarc=p;
- }
- G->e=count;
- }
- void MatToList(MGraph g, ALGraph *&G)
- //将邻接矩阵g转换成邻接表G
- {
- int i,j;
- ArcNode *p;
- G=(ALGraph *)malloc(sizeof(ALGraph));
- for (i=0; i<g.n; i++) //给邻接表中所有头节点的指针域置初值
- G->adjlist[i].firstarc=NULL;
- for (i=0; i<g.n; i++) //检查邻接矩阵中每个元素
- for (j=g.n-1; j>=0; j--)
- if (g.edges[i][j]!=0) //存在一条边
- {
- p=(ArcNode *)malloc(sizeof(ArcNode)); //创建一个节点*p
- p->adjvex=j;
- p->info=g.edges[i][j];
- p->nextarc=G->adjlist[i].firstarc; //采用头插法插入*p
- G->adjlist[i].firstarc=p;
- }
- G->n=g.n;
- G->e=g.e;
- }
- void ListToMat(ALGraph *G,MGraph &g)
- //将邻接表G转换成邻接矩阵g
- {
- int i,j;
- ArcNode *p;
- g.n=G->n; //根据一楼同学“举报”改的。g.n未赋值,下面的初始化不起作用
- g.e=G->e;
- for (i=0; i<g.n; i++) //先初始化邻接矩阵
- for (j=0; j<g.n; j++)
- g.edges[i][j]=0;
- for (i=0; i<G->n; i++) //根据邻接表,为邻接矩阵赋值
- {
- p=G->adjlist[i].firstarc;
- while (p!=NULL)
- {
- g.edges[i][p->adjvex]=p->info;
- p=p->nextarc;
- }
- }
- }
- void DispMat(MGraph g)
- //输出邻接矩阵g
- {
- int i,j;
- for (i=0; i<g.n; i++)
- {
- for (j=0; j<g.n; j++)
- if (g.edges[i][j]==INF)
- printf("%3s","∞");
- else
- printf("%3d",g.edges[i][j]);
- printf("\n");
- }
- }
- void DispAdj(ALGraph *G)
- //输出邻接表G
- {
- int i;
- ArcNode *p;
- for (i=0; i<G->n; i++)
- {
- p=G->adjlist[i].firstarc;
- printf("%3d: ",i);
- while (p!=NULL)
- {
- printf("-->%d/%d ",p->adjvex,p->info);
- p=p->nextarc;
- }
- printf("\n");
- }
- }
- 运行结果:
第十二周 项目一--图基本算法库相关推荐
- 第十二周项目一----图基本算法库
/*烟台大学计算机与控制工程学院 作者:孙潇 时间:2015年11月13日 问题描述:定义图的邻接矩阵和邻接表存储结构,实现其基本运算,并完成测试. 输入描述:无 输出描述:若干数据 */ 头文件: ...
- 数据结构上机实践第11周项目1 - 图基本算法库
图基本算法库 本次实践将建立图的基本算法库,用以丰富算法库,灵活应对更多样的工程,所谓"技多不压身",算法亦如此. 本次实践将运用多文件组织工程的建立,点击此处参考.(编译 ...
- 第十二周项目4-利用遍历思想求解图问题(6-7)
/* Copyright (c)2015,烟台大学计算机与控制工程学院 All rights reserved. 文件名称:第十二周项目4-利用遍历思想求解图问题(6-7) 作 者:佟兴锋 完成日期: ...
- 第十二周项目二----操作用邻接表存储的图
/*烟台大学计算机与控制工程学院 时间2015年12月14日 作者:孙潇 问题描述:假设图G采用邻接表存储,分别设计实现以下要求的算法: (1)输出出图G中每个顶点的出度: (2)求出图G中出度最大的 ...
- 数据结构上机实践第11周项目3 - 图遍历算法实现
图遍历算法实现 本次实践将运用图结构基本算法库,进行遍历操作的实现,本次实践到的算法库点击此处参考.(编译环境:VC++6.0) 1.深度优先遍历--DFS 测试用图: 测试时用的图是,可以使用其他类 ...
- 数据结构上机实践第八周项目9-广义表算法库及应用
广义表算法库及应用 为了丰富算法库,以应对各类工程的需要,本次实践将进行广义表算法库的建立以及应用. 项目要求一: 建立广义表算法库,包括: ① 头文glist.h,定义数据类型,声明函数: ② ...
- 第十二周项目五-----迷宫问题之图深度优先遍历解法
烟台大学计算机与控制工程学院 作者:孙潇 时间:2015年12月15日 问题描述:[项目 - 迷宫问题之图深度优先遍历解法] 设计一个程序,采用深度优先遍历算法的思路,解决迷宫问题. ( ...
- 第十二周项目5-迷宫问题之图深度优先遍历解法
问题: /* * Copyright(c)2015,烟台大学计算机学院 * All right reserved. * 文件名称:项目5.cbp * 作者:李艺 * 完成日期:2015年11月20日 ...
- 第十二周项目四----利用遍历思想求解图问题之6最短路径
/*烟台大学计算机与控制工程学院 时间2015年12月14日 作者:孙潇 问题描述:假设图G采用邻接表存储,分别设计实现以下要求的算法,要求用区别于示例中的图进行多次测试,通过观察输出值,掌握相关问题 ...
- 第十二周项目四----利用遍历思想求解图问题之7最远顶点
/*烟台大学计算机与控制工程学院 时间2015年12月14日 作者:孙潇 问题描述:假设图G采用邻接表存储,分别设计实现以下要求的算法,要求用区别于示例中的图进行多次测试,通过观察输出值,掌握相关问题 ...
最新文章
- mongodb常用命令
- PS怎么将自己的形状存储为自定形状?
- 中间层体系结构的好处
- 一个可以显示具体时间的日历控件应用
- 安装windows 2003 R2额外域控制器时出现1168错误的解决
- 西数加密linux,Symantec PGP Desktop pgpwded.sys内核驱动任意代码执行漏洞
- 深度学习模型可解释性初探
- 使用IntelliJ IDEA配置Tomcat(入门)
- matlab中的变换器,buck变换器介绍_buck变换器matlab仿真
- 请不要 “妖魔化” 外包
- STM32中的IDR和ODR寄存器
- 【数据库】imp-00015
- c语言实现个人财务管理软件
- What is Scala
- C语言连接mysql数据库详细步骤
- Nandflash存储结构和地址分配
- WAS 中 IHS 配置参考,值的学习一下!
- 手机上安装Linux游戏模拟器,Linux系统上安装ePSXe 1.6.0游戏模拟器
- 星号表达式(starred expression)或在列表前面加星号(*)的作用
- java性别_java中的性别字段
热门文章
- MDK-ARM_V525新建工程 STM32使用软件仿真、RAM仿真调试及Flash下载配置详解
- Next.js中通过容联云通讯实现手机验证码收发
- cwRsync同步工具的使用
- 软件的界面测试是什么?怎么设计的?
- ps计算机设置在哪,在哪里设置PS对称渐变工具
- Elasticsearch 7.13 删除文档后如何释放存储空间、手动执行forcemerge操作
- 计算机专业的有关的外文文献,计算机专业外文外文 计算机专业专著类参考文献有哪些...
- 你了解PowerBI中的去年同期吗
- aws linux vps使用教程,亚马逊云(AWS)注册账号和启动服务器EC2(centos镜像)教程(踩坑记)...
- 页面自动添加font标签