




已阅读5页,还剩6页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
浙江大学城市学院实验报告课程名称 数据结构基础 实验项目名称 实验十三 图的基本操作邻接表存储结构 学生姓名 专业班级 学号 实验成绩 指导老师(签名 ) 日期 2015-1-15 一. 实验目的和要求1、掌握图的存储结构:邻接表。2、学会对图的存储结构进行基本操作。二. 实验内容1、图的邻接表的定义及实现:建立头文件AdjLink.h,在该文件中定义图的邻接表存储结构,并编写图的初始化、建立图、输出图、输出图的每个顶点的度等基本操作实现函数。同时在主函数文件test5_2.cpp中调用这些函数进行验证。2、选做:编写图的深度优先遍历函数与广度优先遍历函数,要求把这两个函数添加到头文件AdjLink.h中,并在主函数文件test5_2.cpp中添加相应语句进行测试。3、填写实验报告,实验报告文件取名为report13.doc。4、上传实验报告文件report13.doc及源程序文件test5_2.cpp、AdjLink.h到Ftp服务器上自己的文件夹下。三. 函数的功能说明及算法思路 (包括每个函数的功能说明,及一些重要函数的算法实现思路)邻接表表示法的C语言描述:typedef struct Node int adjvex; / 邻接点的位置WeightType weight; /权值域,根据需要设立struct Node *next; / 指向下一条边(弧) edgenode; / 边结点typedef edgenode *adjlist MaxVertexNum ;/定义图的邻接表结构类型(没包含顶点信息)typedef structvexlist vexs; /顶点数据元素adjlist List; /边结点int n; /顶点数int k1,k2; /k1为有无向,k2为有无权Adjlist;const int MaxVertexNum = 10; /*图的最大顶点数*/const int MaxEdgeNum = 100; /*图的最大边数*/const int MaxValue = 10000; /*无穷大的具体值*/typedef int WeightType; /*定义权的类型*/typedef char VertexType;typedef VertexType vexlistMaxVertexNum; /*定义顶点数组类型*/抽象数据类型:ADT Graph is Data: 一个邻接表,存储类型用adjlist表示 Operations: void InitAdjoin(adjlist GL)/初始化函数 void CreateAdjoin(adjlist GL,int n,char *s,int k1,int k2) /建立邻接表函数 void PrintAdjoin( adjlist GL, int n, int k1, int k2) /把邻接表表示的图用顶点集和边集的形式输出的算法 void PrintDegree(vexlist V,adjlist GL,int n,int k1) /输出图的每个顶点的度 void dfsAdjoin(adjlist GL,int i,int n,bool *visited)/深度优先遍历函数 void bfsAdjoin(adjlist GL,int i,int n, bool *visited)/广度优先遍历end度的算法(PrintDegree):建立一个数组存放所以顶点的度,若为无向图,根据边缘结点的指针数组计算该结点的度;若为有向图,查找所有边缘结点的邻接点域,当前结点的度为该节点对应的度+1队列:typedef char ElemType;struct QueueElemType *queue;int front,rear;int MaxSize;Operations:void InitQueue(Queue &Q) /初始化循环队列Qint EmptyQueue(Queue Q)/判断队列是否为空,空返回1,否则返回0void EnQueue(Queue &Q,ElemType item)/ 入队列ElemType OutQueue(Queue &Q) / 出队列end Queue四. 实验结果与分析(包括运行结果截图、结果分析等)无向无权图:有向无权图:无向有权图:有向有权图:五. 心得体会该邻接表与上一个实验邻接矩阵差不多,做起来比较简单,只是将度的算法比较麻烦。【附录-源程序】test5_2.cpp:#include#include#include#include#includeconst int MaxVertexNum = 10; /*图的最大顶点数*/const int MaxEdgeNum = 100; /*图的最大边数*/const int MaxValue = 10000; /*无穷大的具体值*/typedef int WeightType; /*定义权的类型*/typedef char VertexType;typedef VertexType vexlistMaxVertexNum; /*定义顶点数组类型*/#include AdjLink.h void main()Adjlist GL;/邻接表int i;coutGL.n;cout请输入图的顶点集合(如:abc)endl;for(i=0; iGL.vexsi;coutGL.k1GL.k2;bool *visited=new boolGL.n; /定义并动态分配标志数组InitAdjoin(GL.List);couta;CreateAdjoin(GL.List,GL.n,a,GL.k1,GL.k2);PrintDegree(GL.vexs,GL.List,GL.n,GL.k1);cout按图的邻接表得到的深度优先遍历序列:endl;for(i=0;iGL.n;i+) visitedi=false;dfsAdjoin(GL.List,0,GL.n,visited);coutendl;cout按图的邻接表得到的广度优先遍历序列:endl;for(i=0;iGL.n;i+) visitedi=false;bfsAdjoin(GL.List,0,GL.n,visited);coutendl;PrintAdjoin(GL.List,GL.n,GL.k1,GL.k2);AdjLink.h:typedef struct Node int adjvex; / 邻接点的位置WeightType weight; /权值域,根据需要设立struct Node *next; / 指向下一条边(弧) edgenode; / 边结点typedef edgenode *adjlist MaxVertexNum ;/定义图的邻接表结构类型(没包含顶点信息)typedef structvexlist vexs; /顶点数据元素adjlist List; /边结点int n; /顶点数int k1,k2; /k1为有无向,k2为有无权Adjlist;void InitAdjoin(adjlist GL)/初始化函数int i;for(i=0;iMaxVertexNum;i+)GLi = NULL;void CreateAdjoin(adjlist GL,int n,char *s,int k1,int k2)/建立邻接表函数 / n为顶点数。 k1=0 代表无向图否则为有向图, / k2 =0 代表无权图否则为带权图。 / s存放边集,如:3,8,6,(2,3),(1,0),(2,0)istrstream sin(s);char c1,c2,c3;int i, j;WeightType w;edgenode *p; /将指向新申请的边结点sinc1; /读入第一个字符 if(k2=0) / 建立无权图do sinc1ic2jc3;p = (edgenode *) malloc(sizeof(edgenode);p-adjvex=j; p-weight=1; /插入边结点p-next = GLi; GLi = p;if (k1=0) /对无向图,需再插入一个边结点p = (edgenode *) malloc(sizeof(edgenode);p-adjvex=i; p-weight=1; p-next = GLj; GLj = p;sinc1; /读入, 或 while ( c1=,);else / 建立有权图do sinc1ic2jc3w; p = (edgenode *) malloc(sizeof(edgenode); p-adjvex=j; p-weight=w; /插入边结点 p-next = GLi; GLi = p; if (k1=0) /对无向图,需再插入一个边结点p = (edgenode *) malloc(sizeof(edgenode); p-adjvex=i; p-weight=w; p-next = GLj; GLj = p;sinc1; /读入, 或 while ( c1=, );void PrintAdjoin( adjlist GL, int n, int k1, int k2)/把邻接表表示的图用顶点集和边集的形式输出的算法 / k1=0 代表无向图否则为有向图, / k2 =0 代表无权图否则为带权图int i, j;edgenode *p;cout V= ; /准备输出顶点集for (i=0; in-1; i+)couti,; coutn-1endl; cout E= ; /准备输出边集for (i=0; iadjvex;if(k1=0) /无向图if (ij) cout(i,j),;else /有向图couti,jnext;else /带权图p=GLi;while(p)j=p-adjvex;if(k1=0) /无向图if (ij)cout(i,j)weight,;else /有向图couti,jweightnext; /for coutendl;void PrintDegree(vexlist V,adjlist GL,int n,int k1) /输出图的每个顶点的度int i,j;int *d=new intn;/存放结点的度的数组edgenode *p,*q;for(i=0;inext;if(k1)for(j=0;jadjvex=i)di+;q=q-next;coutVi的度为diendl;delete d; /*=选作部分=*/typedef char ElemType;struct QueueElemType *queue;int front,rear;int MaxSize;void InitQueue(Queue &Q) /初始化循环队列QQ.MaxSize=10;Q.queue=(ElemType *)malloc(sizeof(ElemType)*Q.MaxSize);Q.rear=Q.front=0;int EmptyQueue(Queue Q)/判断队列是否为空,空返回1,否则返回0return Q.front=Q.rear;void EnQueue(Queue &Q,ElemType item)/ 入队列if(Q.rear+1) % Q.MaxSize = Q.front)/若队列已满,重新分配2倍大的空间Q.queue=(ElemType *)realloc(Q.queue,2*Q.MaxSize*sizeof(ElemType);if(Q.rear != Q.MaxSize-1) /原队列尾部内容向后移for(int i=0; i=Q.rear; i+)Q.queuei+Q.MaxSize = Q.queuei;Q.rear=Q.rear+Q.MaxSize;Q.MaxSize=2*Q.MaxSize; / 插入itemQ.rear=(Q.rear+1)%Q.MaxSize;Q.queueQ.rear=item;ElemType OutQueue(Queue &Q) / 出队列if(Q.front=Q.rear) /若空队列,则结束运行cerr 队列已空,无法删除! endl;exit(1); /删除队头元素,并返回该元素Q.front=(Q.front +1)%Q.MaxSize;return Q.queueQ.fr
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 中医在线考试试题及答案
- 消防安全演练培训档案课件
- 酒店餐饮资料培训
- 2025至2030液压车行业产业运行态势及投资规划深度研究报告
- 消防安全检查培训通知课件
- 英语课件对教学的帮助
- 教学课件算课吗
- 尿毒症高血压护理查房
- 护理不良事件处理流程
- 石油化学品罐车运输安全责任及保险合同
- 中国宠物服务行业市场发展分析及发展前景与投资策略研究报告
- 医院转诊合同标准文本
- 新课标解读丨《义务教育道德与法治课程标准(2022年版)》解读课件
- 2025年建筑施工安全管理人员考试题库试题
- 老年人误吸的预防
- 《天津天狮奖金制度》课件
- DB33T 2231-2019 渔港防台风等级评估规程
- 护理礼仪(第3版) 课件 第四章 护士仪态礼仪
- 【课件】平衡功能的训练
- 认识中国特色社会主义文化
- 供电所所长讲安全课
评论
0/150
提交评论