数据结构课程设计说明书_第1页
数据结构课程设计说明书_第2页
数据结构课程设计说明书_第3页
数据结构课程设计说明书_第4页
数据结构课程设计说明书_第5页
已阅读5页,还剩44页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、* 实践教学实践教学 * 兰州理工大学兰州理工大学 计算机与通信学院 2014 年秋季学期 数据结构与算法数据结构与算法 课程设计课程设计 题 目:求素数问题、计算 1 的个数问题、 递归替换问题、图的基本操作与实现 专业班级: 软件工程 13 级 1 班 姓 名: 学 号: 指导教师: 成 绩: 目目 录录 摘摘 要要.3 一求素数问题一求素数问题.4 1.问题描述.4 2.算法设计.4 3.源程序.4 4.运行结果.7 5.总结.8 二计算二计算 1 的个数问题的个数问题.9 1.问题描述.9 2.算法设计.9 3.源程序.9 4.运行结果.11 5.总结.11 三三.递归替换的问题递归替

2、换的问题.11 1.问题描述.11 2.算法设计.11 3.源程序.12 4.运行结果.15 5.总结.15 四四.图的基本操作与实现图的基本操作与实现.16 1.问题描述.16 2.算法设计.16 3.源程序.17 4.运行结果.45 5.总结.46 参考文献参考文献.48 致致 谢谢.49 摘摘 要要 本设计主要是用 C 语言设计开发,所用 IDE 工具为 codeblocks,四个问题 均应用了不同的数据结构,有图的存储,有递归的操作等等,再设计过程中也 应用了不同的算法如埃拉托色尼筛法,图的深度优先搜索和广度优先搜索。 第一个程序是用埃拉托色尼筛法求解素数问题。用一个循环结构判断是否

3、为素数,如果是素数则返回 1,负责返回 0。 第二个程序是递归结构计算 1 的个数问题,共分为两种情况,奇数情况和 偶数情况。 第三个程序为递归替换仿编译问题,具体要求是递归替换问题。编写程序, 扩展 C/C+源文件中的#include 指令(以递归的方式) 。以文件名的内容替换形 预编译命令“include” 。具体是用相应文件的内容来替换上面的代码“预编译” 的命令,即在最后的结果查看文件中没有“# include”字样,其位置为相应文 件的内容,考虑到有可能在我们要替换的文件中也可能会有预编译命令,所以 要用递归的算法。通过这个代码的编写可以帮我们更深层次的理解 c 语言编译 的过程,同

4、时也能够练习递归的运用。 第四个程序为图的一些基本操作,内容包括图的存储结构、图的深度优先 遍历,广度优先遍历,图节点的度数等等。 关键词:关键词: 埃拉托色尼筛法埃拉托色尼筛法 素数问题素数问题 递归递归 替换替换 连通图连通图 克鲁斯卡尔算法克鲁斯卡尔算法 数据结构数据结构 图的遍历图的遍历 一一求素数问题求素数问题 1.问题描述问题描述 埃拉托色尼筛法(Sieve of Eratosthenes)是一种用来求所有小于 N 的素 数的方法。从建立一个整数 2N 的表着手,寻找 i的整数,编程实现此算法, 并讨论运算时间。(1) 2.算法设计算法设计 用一个循环结构判断是否为素数,如果是素数

5、则返回 1,负责返回 0。 int sushu(DataType if(i=1) return 0; for(m=2;mi;m+) if(i%m=0) return 0; return 1; 3.源程序源程序 #include #include #define maxsize 200 #define FALSE 0 typedef int DataType; typedef struct DataType datamaxsize; int length; Seqlist;/结点结构 int sushu(DataType i)/判断是否为素数 int m; if(i=1) return 0; f

6、or(m=2;mi;m+) if(i%m=0) return 0; return 1; int main() Seqlist L; L.length=maxsize; int m; int j; for(j=2;jL.length ) return FALSE; printf(1 至 m 之间的素数从小到大分别为:n); int i,k=0; for(i=1;i=m ;i+) L.datai-1=i; for(i=1;i=m;i+) if(sushu(L.datai-1) k+; printf(%dt,L.datai-1); /符号“t”的作用是横向制表。 printf(n 总共%d 个。n,

7、k ); return 0; 4.运行结果运行结果 图图 1 .图 2 为 1m 之间的素数 图 2 3 图 3 为 m 大于 L.length 时的图 图 3 5.总结总结 1 当 m 的值大于 maxsize 的值是发生越界问题,在输入 m 时要确保 m 的值 要小于 maxsize 的值 2、算法的时间复杂度 O(L.length-1)+O(m)。 二计算二计算 1 的个数问题的个数问题 1.问题描述问题描述 编写递归程序,返回十进制数 N 的二进制表示中 1 的个数。 2.算法设计算法设计 采用递归结构 采用以下已知情况设计程序 若 N 是奇数,那么它的二进制中 1 的个数等于 N/2

8、 的二进制中 1 的个数加 1,N-1 是偶数,比 N 少一个最低位的 1,1 的个数就是 N/2 的二进制中 1 的个 数-1。 3.源程序源程序 #include int count(int N) int n; if(N=1) n=1; else if(N+1)%2=0) n=count(N/2)+1;/奇数情况若 N 是奇数,那么它的二进 制中 1 的个数等于 N/2 的二进制中 1 的个数加 1, else if(N%2=0) n=count(N+1)-1;/偶数情况若 N 是奇数,N-1 是偶数,比 N 少一个最低位的 1,1 的个数就是 N/2 的二进制中 1 的个数-1 retu

9、rn n; void main() int N; printf(请输入数字:); scanf(%d, printf(二进制中 1 的个数:%dn,count(N); 4.运行结果运行结果 5.总结总结 通过本程序的设计了解了如何采用递归结构进行解决问题。 三三.递归替换的问题递归替换的问题 1.问题描述问题描述 编写程序,扩展 C/C+源文件中的#include 指令(以递归的方式) 。请以文 件名的内容替换形如下面的代码行。 #include “filename” 2.算法设计算法设计 模拟 C/C+预处理程序的功能,打开源文件后,先检查每一行的第一个字 符是否是”#“,如果不是,则原样输出

10、这一行;如果是,则处理预处理指令,先 把”#“后紧跟的预处理指令解析出来,如果是 include,则提取后面的文件名,打 开文件,再递归调用这个预处理函数就行了 3.源程序源程序 # include # include # include #define MAX 100 typedef struct /创建结构体,让文件的读写方便 char dataMAX; /数据项 char1; int print(char chMAX,int n) /递归函数 FILE *fp,*fp1; char sMAX; /s,存储#后面 的 include char1 bMAX; /b,文件中内容 在内存中的存储

11、位置 int i=0,k,d=0,j,flag; /switch 参数, 用于确认调用函数的参数 if(fp=fopen(ch,rb+)=NULL) printf(文件打开失败!n); exit(0); while(!feof(fp) fread( i+; if(bi-1.data0=) /结构体数组计数器 break; k=i-1; /记录 b 大 小,可以认为是对应文件的行数 fclose(fp); if(fp1=fopen(辅助.c,ab+)=NULL) printf(文件打开失败!n); exit(0); d=0; /s 数组存取计 数器 for(i=0;ik;i+) if(bi.da

12、ta0=#) /发现 include,递归调用 print for(j=2;jsize=0; int ListLength(SeqList L) return L.size; int ListInsert(SeqList *L,int i,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+; retur

13、n 1; int ListDelete(SeqList *L,int i,DataType *x) int j; if(L-size=0) printf(顺序表已空无数据元素可删!n); return 0; else if(iL-size-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 不合法!

14、n); return 0; else *x=L.listi; return 1; (2)/* 文件 SeqCQueue.h */ typedef struct DataType queueMaxQueueSize; int rear; int front; 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 QueueA

15、ppend(SeqCQueue *Q,DataType x) if(Q-count0 return 0; else Q-queue Q-rear=x; Q-rear =(Q-rear +1)%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; i

16、nt QueueGet(SeqCQueue Q,DataType*d) if(Q.count =0) printf(队列已空无数据出队列!n); return 0; else *d=Q.queue Q.front ; return 1; (3)/* 文件 AdjMGraph.h*/ #includeSeqList.h typedef struct SeqList Vertices; /存放结点的顺序表 int edgeMaxVerticesMaxVertices; /存放边的邻接矩阵 int numOfEdges; /边的条数 AdjMGraph; /边的结构体定义 void Initiate

17、(AdjMGraph *G,int n) /初始化 int i,j; for(i=0;in;i+) for(j=0;jedgeij=0; else G-edgeij=MaxWeight; G-numOfEdges=0; /边的条数置为 0 ListInitiate( /顺序表初始化 void InsertVertex(AdjMGraph *G,DataType vertex) /在图 G 中插入结点 vertex ListInsert( /顺序表尾插入 void InsertEdge(AdjMGraph *G,int v1,int v2,int weight) /在图 G 中插入边,边的权为

18、weight if(v1G-Vertices.size|v2G-Vertices.size) printf(参数 v1 或 v2 越界出错!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); e

19、xit(0); G-edgev1v2=MaxWeight; G-numOfEdges-; void DeleteVerten(AdjMGraph *G,int v) /删除结点 v int n=ListLength(G-Vertices),i,j; DataType x; for(i=0;in;i+) /计算删除后的边数 for(j=0;jedgeij0 /计算被删除边 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; ListDelet

20、e( /删除结点 v int GetFistVex(AdjMGraph *G,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 return -1; int GetNextVex(AdjMGraph*G,int v1,int v2) /在图中寻找 v1 结点的邻接结点 v2 的下一个邻接结点 /如果

21、这样的结点存在,返回该邻接结点的序号;否则,返回-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 return -1; /输出图 G 的邻接矩阵 void Print(AdjMGraph *G) int i,j; for(i=0;iVertices.size;i+) for(j=0;jVertices.size;j+) print

22、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

23、=m if(j=m printf(顶点%d 的度为:%dn,am,bm); /查找图 G 中是否存在点 v int ChaZhao(AdjMGraph *G,int v) if(0=v return 1; else printf(不存在顶点%dn,v); return 0; /删除查找到的结点 v 并删除该结点及与之相关的边 void MDelete(AdjMGraph *G,int v) int i; for(i=0;iVertices.size;i+) if(G-edgevi0 if(G-edgeiv0 DeleteVerten(G,v);/删除结点 v (4)/* 文件 AdjMGrap

24、hCreate.h */ typedef struct int 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-numOf

25、Edges=0; for(i=0;iai.sorce=i; G-ai.adj=NULL; /撤销操作函数 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 /存储结点数据元素 vertex G-nu

26、mOfVerts+; /个数加 1 else printf(结点越界); /插入边操作函数 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.ad

27、j=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 越界出错!); exit(0); pre=NULL; curr=G-av1.adj; while(curr!=NULL curr=curr-next; /删除表示邻接边的结点 if(curr!=NULL free(curr); G-num

28、OfEdges-; else if(curr!=NULL free(curr); G-numOfEdges-; else /当邻接边结点不存在时 printf(边不存在时); /取第一个邻接结点 int LGetFirstVex(AdjLGraph *G,int v) /取图 G 中结点 v 的第一个邻接结点 /取到时返回该邻接结点的对应序号,否则返回-1 Edge *p; if(vG-numOfVerts) printf(参数 v1 或 v2 越界出错!); exit(0); p=G-av.adj; if(p!=NULL) return p-dest; /返回该邻接结点的对应序号 else

29、return -1; /返回-1 /取下一个邻接结点 int LGetNextVex(AdjLGraph *G,int v1,int v2) /取图 G 中结点 v1 的邻接结点 v2 的下一个邻接结点 /取到时返回该邻接结点的对应序号,否则返回-1 Edge *p; if(v1G-numOfVerts|v2G-numOfVerts) printf(参数 v1 或 v2 越界出错!); exit(0); p=G-av1.adj; while(p!=NULL) /寻找结点 v1 的邻接结点 v2 if(p-dest!=v2) p=p-next; continue; else break; p=p

30、-next; /p 指向邻接结点 v2 的下一个邻接结点 if(p!=NULL) return p-dest; /返回该邻接结点的对应序号 else return -1; /返回-1 /邻接表存储下求每个顶点的度并输出结果 void LVertices(AdjLGraph *G,DataType a) printf(邻接表存储结构下的图的顶点的度为:n); int OutDegreeMaxVertices,InDegreeMaxVertices;/定义一个出度和入 度的数组 int i; for(i=0;inumOfVerts;i+) /首先将出度和入度数组的每个成员都 置 0 OutDegr

31、eei=0; InDegreei=0; Edge *p; /定义一个邻接边指针 for(i=0;inumOfVerts;i+) p=G-ai.adj; /指针指向 ai的邻接边单链表头结点 while(p!=NULL)/当 p 所指向的邻接边结点不空时 OutDegreei+; /出度加 1 InDegreep-dest+; /邻接边弧头结点的入度加 1 p=p-next; /p 指向下一个邻接边结点 for(i=0;inumOfVerts;i+) /输出每个结点的度 printf(顶点%d 的度为:,ai); printf(%d,OutDegreei+InDegreei); /每个结点的度即

32、出度与入度 相加的和 printf(n); /判断有向图 G 是否为强连通图 int LianTong(AdjLGraph *G,DataType a) int i,bMaxVertices,k=0; for(i=0;inumOfVerts;i+) bi=0; Edge *q,*p; /定义一个邻接边指针 for(i=0;inumOfVerts;i+) q=G-ai.adj; while(q!=NULL) bi+; q=q-next; for(i=0;inumOfVerts;i+) if(bi=1) k+; p=G-aG-numOfVerts-1.adj; if(k=G-numOfVerts

33、else return 0; (6)/* 文件 AdjLGraphCreate.h */ typedef struct int row; /行下标 int col; /列下标 RowCol; /边信息结构体定义 void CreatLGraph(AdjLGraph *G,DataType v,int n,RowCol d,int e) int i,k; LAdjInitiate(G); for(i=0;in;i+) LInsertVertex(G,i,vi); for(k=0;ke;k+) LInsertEdge(G,dk.row,dk.col); (7)/* 文件 AdjMGraphTrav

34、erse.h */ void Visit(DataType item) printf(%d ,item); void DepthFSearch(AdjMGraph G,int v,int visited,void Visit(DataType item) /连通图 G 以 v 为初始结点的访问操作为 Visit()的深度优先遍历 /数组 visited 标记了相应结点是否已访问过,0 表示未访问,1 表示已访问 int w; Visit(G.Vertices.listv); /访问结点 v visitedv=1; /置已访问标记 w=GetFistVex( /取第一个邻接结点 while(w!

35、=-1) if(!visitedw)/非 0 还未访问 DepthFSearch(G,w,visited,Visit); w=GetNextVex( void DepthFirstSearch(AdjMGraph G,void Visit(DataType item) /非连通图 G 的访问操作为 Visit()的深度优先遍历 int i; int *visited=(int *)malloc(sizeof(int)*G.Vertices.size); for(i=0;iG.Vertices.size;i+) visitedi=0; for(i=0;iG.Vertices.size;i+) i

36、f(!visitedi) DepthFSearch(G,i,visited,Visit); free(visited); #includeSeqCQueue.h /包括顺序循环队列 void BroadFSearch(AdjMGraph G,int v,int visited,void Visit(DataType item) /连通图 G 以 v 为初始结点的访问操作为 Visit()的广度优先遍历 /数组 visited 标记了相应结点是否已访问过,0 表示未访问,1 表示已访问 DataType u,w; SeqCQueue queue; Visit(G.Vertices.listv);

37、 /访问结点 v visitedv=1; /置已访问标记 QueueInitiate( /队列初始化 QueueAppend( /初始结点 v 入队列 while(QueueNotEmpty(queue) /队列非空时 QueueDelete( /出队列 w=GetFistVex( /取结点 u 的第一个邻接结点 while(w!=-1) /邻接结点 w 存在时 if(!visitedw) /若没有访问过 Visit(G.Vertices.listw); /访问结点 w visitedw=1; /置已访问标记 QueueAppend( /结点 w 入队列 w=GetNextVex( /取下一个

38、邻接结点 void BroadFirstSearch(AdjMGraph G,void Visit(DataType item) /非连通图 G 访问操作为 Visit()的广度优先遍历 int i; int *visited=(int *)malloc(sizeof(int)*G.Vertices.size); for(i=0;iG.Vertices.size;i+) visitedi=0; for(i=0;iG.Vertices.size;i+) if(!visitedi) BroadFSearch(G,i,visited,Visit); free(visited); (8)/* 文件图的

39、基本操作与实现.c */ #include #include #include typedef int DataType;/定义 DataType 为整形 #define MaxSize 100 #define MaxVertices 10 #define MaxEdges 100 #define MaxWeight 10000 /定义无穷大的具体值 #define MaxQueueSize 100 #include AdjMGraph.h #includeAdjMGraphCreate.h #includeAdjMGraphTraverse.h #includeAdjLGraph.h #in

40、cludeAdjLGraphCreate.h void main() AdjMGraph g1; /定义一个邻接矩阵存储结构的图 g1 RowColWeight rcwMaxEdges;/定义边信息数组 int n,e,i,j; printf(请输入有向图的顶点数:); scanf(%d, printf(请输入有向图的边数:); scanf(%d, DataType aMaxVertices;/定义一个数组存储顶点字符为整形 printf(该图的%d 个顶点字符分别为:,n); /输出每个顶点字符 for(i=0;in;i+) ai=i; printf(%2d,ai); printf(n);

41、/存储边的信息 for(i=0;ie;i+) printf(请输入一条边依附的顶点字符 v1,v2 及权值(v1,v2,w):); scanf(%d,%d,%d, CreatGraph(/创建一个邻接矩阵存储结构的图 g1 printf(该图的邻接矩阵为:n); Print(/输出图 g1 的邻接矩阵 /求出邻接矩阵存储结构下图 g1 的每个顶点的度 MVertices( AdjLGraph g2;/定义一个邻接表存储结构的图 g2 RowCol rwcMaxEdges;/定义边信息数组 /用邻接矩阵的信息生成邻接表 for(i=0;ie;i+) rwci.col=rcwi.col; rwci

42、.row=rcwi.row; CreatLGraph( /求出邻接表存储结构下图 g2 每个顶点的度 LVertices( /判断图 g1 的连通性 printf(图 g1 是否为强连通图:); if(LianTong( printf(深度优先遍历序列为:);/对图 g1 作 DFS 遍历,输出 DFS 顶点 序列 DepthFirstSearch(g1,Visit); printf(n); printf(广度优先遍历序列为:);/对图 g1 作 BFS 遍历,输出 BFS 顶点 序列 BroadFirstSearch(g1,Visit); else printf(NOn); printf(深

43、度优先遍历序列为:); DepthFirstSearch(g1,Visit); printf(n); printf(广度优先遍历序列为:); BroadFirstSearch(g1,Visit); printf(n); /输入顶点 x,查找图 g1:若存在含 x 的顶点,则删除该结点及与之相关连 的边, /并作 DFS 遍历否则输出信息无 x; int x; printf(请输入要查找的顶点:); scanf(%d, if(ChaZhao( printf(删除顶点%d 后的图的邻接矩阵为:n,x); Print( printf(删除顶点%d 后的深度优先遍历序列为:,x); DepthFirs

44、tSearch(g1,Visit); else printf(不存在顶点%dn,x); 4.运行结果运行结果 请输入有向图的顶点数:3 请输入有向图的边数:3 该图的 3 个顶点字符分别为:0 1 2 请输入一条边依附的顶点字符 v1,v2 及权值:0,1,1 请输入一条边依附的顶点字符 v1,v2 及权值:1,2,1 请输入一条边依附的顶点字符 v1,v2 及权值:2,0,1 该图的邻接矩阵为: 0 1 10000 10000 0 1 1 10000 0 邻接矩阵存储结构下图的顶点的度为: 顶点 0 的度为:2 顶点 1 的度为:2 顶点 2 的度为:2 邻接表存储结构下图的顶点的度为: 顶

45、点 0 的度为:2 顶点 1 的度为:2 顶点 2 的度为:2 图 g1 是否为连通图:YES 深度优先遍历序列为:0 1 2 广度优先遍历序列为:0 1 2 请输入要查找的顶点:0 1 2 存在顶点 0 删除顶点 0 后图的邻接矩阵为: 1 10000 0 删除顶点 0 后的深度优先遍历序列为:1 2 测试分析:用户输入的是含 3 个顶点,3 条边的有向图,在邻接矩阵存 储结构下和在邻接表存储结构下该有向图的各顶点的度都为 2,并且该图的在 结构上首尾相连,是强连通图,该图的深度优先遍历和广度优先遍历的序列都 为 0,1,2,用户要查找的顶点为 0,运行确认存在顶点 0 后删除了顶点 0,其

46、深 度优先遍历变为 1,2 。 5.总结总结 mian():主函数模块。在主函数模块中调用以下函数: void CreatGraph(AdjMGraph *G,DataType v,int n,RowColWeight E,int e):创建一个邻接矩阵存储结构的图; void Print(AdjMGraph *G):输出图的邻接矩阵; void MVertices(AdjMGraph *G,DataType a):求出邻接矩阵存储结构下 图的每个顶点的度; void CreatLGraph(AdjLGraph *G,DataType v,int n,RowCol d,int e): 用邻接矩阵的信息生成邻接表; void LVertices(AdjLGraph *G,DataType a):求出邻

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论