计算机工程系课程设计报告

合集下载

幻方 C++课程设计报告

幻方 C++课程设计报告

淮阴工学院C++程序设计课程设计报告选题名称:幻方系(院):计算机工程系专业:通信工程班级:通信XXXXX姓名:XXX 学号:XXXXXXXXXXXXX 指导教师:戴峻峰赵建洋学年学期:200X ~ 200X 学年第X学期200X 年XX 月XXX 日设计任务书指导教师(签章):年月日摘要:幻方是一个非常神秘的课题,它有着悠久的历史文明。

我们这些炎黄子孙对它有着很深入的了解和研究。

幻方就是一个方阵,它有着自己的规则和定义。

就象你玩游戏一样,你要遵从游戏规则才能去完成它。

幻方可分为奇阶幻方和偶阶幻方,同时偶阶幻方又可以分为双偶阶和单偶阶。

奇阶幻方比偶阶幻方简单一些。

幻方要运用到数组的知识,首先我要把数组的赋值,输出等。

首先我要回顾一下这些知识,进而全面的讨论了幻方操作的基本理论。

幻方还运用到循环体结构等知识。

我要先把这些看明白,才可以完成这个程序设计。

在这过程中我要多思考多总结,善于去研究去探索,这样才能把这个课题完成好。

幻方的规则就是它每一行和每一列的和及两条对角线的和要相等,每列,每行,每条对角线的和称之为幻和。

这样你排出来的才叫幻方,否则没有条理,那样就没有意义了。

幻方中所排的数就是从1开始到N的平方结束。

所谓双偶阶就是指N能被4整除,单偶阶就是指能被2整除但不能被4整除。

给出主要的流程图,最后编写软件代码。

关键词:连续摆数法;阶梯法;对称法;斯特雷奇法;LUX方法;奇阶幻方;双偶阶幻方;单偶阶幻方目录1课题综述 (1)1.1课题来源 (1)1.2课题意义 (1)2需求分析 (1)2.1涉及的知识基础 (1)2.2总体方案 (3)3课题内容 (3)3.1奇数阶幻方的制作 (3)3.2偶数阶幻方的制作 (5)3.3流程图 (11)4代码和解析 (11)5程序的运行与测试 (21)总结 (24)致谢 (26)参考文献 (27)1 课题综述1.1课题来源幻方又称为魔方,方阵或厅平方,它最早起源于我国。

软件工程课程设计五子棋游戏

软件工程课程设计五子棋游戏

计算机工程系课程设计报告课程名称:软件工程课程设计题目:五子棋游戏班级 2013级计科(4)班姓名许婷娜学号 ***********2015年12月27日目录1. 引言 (1)1.1系统的开发背景(可行性分析) (1)1.2 系统简介 (2)1.2.1系统介绍 (2)1.2.2开发本系统所做的工作 (2)2. 需求分析 (3)2.1 需求的描述与分析 (3)2.2 需求定义 (3)2.2.1 功能需求 (3)2.2.2 性能需求 (4)3. 系统设计 (4)3.1总体设计 (4)3.1.1设计思想 (4)3.1.2五子棋游戏的功能的结构图 (5)3.2程序设计分析 (5)4. 五子棋游戏的详细设计 (6)4.1五子棋游戏的主窗口界面 (6)4.2五子棋游戏的核心模块的详细设计 (10)4.2.1五子棋游戏程序核心代码 (10)4.2.2五子棋游戏程序主面板与鼠标事件 (13)4.2.3五子棋游戏程序流程图 (17)4.3五子棋游戏的游戏功能模块的详细设计 (18)4.3.1五子棋游戏的开局功能模块 (18)4.3.2五子棋游戏的棋盘功能模块 (18)4.3.3五子棋游戏的模式功能模块 (19)4.3.4五子棋游戏的退出功能模块 (19)4.4五子棋游戏的外观功能模块的详细设计 (19)4.5五子棋游戏的版本功能模块的详细设计 (20)5. 五子棋游戏的测试 (20)5.1系统测试的类型 (20)5.2测试举例 (21)5.2.1测试用户的对弈结果 (21)5.2.2测试用户切换棋盘类型功能 (22)5.2.3测试用户切换模式类型功能 (23)5.2.4测试用户切换外观类型功能 (24)5.2.5测试版本功能 (26)小结 (27)致谢 (28)参考文献 (29)1. 引言1.1系统的开发背景(可行性分析)人工智能是一门正在迅速发展的、新兴的、综合性很强的交叉科学。

它与生物工程、空间技术一起被并列为二十一世纪三大尖端技术。

计算机网络课程设计实验报告

计算机网络课程设计实验报告

计算机网络课程设计报告姓名:学号:班级:指导老师:湖南科技大学计算机科学与工程学院2013年6月实验一1。

实验名称:网络聊天程序的设计与实现2。

实验目的:通过本实验能够了解socket通信的原理并在此基础上编写一个聊天程序了解TCP/IP的基础知识,发现TCP与UDP的优缺点以及在网络通信的应用.3.实验原理:从通信和信息处理的角度看,运输层向它上面的应用层提供通信服务,它属于面向通信部分的最高层,同时也是用户功能中的最低层。

当网络的边缘部分中的两个主机使用网络的两个主机使用网络的核心部分进行端到端的通信时,只有主机的协议栈才有运输层,而网络核心部分中的路由器在转发分组时都只用到下三层的功能。

从IP层来说,通信的两端是两个主机,IP数据报的首部明确的标志了这两个主机的IP地址.但是严格的讲,两个主机进行通信就是两个主机中的应用进程互相通信。

根据应用程序的不同需求,运输层需要有两种不同的运输协议,即是面向连接的TCP和无连接的UDP。

在使用这两个协议时运输层向高层用户屏蔽了下面的网络核心的细节,它使应用进程看见的就是好像在两个运输层实体间有一条端到端的逻辑通信信道,但这条逻辑通信信道对上层的表现却因运输层使用的不同协议而有很大的差别.当运输层采用面向连接的TCP协议时,尽管下面的网络是不可靠的,但这种逻辑通信信道就相当于一条全双工的可靠信道。

但当运输层采用无连接的UDP协议时,这种逻辑通信信道仍然是一条不可靠信道.由于我在课程设计中采用的是UDP协议进行通信的,这里就只简述一下一些关于UDP的内容,UDP在传送数据之前不需要先建立连接。

远地主机的运输层在收到UDP报文后,不需要给出任何确认。

虽然UDP不提供可靠的交付,但在某些情况下UDP却是一种最有效的工作方式.为此当我们使用UTP协议使两个计算机中的进程要互相通信,不仅必需知道对方的IP地址(为了找到对方的计算机),而且还要知道对方的端口号(为了找到对方计算机中的应用进程)。

计算机专业课程设计

计算机专业课程设计

计算机专业课程设计一、课程目标知识目标:1. 理解计算机专业课程设计的基本概念、原则和方法;2. 掌握运用所学的编程语言、数据结构与算法,解决实际问题;3. 了解计算机系统的基本组成、工作原理及其在各领域的应用。

技能目标:1. 能够运用分析、设计的方法,独立完成小型计算机项目的需求分析和设计;2. 培养阅读和理解计算机相关技术文档的能力,提高自学能力;3. 学会使用专业软件工具进行项目开发和调试,提高实际操作能力。

情感态度价值观目标:1. 培养学生的团队合作意识,学会与他人共同解决问题;2. 激发学生对计算机专业的兴趣,提高学习的积极性和主动性;3. 树立正确的价值观,认识到计算机技术在国家和社会发展中的重要作用,增强社会责任感。

课程性质:本课程为计算机专业核心课程,旨在培养学生的编程能力、项目设计和实践能力。

学生特点:学生已具备一定的编程基础,具有较强的逻辑思维能力和学习兴趣。

教学要求:注重理论与实践相结合,强调学生动手实践,培养学生的创新能力和实际操作能力。

将课程目标分解为具体的学习成果,以便于后续的教学设计和评估。

二、教学内容1. 计算机专业课程设计概述- 课程设计的基本概念- 课程设计的原则- 课程设计的方法2. 编程语言与数据结构- 常用编程语言的特点与应用场景- 数据结构的基本概念与分类- 常用数据结构及其算法实现3. 计算机系统组成与应用- 计算机硬件系统- 计算机软件系统- 计算机在各领域的应用案例4. 项目需求分析与设计- 需求分析的方法与步骤- 设计模式与架构- 项目文档编写规范5. 项目开发与调试- 编程规范与技巧- 软件测试方法与策略- 调试工具与技巧6. 团队合作与沟通- 团队合作的重要性- 沟通技巧与方法- 项目管理与协作工具教学内容安排与进度:1. 第1-2周:计算机专业课程设计概述2. 第3-4周:编程语言与数据结构3. 第5-6周:计算机系统组成与应用4. 第7-8周:项目需求分析与设计5. 第9-10周:项目开发与调试6. 第11-12周:团队合作与沟通教材章节关联:1. 《计算机组成原理》第1-3章,介绍计算机硬件系统;2. 《数据结构与算法》第1-5章,介绍数据结构及其算法实现;3. 《软件工程》第1-2章,介绍需求分析、设计与文档编写;4. 《编程实践》第1-2章,介绍编程规范与技巧;5. 《项目管理与团队协作》第1-2章,介绍团队合作与沟通。

C#-实训报告

C#-实训报告

苏州市职业大学课程设计任务书课程名称:计算机语言C#课程设计起讫时间:2011-6-20~~2011-7-1院系:计算机工程系班级:10网站开发(ATA)班指导教师:张苏叶良系主任:李金祥一、课程设计课题本实训要求学生运用C#.NET独立设计、编程开发一个完整的Windows应用程序,并完成实训报告。

可以从以下题目中选择:①绘图板②二十一点游戏③科学计算器④弹珠游戏⑤日记本⑥屏幕保护程序⑦挖地雷游戏⑧调色板⑨文本编辑器⑩井字棋也可自选课题(须征得指导教师同意)不建议选择贪吃蛇、华容道等难度比较高的题目,需要由本人完成大部分代码,不建议根据网上或书上的现成代码调试编写。

二、课程设计要求1、设计选题:学生可以在“《Windows应用程序设计》实训选题”指定的题目中选取实训题目,具体题目以此文件为准。

也可以自选,但自选的题目必须在实训开始前得到指导教师的认可。

2、设计结果:学生需按所选题目的具体要求使用C#完成程序设计,同时还要完成课程设计说明书,以介绍实训的情况,说明书中应该至少包括以下几部分:●题目说明●总体设计:概述程序的基本结构和主要技术。

●详细说明:选择几个功能模块详细说明设计时的想法和所用的技术。

●遇到的问题和解决方法●心得体会3、考核要求学生需提交完整的C#源程序(电子版)和课程设计说明书(打印稿),要求程序运行稳定可靠,能实现题目中所要求的功能。

课程设计说明书符合要求,并能对程序的设计思路或具体代码做出正确的解释。

三、课程设计工作量1、程序中应有不少于100~300行的自行编写的代码。

2、软件界面美观大方,操作简洁易用,功能完备可靠。

3、说明书中摘用关键代码部分,应标注详细的代码说明。

4、实训报告以A4纸打印,其中正文不少于6页,正文主要用于解释实现思路和关键代码,完整代码作附件。

四、课程设计说明书内容(有指导书的可省略)课程设计说明书中至少应该包括以下几部分:1、封面2、摘要3、目录4、选题说明5、总体设计:概述程序的基本结构和主要技术。

数据结构课程设计报告_最短路径

数据结构课程设计报告_最短路径

青岛理工大学琴岛学院
设计报告
课题名称:数据结构课程设计
学院:计算机工程系
专业班级:计算机网络技术
学号:aaaaaa
学生: aaa
指导教师: aaaaaaa
青岛理工大学琴岛学院教务处
2011 年 12 月 18日
四.调试分析(调试过程中出现的问题及处理方式)调试出现的界面
1)进入程序弹出查询信息对话框如图2:
图2
2) 输入查询信息,显示路径长度及最短路径,如果输入代号不在0~24之内,提示出错。

图3
图4
B.出现的问题及解决方式
1、在执行程序的时候不能显示最短的距离
解决方法:增加一个函数调用,调用的函数为ShortestPath(v0); /*计算两个城市之间的最短路径*/
2、不能连续查询,即查询一次完成后,必须重新运行才能就进行二次查询
解决方法:在代码中添加while( ) 语句printf("是否继续,1(继续查询),0(退出查询)");
printf("\n"); scanf("%d",&ch); 详见图5
图 5。

课程设计报告 课程设计报告书(优秀7篇)

课程设计报告 课程设计报告书(优秀7篇)

课程设计报告课程设计报告书(优秀7篇)(经典版)编制人:__________________审核人:__________________审批人:__________________编制单位:__________________编制时间:____年____月____日序言下载提示:该文档是本店铺精心编制而成的,希望大家下载后,能够帮助大家解决实际问题。

文档下载后可定制修改,请根据实际需要进行调整和使用,谢谢!并且,本店铺为大家提供各种类型的经典范文,如合同协议、条据文书、策划方案、总结报告、党团资料、读书笔记、读后感、作文大全、教案资料、其他范文等等,想了解不同范文格式和写法,敬请关注!Download tips: This document is carefully compiled by this editor. I hope that after you download it, it can help you solve practical problems. The document can be customized and modified after downloading, please adjust and use it according to actual needs, thank you!Moreover, our store provides various types of classic sample essays, such as contract agreements, documentary evidence, planning plans, summary reports, party and youth organization materials, reading notes, post reading reflections, essay encyclopedias, lesson plan materials, other sample essays, etc. If you want to learn about different formats and writing methods of sample essays, please stay tuned!课程设计报告课程设计报告书(优秀7篇)在不断进步的时代,需要使用报告的情况越来越多,报告中提到的所有信息应该是准确无误的。

计算机组成原理设计课题报告 (1)

计算机组成原理设计课题报告 (1)

SHANGHAI UNIVERSITY<计算机组成原理>课程设计实验报告学院计算机工程与科学学院组员于影、吴珺文、王杰强、金春学号********姓名金春指导老师诸而明一、设计题目和要求1.设计题目:设计一个储存器,并且在Maxplus上模拟实现2.要求:每个组采用指定的内存芯片(二种)和译码器(一种)来实现二、设计过程1.芯片选择:128*8位的ROM、128*8位的RAM各一片。

因为81287(位),所以需要7位地址线:A0~A6,8位数据线D0~D7。

*2*8地址分配如下表所示:地址分配A7 A6 A5 A4 A3 A2 A1 A0 地址空间0 0000000 00H………………0 1111111 7FH1 0000000 80H………………1 1111111 FFH【注】1)A7=0时,表示选择ROM;2)A7=1时,表示选择RAM。

2.译码器选择:74138译码器,如下图所示:状态表(1)C B A Y0 Y10 0 0 0 10 0 1 1 02)Y0Y1=10时,表示Y1接RAM。

状态表(2)端口G1 G2A G2B状态 1 0 0功能使能3.MAXPLUS实现电路图:4.波形图:ROM的波形图RAM的波形图三、体会:在这次实验中与之前所学的只是很不一样,是一个全新的内容,通过这次实验从对主存储器的一无所知,到现在能看懂主存储器的功能,并且能根据存储芯片设计存储器,中间我们遇到的困难可想而知。

毕竟我们才刚接触存储器,面对各种存储时时序上错误,在我们组员的齐心合力之下,我们能很快的了解这些我们原本并不熟悉的知识,并将它们运用到实际中,尽管这只是一个作业。

我们从这份作业中学到很多,也体会到很多,控制信号下的存储功能看似复杂难懂,其实只要我们认真研读,细心讨论,一切难题都将不是问题。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

计算机工程系课程设计报告课程名称: 数据结构课程设计题目:图的深度优先遍历、广度遍历优先算法2016年12月20日班 级: 计算机科学与技术15-3班姓 名: 蔺亚楠 学 号: 15091317 指导老师:范智华目录一、设计目的及要求............................................................................................... I I1.题目与设计要求........................................................................................ I I2.本程序涉及的知识点................................................................................ I I二、功能设计........................................................................................................... I I1.总体设计.................................................................................................... I I2.详细设计 (III)三、程序实现 (IV)1.程序实现时应考虑的问题 (IV)2.核心代码 (IV)3.全部代码 (VI)四、测试分析........................................................................................................ X V1.测试结果及分析..................................................................................... X V2.运行结果................................................................................................. X V五、总结 (XVI)六、参考文献 (XVII)一、设计目的及要求1.题目与设计要求本程序要实现的基本功能有:a)以邻接矩阵为存储结构,实现无向图的深度优先遍历和广度优先遍历。

b)分别输出每种遍历下的结点访问序列.从图中某个顶点出发,沿着某条搜索路径对图中每个顶点各做一次且仅做一次访问。

它是许多图的算法的基础。

2.本程序涉及的知识点图的定义、邻阵矩阵表示法、深度优先搜索、广度优先搜索、结构体的定义以及其他相关函数。

二、功能设计1.总体设计数据类型及函数定义定义图typedef struct{int V[M];int R[M][M];int vexnum;}Graph;创建图void creatgraph(Graph *g,int n)打印图的邻接矩阵void printgraph(Graph *g)访问顶点void visitvex(Graph *g,int vex)深度递归遍历void dfs(Graph *g,int vex)队列的基本操作定义队列typedef struct{int V[M];int front;int rear;}Queue;判断队列是否为空quempty(Queue *q)入队操作enqueue(Queue *q,int e)出队操作dequeue(Queue *q)广度遍历void BESTraverse(Graph *g)主程序模块void main (){构造一个图;打印图的邻接矩阵进行深度优先遍历图;进行广度优先遍历图;}2.详细设计1)主函数:主函数一般设计的较为简洁,只提供输入、功能处理和输出部分的函数调用。

2)广度优先遍历函数:基本思想是首先访问图中某一指定的出发点Vi;然后依次访问Vi的所有接点Vi1,Vi2...Vit;再次访问Vi1,Vi2 (Vi)的邻接点中未经访问过的顶点,依此类推,直到图中所有顶点均被访问为止。

3)深度优先遍历函数:基本思想是首先访问图中某一个指定的出发点Vi;然后任选一个与顶点Vi相邻的未被访问过的顶点Vj;以Vj为新的出发点继续进行深度优先搜索,直至图中所有顶点均被访问过。

三、程序实现1.程序实现时应考虑的问题存在的问题:图中可能存在回路,且图的任一顶点都可能与其他顶点相通,在访问完某个顶点之后可能会沿着某些边又回到了曾经访问过的顶点解决办法:为了避免重复访问,可设置一个标志顶点是否被访问过的辅助标志visitvex辅助数组visitvex 的初始状态为0,在图的遍历过程中,一旦此顶点被访问,就立刻让visitvex为1,防止它被多次访问Visitevex[0..n-1]的设置:图中任一顶点都可能和其它顶点相邻接。

在访问了某顶点之后,又可能顺着某条回路又回到了该顶点。

为了避免重复访问同一个顶点,必须记住每个已访问的顶点。

为此,可设一布尔向量visitvex[0..n-1],其初值为假,一旦访问了顶点Vi之后,便将visitvex[i]置为真。

2.核心代码1)以邻接矩阵为存储结构的图的深度优先搜索遍历的算法void dfs(Graph *g,int vex){ int w;visited[vex]=1; 标记vex已被访问过visitvex(g,vex); 访问图g的顶点for(w=firstadjvex(g,vex);w>0;w=nextadjvex(g,vex,w))if(!visited[w]){ dfs(g,w); } }从初始点vex出发广度优先搜索由邻接矩阵R表示的图void dfstraverse(Graph *g){ int i;for(i=1;i<=g->vexnum;i++)visited[i]=0;for(i=1;i<=g->vexnum;i++)if(!visited[i]){dfs(g,i);} }2)以邻接矩阵为存储结构的图的广度优先搜索遍历的算法从初始点vex出发广度优先搜索由邻接矩阵R表示的图void BESTraverse(Graph *g){ int i;Queue *q=(Queue *)malloc(sizeof(Queue)); 定义一个队列q,其元素类型应为Queue型for(i=1;i<=g->vexnum;i++){ visited[i]=0; 标记初始点i未被已访问过}initqueue(q); 初始化队列for(i=1;i<=g->vexnum;i++){ if(!visited[i]){ visited[i]=1; 标记初始点i已访问过visitvex(g,g->V[i]); 访问顶点ienqueue(q,g->V[i]); 将已访问过的初始点序号i入队while(!quempty(q)) 当队列非空时进行循环处理{依次搜索i的每一个可能的邻接点int u,w;u=dequeue(q);for(w=firstadjvex(g,u);w>0;w=nextadjvex(g,u,w)){ if(!visited[w]){ visited[w]=1; 访问一个未被访问过的邻接点visitvex(g,w); 访问顶点wenqueue(q,w); 顶点w出队}}}} } }3.全部代码#include <stdio.h>#include <malloc.h>#define INF 32767 /*INF表示∞*/typedef int InfoType;#define MAXV 100 /*最大顶点个数*/#define MAXQUEUE 10 /* 队列的最大容量*/struct node /* 图的顶点结构定义*/{int vertex; struct node *nextnode;};typedef struct node *graph; /* 图的结构指针*/struct node head[9]; /* 图的顶点数组*/int visit[9]; /* 遍历标记数组*/int queue[MAXQUEUE]; /* 定义序列数组*/int front = -1; /* 序列前端*/int rear = -1; /* 序列后端*//***********************二维数组向邻接表的转化****************************/void creategraph(int node[20][2], int num){graph newnode; /* 顶点指针*/graph ptr;int from; /* 边起点*/int to; /* 边终点*/int i;for (i = 0; i < num; i++) /* 第i条边的信息处理*/{from = node[i][0]; /* 边的起点*/to = node[i][1]; /* 边的终点*//* 建立新顶点*/newnode = (graph)malloc(sizeof(struct node));newnode->vertex = to; /* 顶点内容*/newnode->nextnode = NULL; /* 设定指针初值*/ptr = &(head[from]); /* 顶点位置*/while (ptr->nextnode != NULL) /* 遍历至链表尾*/ptr = ptr->nextnode; /* 下一个顶点*/ ptr->nextnode = newnode; /* 插入第i个节点的链表尾部*/ }}/************************ 数值入队列************************************/int enqueue(int value){if (rear >= MAXQUEUE) /* 检查伫列是否全满*/ return -1; /* 无法存入*/ rear++; /* 后端指标往前移*/queue[rear] = value; /* 存入伫列*/return 0;}/************************* 数值出队列*********************************/int dequeue(){if (front == rear) /* 队列是否为空*/return -1; /* 为空,无法取出*/ front++; /* 前端指标往前移*/return queue[front]; /* 从队列中取出信息*/}/*********************** 图形的广度优先遍历************************/void bfs(int current){graph ptr;/* 处理第一个顶点*/enqueue(current); /* 将顶点存入队列*/visit[current] = 1; /* 已遍历过记录标志置疑1*/printf(" Vertex[%d]\n", current); /* 打印输出遍历顶点值*/while (front != rear) /* 队列是否为空*/{current = dequeue(); /* 将顶点从队列列取出*/ptr = head[current].nextnode; /* 顶点位置*/while (ptr != NULL) /* 遍历至链表尾*/{if (visit[ptr->vertex] == 0) /*顶点没有遍历过*/{enqueue(ptr->vertex); /* 将定点放入队列*/visit[ptr->vertex] = 1; /* 置遍历标记为1 */printf(" Vertex[%d]\n", ptr->vertex);/* 印出遍历顶点值*/ }ptr = ptr->nextnode; /* 下一个顶点*/}}}/*以下定义邻接矩阵类型*/typedef struct {int no; /*顶点编号*/InfoType info; /*顶点其他信息*/} VertexType; /*顶点类型*/typedef struct /*图的定义*/{int edges[MAXV][MAXV]; /*邻接矩阵*/int vexnum, arcnum; /*顶点数,弧数*/VertexType vexs[MAXV]; /*存放顶点信息*/} MGraph; /*图的邻接矩阵类型*//*以下定义邻接表类型*/typedef struct ANode /*弧的结点结构类型*/{int adjvex; /*该弧的终点位置*/struct ANode *nextarc; /*指向下一条弧的指针*/InfoType info; /*该弧的相关信息,这里用于存放权值*/ } ArcNode;typedef int Vertex;typedef struct Vnode /*邻接表头结点的类型*/{Vertex data; /*顶点信息*/ArcNode *firstarc; /*指向第一条弧*/} VNode;typedef VNode AdjList[MAXV]; /*AdjList是邻接表类型*/typedef struct{AdjList adjlist; /*邻接表*/int n, e; /*图中顶点数n和边数e*/} ALGraph; /*图的邻接表类型*/int visited[MAXV];void MatToList(MGraph g, ALGraph *&G)/*将邻接矩阵g转换成邻接表G*/{int i, j, n = g.vexnum; /*n为顶点数*/ArcNode *p;G = (ALGraph *)malloc(sizeof(ALGraph));for (i = 0; i<n; i++) /*给邻接表中所有头结点的指针域置初值*/G->adjlist[i].firstarc = NULL;for (i = 0; i<n; i++) /*检查邻接矩阵中每个元素*/for (j = n - 1; j >= 0; j--)if (g.edges[i][j] != INF) /*邻接矩阵的当前元素不为0*/{p = (ArcNode *)malloc(sizeof(ArcNode)); /*创建一个结点*p*/p->adjvex = j;p->info = g.edges[i][j];p->nextarc = G->adjlist[i].firstarc;G->adjlist[i].firstarc = p;}G->n = n; G->e = g.arcnum;}void ListToMat(ALGraph *G, MGraph &g)/*将邻接表G转换成邻接矩阵g*/{ int i, j, n = G->n;ArcNode *p;for (i = 0; i<n; i++) /*g.edges[i][j]赋初值0*/for (j = 0; j<n; j++)g.edges[i][j] = INF;for (i = 0; i<n; i++) {p = G->adjlist[i].firstarc;while (p != NULL){g.edges[i][p->adjvex] = p->info;p = p->nextarc;}}g.vexnum = n; g.arcnum = G->e;}void DispMat(MGraph g)/*输出邻接矩阵g*/{int i, j; for (i = 0; i<g.vexnum; i++){for (j = 0; j<g.vexnum; j++)if (g.edges[i][j] == INF)printf("%3s", "∞"); else printf("%3d", g.edges[i][j]); printf("\n");}}void DispAdj(ALGraph *G)/*输出邻接表G*/{int i;ArcNode *p;for (i = 0; i<G->n; i++){p = G->adjlist[i].firstarc;if (p != NULL) printf("%3d: ", i);while (p != NULL){ printf("%3d", p->adjvex); p = p->nextarc; }printf("\n");}}void DFS(ALGraph *G, int v){ArcNode *p; visited[v] = 1; /*置已访问标记*/printf("%3d", v); /*输出被访问顶点的编号*/p = G->adjlist[v].firstarc; /*p指向顶点v的第一条弧的弧头结点*/while (p != NULL){if (visited[p->adjvex] == 0) /*若p->adjvex顶点未访问,递归访问它*/DFS(G, p->adjvex); p = p->nextarc; /*p 指向顶点v的下一条弧的弧头结点*/}}void DFS1(ALGraph *G, int v){int i, visited[MAXV], St[MAXV], top = -1;ArcNode *p;for (i = 0; i<G->n; i++)visited[i] = 0; /*结点访问标志均置成0*/ printf("%3d", v); /*访问顶点v*/top++; /*v入栈*/St[top] = v;visited[v] = 1;while (top >= -1) /*栈不空时循环*/{v = St[top]; top--; /*取栈顶顶点*/p = G->adjlist[v].firstarc;while (p != NULL && visited[p->adjvex] == 1)p = p->nextarc; if (p == NULL) /*若没有退到前一个*/ top--;else /*若有,选择一个*/{v = p->adjvex;printf("%3d", v); /*访问顶点*/visited[v] = 1;top++; /*入栈*/St[top] = v;}}printf("\n");}int main(){int i, j;MGraph g, g1;ALGraph *G;graph ptr;/* 边信息数组*/int node[20][2] = { { 1, 2 }, { 2, 1 }, { 6, 3 }, { 3, 6 }, { 2, 4 }, { 4, 2 },{1, 5}, { 5, 1 }, { 3, 7 }, { 7, 3 }, { 1, 7 }, { 7, 1 }, { 4, 8 }, { 8, 4 }, { 5, 8 }, { 8, 5 }, { 2, 8 }, { 8, 2 }, { 7, 8 }, { 8, 7 } };int A[MAXV][6] = { { INF, 5, INF, 7, INF, INF }, { INF, INF, 4, INF, INF, INF }, { 8, INF, INF, INF, INF, 9 }, { INF, INF, 5, INF, INF, 6 }, { INF, INF, INF, 5, INF, INF }, { 3, INF, INF, INF, 1, INF } };g.vexnum = 6; g.arcnum = 10;puts("This is an example of Width Preferred Traverse of Gragh.\n");for (i = 1; i <= 8; i++) /*顶点结构数组初始化*/{head[i].vertex = i; head[i].nextnode = NULL; visit[i] = 0;}creategraph(node, 20); /* 图信息转换,邻接表的建立*/ printf("The content of the graph's allist is:\n");for (i = 1; i <= 8; i++){printf(" vertex%d =>", head[i].vertex); /* 顶点值*/ptr = head[i].nextnode; /* 顶点位置*/while (ptr != NULL) /* 遍历至链表尾*/{printf(" %d ", ptr->vertex); /* 打印输出顶点内容*/ptr = ptr->nextnode; /* 下一个顶点*/ }printf("\n"); /* 换行*/}printf("The contents of BFS are:\n");bfs(1); /* 打印输出遍历过程*/ printf("\n"); /* 换行*/ puts(" Press any key to quit..."); getchar();for (i = 0; i<g.vexnum; i++) /*建立图9.1的邻接矩阵*/for (j = 0; j<g.vexnum; j++)g.edges[i][j] = A[i][j];printf("\n"); printf(" 有向图G的邻接矩阵:\n");DispMat(g);G = (ALGraph *)malloc(sizeof(ALGraph));printf(" 图G的邻接矩阵转换成邻接表:\n");MatToList(g, G); printf("图G的邻接表:\n");DispAdj(G); printf(" 图G的邻接表转换成邻接邻阵:\n");ListToMat(G, g1); DispMat(g1); printf("\n");printf("从顶点0开始的DFS(递归算法):\n");DFS(G, 0); printf("\n");printf("从顶点0开始的DFS(非递归算法):\n");DFS1(G, 0); printf("\n");}四、测试分析1.测试结果及分析调试过程中遇到的问题以及对设计与实现的回顾讨论和分析:一个图的DFS序列不一定惟一:当从某顶点x出发搜索时,若x的邻接点有多个尚未访问过,则我们可任选一个访问之;源点和存储结构的内容均已确定的图的DFS序列惟一;邻接矩阵表示的图确定源点后,DFS序列惟一;DFS算法中,当从vi出发搜索时,是在邻接矩阵的第i行上从左至右选择下一个未曾访问过的邻接点作为新的出发点,若这样的邻接点多于一个,则选中的总是序号较小的那一个。

相关文档
最新文档