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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

图的基本操作与实现的课程设计报告.docx

1、图的基本操作与实现的课程设计报告中国矿业大学徐海学院计算机系软件认知实践报告姓 名: 学 号: 专 业: 设计题目: 指导教师: 2013年12月30日第1章 题目概述第1.1节 题目要求(1)自选存储结构,输入含n个顶点(用字符表示顶点)和e条边的图G;(2)求每个顶点的度,输出结果;(3)指定任意顶点x为初始顶点,对图G作DFS遍历,输出DFS顶点序列(提示:使用一个栈实现DFS);(4)指定任意顶点x为初始顶点,对图G作BFS遍历,输出BFS顶点序列(提示:使用一个队列实现BFS);(5)输入顶点x,查找图G:若存在含x的顶点,则删除该结点及与之相关连的边,并作DFS遍历(执行操作3);

2、否则输出信 息“无x”;(6)判断图G是否是连通图,输出信息“YES”/“NO”;(7)如果选用的存储结构是邻接矩阵,则用邻接矩阵的信息生成图G的邻接表,即复制图G,然再执行操作(2);反之亦然。第1.2节 主要难点(1)自选存储结构创建一个图:通过用户从键盘敲入的两个数值分别确定图的顶点数和边数,选择邻接矩阵存储结构将图的结点信息存储在一个顺序表中,图的边信息存储在一个二维数组中。(2)求每个顶点的度:1.邻接矩阵存储结构下求每个顶点的度:利用图的邻接矩阵,每个顶点所在行和所在列的边的权值如果存在则该顶点的度+1,依次算出每个顶点的度,并且记录在一个数组中输出。2.邻接表存储结构下求每个顶点

3、的度:定义一个邻接边指针循环指向顶点的邻接边单链表头结点,当结点不空时,该顶点的出度+1,邻接边弧头结点的入度+1,依次求出每个顶点的出度和入度之和就为该顶点的度。(3)图的深度优先遍历:采取邻接矩阵结构,指定任意顶点x为初始顶点1.访问结点v并标记结点v已访问;2.查找结点v的第一个邻接结点w;3.若结点v的邻接结点w存在,则继续执行,否则算法结束;4.若结点w尚未被访问,则递归访问结点w;5.查找结点v的w邻接结点的下一个邻接结点w,转到步骤3。(4)图的广度优先遍历:采取邻接矩阵结构,指定任意顶点x为初始顶点,利用顺序循环队列以保持访问过的结点的顺序1.首先访问初始结点v并标记结点v为已

4、访问;2.结点v入队列;3.当队列非空时则继续执行,否则算法结束;4.出队列取得队头结点u;5.查找u的第一个邻接结点w;6.若u的邻接结点w不存在则转到步骤3,否则循环执行下列步骤:6.1若结点w尚未被访问,则访问结点w并标记结点w为已访问;6.2结点w入队列;6.3查找结点u的w邻接结点的下一个邻接结点w,转到步骤6 。(5)判断有向图的强连通性:采取邻接表结构,在图中寻找一个包含所有顶点且首尾相连的环,若这样的环存在,则该图为强连通图,否则不为强连通图。(6)用邻接矩阵的信息生成邻接表:定义一个邻接表的边信息结构体,将邻接矩阵的边信息转换成邻接表的边信息存储到邻接边的单链表中。第二章 系

5、统流程图第3章 数据结构和算法(1)有向图顶点的数据类型DataType 定义如下: typedef int DataType ;(2)邻接矩阵存储结构下图的结构体定义如下:typedef struct SeqList Vertices; int edgeMaxVerticesMaxVertices; int numOfEdges; AdjMGraph; (3)邻接矩阵存储结构下图的边信息结构体定义如下:typedef struct int row; int col; int weight; RowColWeight; (4)邻接表存储结构下图的结构体定义如下:typedef struct N

6、ode int dest; struct Node *next; Edge; typedef struct DataType data; int sorce; Edge *adj; AdjLHeight; typedef struct AdjLHeight aMaxVertices; int numOfVerts; int numOfEdges; AdjLGraph; (5)邻接表存储结构下图的边信息结构体定义如下:typedef struct int row; int col; RowCol; (6)顺序循环队列的结构体定义如下:typedef struct DataType queueMa

7、xQueueSize; int rear; int front; int count;SeqCQueue;(7)顺序表的结构体定义如下:typedef struct DataType listMaxSize; int size;SeqList;第四章 核心代码分析源程序存放在八个文件夹中,文件SeqList.h是顺序表的结构体定义和操作函数,文件SeqCQueue.h是顺序循环队列的结构体定义和操作函数,文件AdjMGraph.h是邻接矩阵存储结构下图的结构体定义和操作函数,文件AdjMGraphCreate.h是邻接矩阵存储结构下图的创建函数,文件AdjLGraph.h是邻接表存储结构下图的

8、结构体定义和操作函数,文件AdjLGraphCreate.h是邻接表存储结构下图的创建函数,文件AdjMGraphTraverse.h是邻接矩阵存储结构下图的深度优先遍历和广度优先遍历操作函数,文件图的基本操作与实现.c是主函数。(1)/* 文件SeqList.h */typedef struct DataType listMaxSize; int size;SeqList;void ListInitiate(SeqList *L) L-size=0;int ListLength(SeqList L) return L.size;int ListInsert(SeqList *L,int i,

9、DataType x) int j; if(L-size=MaxSize) printf(数组已满无法插入!n); return 0; else if(iL-size) printf(参数不合法!n); return 0; else for(j=L-size;ji;i-)L-listj=L-listj-1; L-listi=x; L-size+; return 1; int ListDelete(SeqList *L,int i,DataType *x) int j; if(L-size=0) printf(顺序表已空无数据元素可删!n); return 0; else if(iL-size-

10、1) printf(参数i不合法!n); return 0; else *x=L-listi; for(j=i+1;jsize-1;j+)L-listj-1=L-listj; L-size-; return 1; int ListGet(SeqList L,int i,DataType *x) if(iL.size-1) printf(参数i不合法!n); return 0; else *x=L.listi; return 1; (2)/* 文件SeqCQueue.h */typedef struct DataType queueMaxQueueSize; int rear; int fron

11、t; int count;SeqCQueue;void QueueInitiate(SeqCQueue *Q) Q-rear=0; Q-front =0; Q-count =0;int QueueNotEmpty(SeqCQueue Q) if(Q.count !=0) return 1; else return 0;int QueueAppend(SeqCQueue *Q,DataType x) if(Q-count0&Q-rear=Q-front) printf(队列已满无法插入!); return 0; else Q-queue Q-rear=x; Q-rear =(Q-rear +1)

12、%MaxQueueSize; Q-count +; return 1; int QueueDelete(SeqCQueue *Q,DataType *d) if(Q-count =0) printf(队列已空无数据出队列!n); return 0; else *d=Q-queueQ-front; Q-front=(Q-front+1)%MaxQueueSize; Q-count -; return 1; int QueueGet(SeqCQueue Q,DataType*d) if(Q.count =0) printf(队列已空无数据出队列!n); return 0; else *d=Q.qu

13、eue Q.front ; return 1; (3)/* 文件AdjMGraph.h*/#includeSeqList.htypedef struct SeqList Vertices; /存放结点的顺序表 int edgeMaxVerticesMaxVertices; /存放边的邻接矩阵 int numOfEdges; /边的条数AdjMGraph; /边的结构体定义void Initiate(AdjMGraph *G,int n) /初始化 int i,j; for(i=0;in;i+) for(j=0;jedgeij=0; else G-edgeij=MaxWeight; G-numO

14、fEdges=0; /边的条数置为0 ListInitiate(&G-Vertices); /顺序表初始化void InsertVertex(AdjMGraph *G,DataType vertex) /在图G中插入结点vertex ListInsert(&G-Vertices,G-Vertices.size,vertex); /顺序表尾插入void InsertEdge(AdjMGraph *G,int v1,int v2,int weight)/在图G中插入边,边的权为weight if(v1G-Vertices.size|v2G-Vertices.size) printf(参数v1或v2

15、越界出错!n); exit(1); G-edgev1v2=weight; G-numOfEdges+;void DeleteEdge(AdjMGraph *G,int v1,int v2) /在图中删除边 if(v1G-Vertices.size|v2G-Vertices.size|v1=v2) printf(参数v1或v2越界出错!n); exit(1); if(G-edgev1v2=MaxWeight|v1=v2) printf(该边不存在!n); exit(0); G-edgev1v2=MaxWeight; G-numOfEdges-;void DeleteVerten(AdjMGrap

16、h *G,int v) /删除结点v int n=ListLength(G-Vertices),i,j; DataType x; for(i=0;in;i+) /计算删除后的边数 for(j=0;jedgeij0&G-edgeijnumOfEdges-; /计算被删除边 for(i=v;in;i+) /删除第v行 for(j=0;jedgeij=G-edgei+1j; for(i=0;in;i+) /删除第v列 for(j=v;jedgeij=G-edgeij+1; ListDelete(&G-Vertices,v,&x); /删除结点vint GetFistVex(AdjMGraph *G,

17、int v) /在图G中寻找序号为v的结点的第一个邻接结点/如果这样的邻接结点存在,返回该邻接结点的序号;否则,返回-1 int col; if(vG-Vertices.size) printf(参数v1越界出错!n); exit(1); for(col=0;colVertices.size;col+) if(G-edgevcol0&G-edgevcolMaxWeight)return col; return -1;int GetNextVex(AdjMGraph*G,int v1,int v2)/在图中寻找v1结点的邻接结点v2的下一个邻接结点/如果这样的结点存在,返回该邻接结点的序号;否则

18、,返回-1/v1和v2都是相应结点的序号 int col; if(v1G-Vertices.size|v2G-Vertices.size) printf(参数v1或v2越界出错!n); exit(1); for(col=v2+1;colVertices.size;col+) if(G-edgev1col0&G-edgev1colMaxWeight)return col; return -1;/输出图G的邻接矩阵void Print(AdjMGraph *G) int i,j; for(i=0;iVertices.size;i+) for(j=0;jVertices.size;j+) print

19、f(%6d ,G-edgeij); printf(n); /邻接矩阵存储结构下求出每个顶点的度并输出void MVertices(AdjMGraph *G,DataType a) int i,j,m; DataType bMaxVertices;/用数组b记录相应结点的度 for(i=0;iVertices.size;i+) bi=0; /置0 printf(邻接矩阵存储结构下图的顶点的度为:n); for(m=0;mVertices.size;m+) /求出每个结点的度 for(i=0;iVertices.size;i+) for(j=0;jVertices.size;j+) if(i=m&

20、G-edgeij0&G-edgeijMaxWeight) /求出邻接矩阵第i行权值存在的边的个数,当边存在时,bm加1 bm+; if(j=m&i!=m&G-edgeij0&G-edgeijMaxWeight) /求出邻接矩阵第j列权值存在的边的个数,当边存在时,bm加1 bm+; printf(顶点%d的度为:%dn,am,bm); /查找图G中是否存在点vint ChaZhao(AdjMGraph *G,int v) if(0=v&vVertices.size) printf(存在顶点%dn,v); return 1; else printf(不存在顶点%dn,v); return 0;

21、/删除查找到的结点v并删除该结点及与之相关的边void MDelete(AdjMGraph *G,int v) int i; for(i=0;iVertices.size;i+) if(G-edgevi0&G-edgeviMaxWeight) /当邻接矩阵的第v行有边存在时,删除边 DeleteEdge(G,v,i); if(G-edgeiv0&G-edgeivMaxWeight) /当邻接矩阵的第j行有边存在时,删除边 DeleteEdge(G,i,v); DeleteVerten(G,v);/删除结点v(4)/* 文件AdjMGraphCreate.h */typedef struct i

22、nt row; /行下标 int col; /列下标 int weight; /权值RowColWeight; /边信息结构体定义void CreatGraph(AdjMGraph *G,DataType v,int n,RowColWeight E,int e)/在图G中插入n个结点信息v和e条边信息E int i,k; Initiate(G,n); /结点顺序表初始化 for(i=0;in;i+) InsertVertex(G,vi); /结点插入 for(k=0;knumOfVerts=0; G-numOfEdges=0; for(i=0;iai.sorce=i; G-ai.adj=NU

23、LL; /撤销操作函数void LAdjDestroy(AdjLGraph *G)/撤销图G中的所有邻接边单链表 int i; Edge *p,*q; for(i=0;inumOfVerts;i+) p=G-ai.adj; while(p!=NULL) q=p-next; free(p); p=q; /插入结点操作函数void LInsertVertex(AdjLGraph *G,int i,DataType vertex)/在图G中的第i(0=i=0&iai.data=vertex; /存储结点数据元素vertex G-numOfVerts+; /个数加1 else printf(结点越界)

24、;/插入边操作函数void LInsertEdge(AdjLGraph *G,int v1,int v2)/在图G中加入边的信息 Edge *p; /定义一个邻接边指针 if(v1=G-numOfVerts|v2=G-numOfVerts) printf(参数v1或v2越界出错); exit(0); p=(Edge *)malloc(sizeof(Edge); /申请邻接边单链表结点空间 p-dest=v2; /置邻接边弧头序号 p-next=G-av1.adj; /新结点插入单链表的表头 G-av1.adj=p; /头指针指向新的单链表表头 G-numOfEdges+; /边数个数加1 /删除边操作函数void LDeleteEdge(AdjLGraph *G,int v1,int v2)/删除图G中的边信息 Edge *curr,*pre; if(v1=G-numOfVerts|v2=G-numOfVerts) printf(参数v1或v2越界出错!

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

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