ImageVerifierCode 换一换
格式:DOCX , 页数:13 ,大小:89.54KB ,
资源ID:13432419      下载积分:5 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-13432419.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(大数据结构与算法实验图的基本操作.docx)为本站会员(b****6)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

大数据结构与算法实验图的基本操作.docx

1、大数据结构与算法实验图的基本操作图的基本操作实验报告图的基本操作实验报告 实验名称图的基本操作实验目的1.掌握图的各种存储结构,特别要熟练掌握邻接矩阵和邻接表的存储结构;2.遍历是图各种应用的算法的基础,要熟练掌握图的深度优先遍历和广度优先遍历的算法,复习栈和队列的应用;3.掌握以邻接矩阵作为存储结构的生成图的最小生成树的普利姆算法;实验内容编制一个演示图的邻接表的创建、深度遍历、广度遍历操作的程序。问题描述用数据结构相关知识,实现邻接表的定义和操作。该程序包括图的邻接表的结点类型定义以及对图操作的具体的函数定义(包括:建立图的邻接表、深度优先遍历图、广度优先遍历图)。问题分析该实验是基于C语

2、言和数据结构知识基础的对图的基本操作的检验,无需设计复杂的算法,程序语句也相对简单。因此,我直接按要求定义了对图操作的具体函数,并于主函数中实现对应的功能调用。 实验步骤1需求分析 本演示程序用VC+编写,完成图的邻接表的生成、遍历基本操作。1输入的形式和输入值的范围:在输入邻接表顶点信息前,必须先确定该信息能正确创建邻接表。 输出的形式:在所有三种操作中都显示操作是否正确以及操作后图的内容。 程序所能达到的功能:完成图的邻接表的生成、深度优先遍历、广度优先遍历基本操作。 测试数据:创建操作中依次输入7,7作为顶点数和边数,以(0,1)(0,2)(1,3)(1,5)(3,4)(3,6)(4,5

3、)作为各顶点信息生成一个邻接表。2概要设计1)为了实现上述程序功能,需要定义二叉树的抽象数据类型:ADTGraph数据对象:顶点的有穷非空集合和边的集合数据关系:结点具有相同的数据类型及层次结构基本操作:Void InitGraph(ALGraph *G) 初始条件:无操作结果:初始化图Void DFSTraverse(ALGraph *G)初始条件:图Graph已存在操作结果:按深度优先遍历图的邻接表Void BFSTraverse(ALGraph *G)初始条件:图Graph已存在操作结果:按广度优先遍历图的邻接表2)本程序包含7个函数:主函数main()建立一个图的邻接表函数Create

4、GraphAL ()深度优先遍历图 DFS ()广度优先遍历 BFS() 函数说明#include #include #define MaxVertexNum 100#define QueueSize 30 typedef enumFALSE,TRUEBoolean; Boolean visitedMaxVertexNum; typedef char VertexType;typedef int EdgeType;typedef struct node /边表结点 int adjvex; /邻接点域 struct node *next; /域链 /若是要表示边上的权,则应增加一个数据域Edge

5、Node;typedef struct vnode /顶点边结点 VertexType vertex; /顶点域 EdgeNode *firstedge;/边表头指针VertexNode;typedef VertexNode AdjListMaxVertexNum; /AdjList是邻接表类型typedef struct AdjList adjlist; /邻接表 int n,e; /图中当前顶点数和边数ALGraph; void CreateGraphAL (ALGraph *G) int i,j,k; EdgeNode * s; printf(请输入顶点数和边数(输入格式为:顶点数,边数

6、):n); scanf(%d,%d,&(G-n),&(G-e); / 读入顶点数和边数 printf(请输入顶点信息(输入格式为:顶点号)每个顶点以回车作为结束:n); for (i=0;in;i+) / 立有n个顶点的顶点表 scanf(n%c,&(G-adjlisti.vertex); / 读入顶点信息 G-adjlisti.firstedge=NULL; / 点的边表头指针设为空 printf(请输入边的信息(输入格式为:i,j):n); for (k=0;ke;k+) / 建立边表 scanf(n%d,%d,&i,&j); / 读入边的顶点对应序号 s=new EdgeNode; /

7、生成新边表结点s s-adjvex=j; / 邻接点序号为j s-next=G-adjlisti.firstedge; / 将新边表结点s插入到顶点Vi的边表头部 G-adjlisti.firstedge=s; s=new EdgeNode; s-adjvex=i; s-next=G-adjlistj.firstedge; G-adjlistj.firstedge=s; /*/* 深度优先遍历 */*/ void DFS(ALGraph *G,int i) /以vi为出发点对邻接表表示的图G进行深度优先搜索 EdgeNode *p; printf(visit vertex:%cn,G-adjl

8、isti.vertex); / 访问顶点vi visitedi=TRUE; /标记vi已访问 p=G-adjlisti.firstedge; /取vi边表的头指针 while(p) /依次搜索vi的邻接点vj,这里j=p-adjvex if (!visitedp-adjvex) /若vi尚未被访问 DFS(G,p-adjvex); /则以Vj为出发点向纵深搜索 p=p-next; /找vi的下一邻接点 void DFSTraverseM(ALGraph *G) int i; for(i=0;in;i+) visitedi=FALSE; for(i=0;in;i+) if(!visitedi)

9、DFS(G,i); /*/* 广度优先遍历 */*/typedef struct int front; int rear; int count; int dataQueueSize; CirQueue; void InitQueue(CirQueue *Q) Q-front=Q-rear=0; Q-count=0; int QueueEmpty(CirQueue *Q) return Q-front=Q-rear; int QueueFull(CirQueue *Q) return (Q-rear+1)%QueueSize=Q-front; void EnQueue(CirQueue *Q,i

10、nt x) if (QueueFull(Q) printf(Queue overflow); else Q-count+; Q-dataQ-rear=x; Q-rear=(Q-rear+1)%QueueSize; int DeQueue(CirQueue *Q) int temp; if(QueueEmpty(Q) printf(Queue underflow); return false; else temp=Q-dataQ-front; Q-count-; Q-front=(Q-front+1)%QueueSize; return temp; void BFS(ALGraph*G,int

11、k) / 以vk为源点对用邻接表表示的图G进行广度优先搜索 int i; CirQueue Q; /须将队列定义中DataType改为int EdgeNode *p; InitQueue(&Q); /队列初始化 printf(visit vertex:%cn,G-adjlistk.vertex); /访问源点vk visitedk=TRUE; EnQueue(&Q,k); /vk已访问,将其人队。(实际上是将其序号人队) while(!QueueEmpty(&Q) /队非空则执行 i=DeQueue(&Q); /相当于vi出队 p=G-adjlisti.firstedge; /取vi的边表头指

12、针 while(p) /依次搜索vi的邻接点vj(令p-adjvex=j) if(!visitedp-adjvex) /若vj未访问过 printf(visit vertex:%cn,G-adjlistp-adjvex.vertex); /访问vj visitedp-adjvex=TRUE; EnQueue(&Q,p-adjvex); /访问过的vj人队 p=p-next; /找vi的下一邻接点 void BFSTraverseM(ALGraph *G) int i; for (i=0;in;i+) visitedi=FALSE; for (i=0;in;i+) if (!visitedi)

13、BFS(G,i); /*/* 主函数调用 */*/int main() int n; ALGraph G; CreateGraphAL(&G); printf(深度优先遍历:n); DFSTraverseM(&G); printf(广度优先遍历:n); BFSTraverseM(&G); return 0;程序流程图调试报告发现问题:1.在创建图的邻接表以后,得到的深度优先遍历和自己在草稿纸上演算得到的序列不符。2.在创建图的邻接表以后,得到的广度优先遍历和自己在草稿纸上演算得到的序列不符。调试:1.仔细检查程序后,发现是因为创建邻接表的方法是头插法;2.检查程序,发现依据队列的长度而判断队满

14、和队空的条件不能实现。解决方案:1.我重新在草稿纸上对用头插法建立的邻接表进行深度遍历;2.将队满的条件修改为:(rear+1)%QueueSize=front;将队空的条件修改为:rear=front结果:结果运行正确!使用说明建立邻接表深度优先遍历广度优先遍历心得体会数据结构顾名思义讲求的是一种存储结构,一路走来先后学习了表、树,最后学习的是图,对于每种存储结构学习之初都会学习一些基本操作,而操作之中又以创建和遍历为最基本的操作,只有熟练掌握了以后才能对其他操作进行研究和学习。图的存储结构相比表和树都要复杂,其操作过程也较难进行掌握。仅仅是创建图的存储结构便分为矩阵、临接链表、十字链表等,

15、对于每一种存储结构又分为有向与无向之分。然而,深度优先和广度优先是两种算法,其算法思想并不依赖与元素的存储方式,也就是说算法思想不会因为存储结构的改变而发生改变,当然对于不同的存储结构仅仅是代码的表现形式不同而已,正所谓一同百通,只要熟悉存储结构的特点又对算法思想烂熟于心便可无往不胜。以下是存在的问题:1.程序编写时,必须要细心。有时候问题出现了,可能会一直查不出来,自己也不容易发现。在编写这个程序时,我就出现了这个问题,之后一定要尽量避免此类问题出现。2.加强练习,提高能力。这几个子函数的名称都是我边看着书边写的,还没有完全脱离书本,把这个程序真正变成自己建的东西,所以我还要加强记忆,加强练习。

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2