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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

实验 图的表示与遍历完整.docx

1、实验 图的表示与遍历完整实验五图的表示与遍历一、实验目的1、掌握图的邻接矩阵和邻接表表示2、掌握图的深度优先和广度优先搜索方法3、理解图的应用方法二、实验预习说明以下概念1、深度优先搜索遍历:从根开始一个一个搜索2、广度优先搜索遍历:从根的邻接点出发依次访问3、拓扑排序: 一个无指向的点开始排序4、最小生成树:最小权的生成树5、最短路径:路径权数最小三、实验内容和要求1、阅读并运行下面程序,根据输入写出运行结果。#include#define N 20#define TRUE 1#define FALSE 0int visitedN;typedef struct /*队列的定义*/ int d

2、ataN; int front,rear;queue;typedef struct /*图的邻接矩阵*/ int vexnum,arcnum;char vexsN; int arcsNN;graph;void createGraph(graph *g); /*建立一个无向图的邻接矩阵*/void dfs(int i,graph *g); /*从第i个顶点出发深度优先搜索*/void tdfs(graph *g); /*深度优先搜索整个图*/void bfs(int k,graph *g); /*从第k个顶点广度优先搜索*/void tbfs(graph *g); /*广度优先搜索整个图*/vo

3、id init_visit(); /*初始化访问标识数组*/void createGraph(graph *g) /*建立一个无向图的邻接矩阵*/ int i,j; char v;g-vexnum=0; g-arcnum=0; i=0; printf(输入顶点序列(以#结束):n); while(v=getchar()!=#) g-vexsi=v; /*读入顶点信息*/ i+; g-vexnum=i; /*顶点数目*/ for(i=0;ivexnum;i+) /*邻接矩阵初始化*/ for(j=0;jvexnum;j+) g-arcsij=0; printf(输入边的信息:n); scanf(

4、%d,%d,&i,&j); /*读入边i,j*/ while(i!=-1) /*读入i,j为1时结束*/ g-arcsij=1; g-arcsji=1; scanf(%d,%d,&i,&j); void dfs(int i,graph *g) /*从第i个顶点出发深度优先搜索*/ int j; printf(%c,g-vexsi);visitedi=TRUE; for(j=0;jvexnum;j+) if(g-arcsij=1)&(!visitedj) dfs(j,g);void tdfs(graph *g) /*深度优先搜索整个图*/ int i; printf(n从顶点%C开始深度优先搜索

5、序列:,g-vexs0); for(i=0;ivexnum;i+) if(visitedi!=TRUE) dfs(i,g);void bfs(int k,graph *g) /*从第k个顶点广度优先搜索*/ int i,j; queue qlist,*q; q=&qlist; q-rear=0; q-front=0; printf(%c,g-vexsk); visitedk=TRUE; q-dataq-rear=k;q-rear=(q-rear+1)%N;while(q-rear!=q-front) i=q-dataq-front; q-front=(q-front+1)%N; for(j=0

6、;jvexnum;j+) if(g-arcsij=1)&(!visitedj) printf(%c,g-vexsj); visitedj=TRUE; q-dataq-rear=j;q-rear=(q-rear+1)%N; void tbfs(graph *g) /*广度优先搜索整个图*/ int i; printf(n从顶点%C开始广度优先搜索序列:,g-vexs0);for(i=0;ivexnum;i+)if(visitedi!=TRUE) bfs(i,g);void init_visit()/*初始化访问标识数组*/ int i; for(i=0;iN;i+) visitedi=FALSE

7、;int main() graph ga; int i,j; createGraph(&ga); printf(无向图的邻接矩阵:n);for(i=0;iga.vexnum;i+) for(j=0;jga.vexnum;j+) printf(%3d,ga.arcsij); printf(n); init_visit(); tdfs(&ga); init_visit(); tbfs(&ga); return 0;根据右图的结构验证实验,输入:ABCDEFGH#0,10,20,51,31,42,52,63,74,7-1,-1运行结果:2、阅读并运行下面程序,补充拓扑排序算法。#include#in

8、clude#define N 20typedef struct edgenode /*图的邻接表:邻接链表结点*/ int adjvex; /*顶点序号*/ struct edgenode *next; /*下一个结点的指针*/edgenode;typedef struct vnode /*图的邻接表:邻接表*/ char data; /*顶点信息*/ int ind; /*顶点入度*/ struct edgenode *link; /*指向邻接链表指针*/vnode;void createGraph_list(vnode adjlist,int *p); /*建立有向图的邻接表*/void

9、topSort(vnode g,int n); /*拓扑排序*/void createGraph_list(vnode adjlist,int *p) /*建立有向图的邻接表*/ int i,j,n,e;char v; edgenode *s; i=0;n=0;e=0; printf(输入顶点序列(以#结束):n); while(v=getchar()!=#) adjlisti.data=v; /*读入顶点信息*/ adjlisti.link=NULL; adjlisti.ind=0; i+; n=i; *p=n; /*建立邻接链表*/ printf(n请输入弧的信息(i=-1结束):i,j:

10、n); scanf(%d,%d,&i,&j);while(i!=-1) s=(struct edgenode*)malloc(sizeof(edgenode); s-adjvex=j; s-next=adjlisti.link; adjlisti.link=s; adjlistj.ind+; /*顶点j的入度加1*/ e+; scanf(%d,%d,&i,&j); printf(邻接表:); for(i=0;i%d,s-adjvex); s=s-next; void topSort(vnode g,int n) /*拓扑排序*/int main() vnode adjlistN; int n,

11、*p;p=&n; createGraph_list(adjlist,p); return 0;根据输入,输出有向图的拓扑排序序列。并画出有向图。输入:ABCDEF#0,11,22,34,14,5-1,-1运行结果:3、阅读并运行下面程序。#include#define N 20#define TRUE 1#define INF 32766 /*邻接矩阵中的无穷大元素*/#define INFIN 32767 /*比无穷大元素大的数*/typedef struct /*图的邻接矩阵*/int vexnum,arcnum; char vexsN;int arcsNN;graph;void crea

12、teGraph_w(graph *g,int flag);void prim(graph *g,int u);void dijkstra(graph g,int v);void showprim();void showdij();/*建带权图的邻接矩阵,若flag为1则为无向图,flag为0为有向图*/void createGraph_w(graph *g,int flag) int i,j,w; char v;g-vexnum=0; g-arcnum=0; i=0; printf(输入顶点序列(以#结束):n); while(v=getchar()!=#) g-vexsi=v; /*读入顶点

13、信息*/ i+; g-vexnum=i; for(i=0;i6;i+) /*邻接矩阵初始化*/ for(j=0;jarcsij=INF; printf(输入边的信息:n); scanf(%d,%d,%d,&i,&j,&w); /*读入边(i,j,w)*/ while(i!=-1) /*读入i为1时结束*/ g-arcsij=w; if(flag=1) g-arcsji=w; scanf(%d,%d,%d,&i,&j,&w); void prim(graph *g,int u)/*出发顶点u*/ int lowcostN,closestN,i,j,k,min; for(i=0;ivexnum;i

14、+) /*求其他顶点到出发顶点u的权*/ lowcosti=g-arcsui; closesti=u; lowcostu=0; for(i=1;ivexnum;i+) /*循环求最小生成树中的各条边*/ min=INFIN; for(j=0;jvexnum;j+) /*选择得到一条代价最小的边*/ if(lowcostj!=0&lowcostjvexsclosestk,g-vexsk,lowcostk); /*输出该边*/ lowcostk=0; /*顶点k纳入最小生成树 */ for(j=0;jvexnum;j+) /*求其他顶点到顶点k 的权*/ if(g-arcskj!=0&g-arcs

15、kjarcskj; closestj=k; void printPath(graph g,int startVex,int EndVex) int stackN,top=0; /*堆栈*/ int i,k,j; int flagN; /*输出路径顶点标志*/ k=EndVex; for (i=0;i0) /*找j到k的路径*/ for (i=0;i %c(%d) ,g.vexsi,g.arcsji); /*输出j到k的路径的顶点i*/ flagi=1; j=i; k=stack-top; break; else if (i!=k) stacktop+=i; /*break;*/ void di

16、jkstra(graph g,int v) /*dijkstra算法求单源最短路径*/ int pathNN,distN,sN; int mindis,i,j,u,k; for(i=0;ig.vexnum;i+) disti=g.arcsvi; si=0; for(j=0;jg.vexnum;j+) pathij=0; if(distiINF) pathiv=1; pathii=1; distv=0; sv=1; for(i=0,u=1;ig.vexnum;i+) mindis=INFIN; for(j=0;jg.vexnum;j+) if(sj=0) if(distjmindis) u=j;

17、 mindis=distj; su=1; for(j=0;jg.vexnum;j+) if(sj=0)&distu+g.arcsujdistj)distj=distu+g.arcsuj;for(k=0;k到各顶点的最短路径n,g.vexsv); for(i=0;i顶点%c:,g.vexsv,g.vexsi); if(disti=INF|disti=0) printf(无路径); else printf(%d ,disti); printf(经过顶点:);printPath(g,v,i); /*输出v到i的路径*/ void showprim()/*最小生成树prim算法演示*/ graph g

18、a; createGraph_w(&ga,1); prim(&ga,0);void showdij() /*dijstra算法演示*/ graph ga;createGraph_w(&ga,0); dijkstra(ga,0);int main()showprim(); /*prim算法演示*/getchar();showdij(); /*dijstra算法演示*/ return 0;下面的输入分别验证prim算法和dijstra算法。输入实例的第一部分为无向图,求其最小生成树;输入的第二部分为有向图,求其最短路径。最小生成树最短路径ABCDEF#0,1,60,2,10,3,51,2,51,4

19、,32,3,52,4,62,5,43,5,24,5,6-1,-1,-1ABCDEF#0,2,100,5,1000,4,301,2,52,3,503,4,203,5,104,3,204,5,60-1,-1,-1运行结果:(并画出两个图)最小生成树最短路径四、实验小结图的表示和变厉需要很强的逻辑性五、教师评语数据结构实验报告姓名学号号实验地点数学楼指导教师实验名称队列的表示与实现1、实验目的了解和掌握队列的数据类型描述及其特点;完成链队列的初始化、入队、出队、取对头元素、显示操作的实现;掌握队列的链式存储表示与基本操作算法实现;掌握队列在实际问题中的应用和基本编程技巧。2、实验方法队列的抽象数据类

20、型定义:ADT Queue /数据对象:D=ai|aiElemSet,i=1,2,.,n,n=0 /数据关系:R1=|ai-1,aiD,i=2,.,n /约定其中a1端为队列头,an端为队列尾 /基本操作: InitQueue(&Q)/操作结果:构造一个空队列Q。 DestoryQueue(&Q)/初始条件:队列Q已存在/操作结果:队列Q被销毁,不再存在 ClearQueue(&Q)/初始条件:队列Q已存在/操作结果:将Q清为空队列 QueueEmpty(Q)/初始条件:队列Q已存在 /操作结果:若队列Q为空队列,则返回TRUE,否则FALSE QueueLength(Q)/初始条件:队列Q已

21、存在 /操作结果:返回Q的元素个数,即队列的长度 GetHead(Q,&e)/初始条件:Q为非空队列 /操作结果:用e返回Q的队头元素 EnQueue(&Q,e)/初始条件:队列Q已存在 /操作结果:插入元素e为Q的新的队尾元素 DeQueue(&Q,&e)/初始条件:Q为非空队列 /操作结果:删除Q的队头元素,并用e返回其值 QueueTraverse(Q,visit()/初始条件:Q已存在且非空 /操作结果:从队头到队尾,依次对Q的每个数据元素调用函数visit()。一旦visit()失败,则操作失败。ADT Queue与线性表类似,队列有两种存储表示链队列和循环队列。/-基本操作的函数原

22、型说明-status INitQueue(LinkQueue &Q)/构造一个空队列QStatus DestoryQueue(LinkQueue &Q)/销毁队列Q,Q不再存在Status ClearQueue(LinkQueue &Q)/将Q清为空队列Status QueueEmpty(LinkQueue Q)/若队列Q为空队列,则返回TRUE,否则返回FALSEint QueueLength(LinkQueue Q)/返回Q的元素个数,即为队列的长度Status GetHead(LinkQueue Q,QElemType &e)/若队列不空,则用e返回Q的队头元素,并返回OK;否则返回ER

23、RORStatus ENQueue(LinkQueue &Q,QElemType e)/插入元素e为Q的新的队尾元素Status DeQueue(LinkQueue &Q,QElemType &e)/若队列不空,则删除Q的队头元素,用e返回其值,并返回OK;否则返回ERRORstatus QueueTraverse(linkQueue Q,visit()/从队头到队尾依次对队列Q中的每个元素调用函数visit()。一旦visit失败,则操作失败。链队列:/单链队列队列的链式存储结构typedef struct QNode QElemType data; struct QNode *next;Q

24、Node,*QueuePtr;typedef struct QueuePtr front;/队头指针 QueuePtr rear;/队尾指针LinkQueue;/-单链队列的基本操作的算法描述-status INitQueue(LinkQueue &Q)/构造一个空队列Q Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode); if(!Q.front )exit(OVERFLOW); /存储分配失败 Q.front -next =NULL; return OK;Status DestoryQueue(LinkQueue &Q)/销毁队列Q,Q不再存在 wh

25、ile(Q.front) Q.rear=Q.front -next; free(Q.front ); Q.front =Q.rear ; return OK;Status ClearQueue(LinkQueue &Q)/将Q清为空队列Status QueueEmpty(LinkQueue Q)/若队列Q为空队列,则返回TRUE,否则返回FALSEint QueueLength(LinkQueue Q)/返回Q的元素个数,即为队列的长度Status GetHead(LinkQueue Q,QElemType &e)/若队列不空,则用e返回Q的队头元素,并返回OK;否则返回ERRORStatus ENQueue(LinkQueue &Q,QElemType e)/插入元素e为Q的新的队尾元素 p=(QueuePtr)malloc(sizeof(QNode); if(!p) exit(OVERFLOW); /存储分配失败 p-data=e;p-next=NULL; Q.rear -next =p; Q.rear =p; re

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1