中国石油大学数据结构课程设计

合集下载

数据结构上机指导书_实验一

数据结构上机指导书_实验一

数据结构与算法实验指导书中国石油大学(北京)计算机科学与技术系前言《数据结构》是计算机及相关专业的一门核心基础课程,也是很多高校考研专业课之一。

它主要介绍线性结构、树结构、图结构三种逻辑结构元素的存储实现,在此基础上介绍一些典型算法及时、空效率分析。

这门课程的主要任务是培养学生的算法设计能力及良好的程序设计习惯。

通过学习,要求学生能够掌握典型算法的设计思想及程序实现,能够根据实际问题选取合适的存储方案,设计出简洁、高效、实用的算法,为后续课程的学习及软件开发打下良好的基础。

学习这门课程,习题和实验是两个关键环节。

学生理解算法,上机实验是最佳的途径之一。

因此,实验环节的好坏是学生能否学好《数据结构》的关键。

为了更好地配合学生实验,特编写实验指导书。

一、实验目的更好的理解算法的思想、培养编程能力。

二、实验要求1、每次实验前学生必须根据试验内容认真准备实验程序及调试时所需的输入数据。

2、在指导教师的帮助下能够完成实验内容,得出正确的实验结果。

3、实验结束后总结实验内容、书写实验报告。

4、遵守实验室规章制度、不缺席、按时上、下机。

5、实验学时内必须做数据结构的有关内容,不允许上网聊天或玩游戏,如发现上述现象,取消本次上机资格,平时成绩扣10分。

6、实验报告有一次不合格,扣5分,两次以上不合格者,平时成绩以零分记。

三、实验环境 VC++6.0或者VC2010四、说明1、本实验的所有算法中元素类型可以根据实际需要选择。

2、实验题目中带*者为较高要求,学生可自选;其余部分为基本内容,应尽量完成(至少完成70%,否则实验不合格)。

3、数据结构是很多高校的硕士研究生入学考试的专业课之一,希望有志于考研的学生能够在学习过程中注意各种算法的理解,以便为考研做一定的准备。

五、实验报告的书写要求1.明确实验的目的及要求;2.记录实验的输入数据和输出结果;3.说明实验中出现的问题和解决过程;4.写出实验的体会和实验过程中没能解决的问题;六、参考书目《数据结构》(C++语言描述)王红梅等清华大学出版社《DATA STRUCTURE WITH C++》 William Ford,William Topp清华大学出版社(影印版)实验平台控制台程序1、启动Microsoft VC6.0集成开发环境如图所示:2、单击“文件”菜单,选择“新建”项。

中国石油大学数据结构上机实验3

中国石油大学数据结构上机实验3

《数据结构》实验报告学号2015011512 姓名胡明禹专业数学与应用数学时间2018.4.3一、实验题目实验3 顺序栈基本操作二、实验目的1.熟练掌握顺序栈的实现和基本操作2.理解栈后进先出的特点3.熟练应用顺序栈解决实际问题三、算法设计分析(一)数据结构的定义数据结构是计算机存储、组织数据的方式。

数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。

(二)总体设计此处给出主要函数功能、及函数间调用关系的的描述。

例如:①初始化并建立一个新栈表函数②栈清空函数③栈判断是否为空函数④进栈函数⑤出栈函数⑥取栈顶元素函数⑦输出栈元素函数⑧计算栈中元素个数函数⑨销毁栈函数(1)主函数:统筹调用各个函数以实现相应功能void main()(2)①初始化并建立一个新栈表SqStack *InitStack(SqStack *s){int i;s=(SqStack*)malloc(sizeof(SqStack));s->top=-1;printf("输入顺序栈元素(以0结束):\n");scanf("%d",&i);do{s->top++;//栈顶指针增加一s->data[s->top]=i; //将新插入元素赋值给栈顶空间scanf("%d",&i);while(i!=0);printf("成功\n");return s;}②栈清空函数void SetNULL(SqStack *s){//清空栈s->top=-1;//当栈存在一个元素时,top等于0,因此通常把空栈的条件定位top等于-1 }③栈判断是否为空函数int EMPTY(SqStack *s){//判断栈空if(s->top>=0)return 0;else return 1;}④进栈函数SqStack *Push(SqStack *s){//进栈int a;printf("插入数字:");scanf("%d",&a);if(s->top==maxsize-1)//判断是否栈满{printf("overflow");//溢出return NULL;}else{s->top++;//栈顶指针增加1s->data[s->top]=a;//将新插入元素赋值给栈顶空间}return s;}⑤出栈函数SqStack *Pop(SqStack *s){//出栈if(s->top==-1)//当栈存在一个元素时,top等于0,因此通常把空栈的条件定位top等于-1 {printf("underlow");return s;}else{s->top--;//栈顶指针减一printf("删除的栈顶元素:");printf("%d\n",(s->data[s->top+1]));//若栈不为空,则删除s的栈顶元素}return s;}⑥取栈顶元素函数void GetTop(SqStack *s){//取栈顶if(s->top==-1){printf("SqStack is empty");//当栈存在一个元素时,top等于0,因此通常把空栈的条件定位top 等于-1}else{printf("当前栈顶元素是:");printf("%d\n",(s->data[s->top]));//取栈顶元素地址}}⑦输出栈元素函数void print(SqStack *s){//输出栈int i=0;if(s->top==-1){printf("成功!");}while(i<=s->top){//遍历栈中所有元素printf("%d ",s->data[i]);i++;}}⑧计算栈中元素个数函数void Count(SqStack *s){//计算栈中元素int i=0;while(i<=s->top){i++;}printf("个数为%d",i);}⑨销毁栈函数int DestroyStack_Sq(SqStack *s){ //销毁一个顺序栈Sfree(s);s=NULL;return 1;}四、实验测试结果及结果分析(一)测试结果(此处给出程序运行截图)(二)结果分析成功完成了题目所要求的插入,删除,查找等基本操作。

中国石油大学数据库课程设计

中国石油大学数据库课程设计

中国石油大学(北京)远程教育学院期末考试《数据库课程设计》学习中心:姓名:学号:_关于课程考试违规作弊的说明1、提交文件中涉嫌抄袭内容(包括抄袭网上、书籍、报刊杂志及其他已有论文),带有明显外校标记,不符合学院要求或学生本人情况,或存在查明出处的内容或其他可疑字样者,判为抄袭,成绩为“ 0”。

2、两人或两人以上答题内容或用语有50%以上相同者判为雷同,成绩为“0”。

3、所提交试卷或材料没有对老师题目进行作答或提交内容与该课程要求完全不相干者,认定为“白卷”或“错卷”,成绩为“ 0”。

一、备注:提交一份数据库应用系统的设计报告,报告内容参见第二章数据库设计中的范例——汽车修理厂信息管理系统内容要求如下:1.从应用系统选题中选择一个管理系统;(应用系统选题从以下20 题里任选一题)2.概念模型设计(要求用E-R 图画出概念模型)⑴ 确定实体及其主码、属性;⑵ 确定类型的类型及其属性;3.逻辑结构设计⑴ 定义数据库中表的所有属性及其类型、宽度;⑵ 定义关系模式及其主码、外部码;⑶ 定义视图,说明每个视图的作用;4.行为设计⑴说明查询文件的作用;⑵ 说明表单文件的作用;⑶ 说明报表文件的作用;二、题目11、房屋中介公司售房信息系统数据库主要包括如下内容:现有房源情况、买卖房屋者的基本情况、交易情况等。

该系统需实现三个主要功能:各种信息的维护、各种信息的查询、各种信息的统计。

、概念模型设计1)合并各分E-R图,消除属性冲突、命名冲突、结构冲突等三类冲突,得到初步E-R图,再消除不必要冗余,得到的基本E-R 图如下所示:(2)各E-R 图各实体的属性如下所示:房源:房源(编号,城区,环境,付款,来源,委托,产权,状态)客源:客源(客户编号,客户姓名,客户电话,电子邮箱,客户地址,具体位置,产权性质,最低购价,最高购价,最小面积,最大面积,委托日期,截止日期,录入人员,当前状态)职员:职员(职员编号, 姓名,性别,身份证号,学历,职务,所在部门,出生日期,联系电话,联系电话, 家庭住址,电子邮箱,备注,简历)各 E -R 图中联系的属性如下所示:销售信息:销售信息(售房编号,编号,具体位置,配套环境,房,厅,土地性质,产权性质,价格,产权名称,产权编号,业主姓名,业主电话,联系人,联系电话,委托日期,截止日期,录入人员,当前状态,备注)二、逻辑结构设计关系模式房源信息,客源信息不存在非主属性对主属性的部分函数依赖,也不存在传递函数依赖,已经达到了3NF,但是购房信息,租房信息中存在着一些数据冗余。

数据结构课程设计(5篇)

数据结构课程设计(5篇)

数据结构课程设计(5篇)第一篇:数据结构课程设计课程设计说明书设计名称:数据结构课程设计题目:设计五:二叉树的相关操作学生姓名:专业:计算机科学与技术班级:学号:指导教师:日期: 2012 年 3 月 5 日课程设计任务书计算机科学与技术专业年级班一、设计题目设计五二叉树的相关操作二、主要内容建立二叉树,并对树进行相关操作。

三、具体要求1)利用完全二叉树的性质建立一棵二叉树。

(层数不小于4层)2)统计树叶子结点的个数。

3)求二叉树的深度。

4)能够输出用前序,中序,后序对二叉树进行遍历的遍历序列。

四、进度安排依照教学计划,课程设计时间为:2周。

本设计要求按照软件工程的基本过程完成设计。

建议将时间分为三个阶段:第一阶段,根据题目要求,确定系统的总体设计方案:即系统包括哪些功能模块,每个模块的实现算法,并画出相应的流程图.同时编写相应的设计文档;第二阶段,根据流程图编写程序代码并调试,再将调试通过的各个子模块进行集成调试;第三阶段,归纳文档资料,按要求填写在《课程设计说明书》上,并参加答辩。

三个阶段时间分配的大概比例是:35: 45: 20。

五、完成后应上交的材料本课程设计要求按照学校有关规范的要求完成,在课程设计完成后需要提交的成果和有关文档资料包括课程设计的说明书,课程设计有关源程序及可运行程序(含运行环境)。

其中课程设计说明书的格式按学校规范(见附件),其内容不能过于简单,必须包括的内容有:1、课程设计的基本思想,系统的总功能和各子模块的功能说明;2、课程设计有关算法的描述,并画出有关算法流程图;3、源程序中核心代码的说明。

4、本课程设计的个人总结,主要包括以下内容:(1)课程设计中遇到的主要问题和解决方法;(2)你的创新和得意之处;(3)设计中存在的不足及改进的设想;(4)本次课程设计的感想和心得体会。

5、源代码要求在关键的位置有注释,增加程序的可读性。

程序结构和变量等命名必须符合有关软件开发的技术规范(参见有关文献)。

数据结构课程设计

数据结构课程设计

课程设计任务书题目:算术表达式求值学号:姓名:专业:课程:指导教师:完成时间:2011-12-20~2011-12-27课程设计任务书及成绩评定课程设计的任务和具体要求义字符序列的形式从终端输入语法正确的、不含变量的整数表达式,利用给定的算符优先关系,实现对算数四则混合运算表达式求值,并演示运算符栈、操作数栈、输入字符和主要操作的变化过程。

在对表达式求值前,首先根据栈和队列的基本操作,把中缀表达式转换成后缀表达式,去除括号,根据运算符的优先关系排列到表达式后再计算结果指导老师签字:日期:指导老师评语成绩:指导老师签字:日期:课程设计所需的软件、硬件等Pc机、WIN-TC课程设计进度计划起至日期工作内容备注12.20~12.55 12.25~12.26 12.26~12.27 进行前期准备工作进行代码编写,整理工作进行调试、运行工作参考文献、资料索引序号文献、资料名称编著者出版单位1 数据结构蒋秀英中国石油大学出版社.2 《数据结构(C语言版)》严蔚敏清华大学出版社3 《C语言程序设计》丁峻岭中国铁道出版社4. 《C程序设计》谭浩强清华大学出版社1 设计目的 (5)2设计任务 (5)3设计内容 (5)3.1需求分析 (5)3.1.1程序的功能 (5)3.1.2基本要求: (5)3.1.3测试数据: (5)3.2总体设计 (6)3.2.1程序用到的抽象数据类型 (6)3.2.2主程序流程图: (6)3.2.3说明各模块之间的调用关系: (6)3.3详细设计 (6)3.3.1程序中用到的抽象数据类型: (6)3.4测试与分析 (8)3.4.1测试 (8)3.4.2调试分析 (10)4.附录 (10)5 总结与展望 (14)1 设计目的加强我们的实践能力,掌握数据结构的应用,算法的编写,类C语言的算法转换成C程序并上级调试的基本方法。

对我们基本的程序设计素养的培养和软件工作者作风的训练,起到显著的促进作用。

石大数据结构课程设计

石大数据结构课程设计

石大数据结构课程设计一、课程目标知识目标:1. 让学生掌握大数据结构的基本概念、原理及分类;2. 使学生了解常见大数据结构的应用场景及其优缺点;3. 引导学生掌握线性结构、非线性结构及它们的相关算法。

技能目标:1. 培养学生运用大数据结构解决实际问题的能力;2. 提高学生分析、设计和实现大数据结构算法的技能;3. 培养学生运用数据结构进行数据处理、分析和优化的能力。

情感态度价值观目标:1. 培养学生对大数据结构学科的兴趣和热情;2. 增强学生团队合作意识,培养良好的沟通与协作能力;3. 使学生认识到数据结构在信息技术领域的重要地位,增强社会责任感。

本课程针对石大数据结构课程,结合学生年级特点,注重理论与实践相结合,培养学生的知识运用能力和实际操作技能。

课程目标具体、可衡量,旨在使学生通过学习,能够熟练掌握大数据结构相关知识,为后续相关课程和实际工作打下坚实基础。

同时,课程强调情感态度价值观的培养,激发学生的学习兴趣,提高他们的综合素质。

二、教学内容1. 大数据结构基本概念:数据元素、数据项、数据结构类型;2. 线性结构:数组、链表、栈、队列、字符串;3. 非线性结构:树(二叉树、平衡树、堆)、图(有向图、无向图、最短路径算法、最小生成树算法);4. 常见大数据结构应用场景分析:搜索引擎、推荐系统、社交网络、云计算;5. 数据结构算法分析:时间复杂度、空间复杂度、算法优化;6. 大数据结构在实际应用中的优化策略:存储优化、查询优化、索引优化。

教学内容依据课程目标进行选择和组织,确保科学性和系统性。

教学大纲明确教学内容安排和进度,具体划分为以下六个方面:1. 基本概念与分类:第1章,1课时;2. 线性结构:第2-3章,4课时;3. 非线性结构:第4-5章,6课时;4. 常见应用场景分析:第6章,2课时;5. 算法分析:第7章,3课时;6. 优化策略:第8章,2课时。

教学内容与课本紧密关联,结合教学实际,旨在帮助学生系统掌握大数据结构知识体系,为实际应用打下坚实基础。

中国石油大学数据结构上机实验

中国石油大学数据结构上机实验

《数据结构》实验报告学号2015011512 姓名胡明禹专业数学与应用数学时间2018.4.24一、实验题目实验5 稀疏矩阵的转置二、实验目的1. 稀疏矩阵的压缩存储方法2. 掌握稀疏矩阵的转置算法三、算法设计分析(一)实验内容1.从键盘输入数据,建立稀疏矩阵的三元组顺序存储2.实现稀疏矩阵的转置算法3.输出原矩阵及转置后的矩阵4.实现矩阵的快速转置算法(二)总体设计此处给出主要函数功能、及函数间调用关系的的描述。

例如:①创建稀疏矩阵函数②转置矩阵T函数③快速转置函数④输出函数⑤输出原矩阵和转置函数其功能描述如下:(1)主函数:统筹调用各个函数以实现相应功能Status main()(2)①创建稀疏矩阵函数Status CreateSMatrix(TSMatrix &M){printf("请输入原矩阵:\n");printf("行数、列数:");scanf("%d%d", &M.mu, &M.nu);printf("元素总数:");scanf("%d", &M.tu);printf("输入各个对应压缩值:\n");for (int i = 1; i <= M.tu; ++i)scanf("%d%d%d", &M.data[i].i, &M.data[i].j, &M.data[i].e); return OK;}②转置矩阵T函数Status TransposeSMatrix(TSMatrix M, TSMatrix &T){ int p, q, col;T.mu = M.nu; T.nu = M.mu; T.tu = M.tu;if (T.tu){q = 1;for (col = 1; col <= M.nu; ++col)for (p = 1; p <= M.tu; ++p)if (M.data[p].j == col){T.data[q].i = M.data[p].j;T.data[q].j = M.data[p].i;T.data[q].e = M.data[p].e;++q;}}printf("\n\n稀疏矩阵M转置成功。

石大数据库课程设计

石大数据库课程设计

石大数据库课程设计一、教学目标本课程旨在通过学习数据库的基础理论知识和实际操作技能,使学生掌握数据库的基本概念、设计原则和应用方法,培养学生独立分析和解决数据库相关问题的能力。

具体的教学目标如下:1.知识目标:•理解数据库的基本概念,包括数据库、数据库管理系统、数据库系统等。

•掌握数据库设计的基本原则和方法,包括需求分析、概念设计、逻辑设计和物理设计等。

•熟悉数据库的基本操作,包括数据的增加、删除、修改和查询等。

2.技能目标:•能够使用数据库管理系统进行数据库的创建、表的创建、数据的添加和查询等基本操作。

•能够进行简单的数据库设计和优化,提高数据库的性能和可用性。

•能够运用数据库知识解决实际问题,如设计一个小型的数据库应用系统。

3.情感态度价值观目标:•培养学生对数据库知识的兴趣和热情,激发学生对计算机科学的研究和探索的欲望。

•培养学生的团队合作意识和能力,通过小组讨论和合作完成数据库设计任务。

•培养学生的创新思维和问题解决能力,鼓励学生提出新的数据库设计和解决方案。

二、教学内容根据课程目标,本课程的教学内容主要包括以下几个部分:1.数据库基本概念:介绍数据库、数据库管理系统和数据库系统的定义、特点和应用场景。

2.数据库设计:讲解数据库设计的基本原则和方法,包括需求分析、概念设计、逻辑设计和物理设计等。

3.数据库操作:介绍数据库的基本操作,包括数据的增加、删除、修改和查询等,并通过实际操作练习加深理解。

4.数据库管理:讲解数据库管理的基本知识和技能,包括数据库的创建、表的创建、索引的创建和使用等。

5.数据库性能优化:介绍数据库性能优化的基本方法和技巧,包括查询优化、索引优化和存储优化等。

以上教学内容将按照一定的顺序和进度进行安排,以确保学生能够系统地学习和掌握数据库的知识和技能。

三、教学方法为了激发学生的学习兴趣和主动性,本课程将采用多种教学方法相结合的方式进行教学:1.讲授法:教师通过讲解和演示的方式,系统地传授数据库的基本概念、原理和方法。

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

——数据结构(C语言)课程设计题目:可视化弗洛伊德最短路径一.实习目的通过实习,了解并初步掌握设计、实现较大系统的完整过程,包括系统分析、编码设计、系统集成、以及调试分析,熟练掌握数据结构的选择、设计、实现以及操作方法,为进一步的应用开发打好基础。

二.问题描述设计、实现随机或手动建立一个有向图,可以使用弗洛伊德算法输出有向图中节点之间最短路径及权值,并把有向图和弗洛伊德算法得出的最短路径及最小权值可视化。

三.需求分析(1)可随机建立有向图,并在屏幕上使图可视化;(2)可手动建立有向图,添加节点、删除节点、移动节点、添加边、删除边、设置权值,并在屏幕上使图可视化;(3)对已建立的有向图实现弗洛伊德算法找出最短路径,并在屏幕上使最短路径及最小权值矩阵可视化;四.概要设计∙.系统中子程序及功能要求:数据对象V:一个集合,该集合中的所有元素具有相同的特性数据关系R:R={VR}VR={<x,y>|P(x,y)^(x,y属于V)}(1)OnButtonCreategraph()//随机建图按钮;(2)OnButtonHuman()//手动建图按钮;(3)OnButtonAddvertex()//添加节点按钮;(4)OnButtonDeletevertex()//删除节点按钮;(5)OnButtonMovevertex()//移动节点按钮;(6)OnButtonAddedge()//添加边按钮;(7)OnButtonDeleteedge()//删除边按钮;(8)OnButtonSetweight()//设置权值按钮;(9)OnButtonFloyd()//弗洛伊德算法按钮;(10)DrawDGRandom(TCenterPoint, pDC)//随机建图;(11)DrawDiGraph(CDC *pDC)//图可视化;(12)DrawVexs(CDC *pDC)//节点可视化;(13)DrawEdges(CDC *pDC)//边可视化;(14)InitHand()//存储节点;(15)CreateDGHand(CPoint centerpoint)//手动建图;(16)AddVertsHand()//添加节点;(17)DeleteVex(CPoint vPoint)//删除节点;(18)AddEdgesHand()//添加边;(19)DeleteEdge(CGraphVertex* pBeginVex, CGraphVertex* pEndVex)//删除边;(20)SetEdgeWeightHand ()//设置权值;(21)Floyd()//弗洛伊德算法;(22)DrawFloyd(CDC *pDC)//弗洛伊德可视化;∙各程序模块之间的调用关系(子程序编号见上):主函数可调用子程序 1、2、3、4、5、6、7、8、9子程序1可调用子程序10子程序2、3可调用子程序14、15子程序3可调用子程序16子程序4可调用子程序17子程序6可调用子程序18子程序7可调用子程序19子程序8可调用子程序20子程序9可调用子程序21子程序10可调用子程序11子程序16可调用子程序12子程序17可调用子程序12、19子程序18、19、20可调用子程序13子程序21可调用子程序22五.测试分析按照附录中的测试数据,得出如下测试、分析结果:1.建图功能:(1)随机建图:随机去顶节点的个数与位置及节点之间边的连接、方向与权值大小,并在屏幕上输出图结构;测试结果:可随机输出一有向图。

(2)手动建图:a、添加节点:手动添加节点并放在任意位置;结果:可在任意位置添加节点。

b、删除节点:手动删除一节点;结果:只能按顺序删除,无法任意删除,有待改进。

c、移动节点:可将某一节点移动到其他位置;结果:尚未实现。

d、添加边:在任意两个不同节点之间添加任意方向的边;结果:可以实现添加任意方向的边。

e、删除边:删除任意一条已存在的边;结果:可以删除任意一条存在的边。

d、设置权值:给任意一条已存在的边赋予权值;结果:可以赋予权值;(3)弗洛伊德算法:对已确定的有向图通过Floyd算法找到任意两点间的最短路径并在屏幕上输出最短路径及权值的矩阵;结果:可正确输出路径及权值。

六.使用说明1.运行程序,首先出现主界面。

主界面首先包括两个个选项:选项一:随机建图,点击按钮可在屏幕上输出一随机有向图;选项二:手动建图,可以手动建立有向图。

2.手动建图,出现6个新的选项:选项一:添加节点,在任意位置点击添加一节点;选项二:删除节点,可删除一个节点;选项三:移动节点, 可以移动一节点到其他位置(待改进);选项四: 添加边,点击一个节点后再点击另外一个即可添加该方向的边;选项五:删除边,点击按钮后输入想删除的边的两个节点即可删除该边;选项六:设置权值,点击按钮后输入想添加的边的两个节点及权值即可给该边赋予权值。

3.弗洛伊德算法:对屏幕上已显示的有向图运行Floyd算法,输出最短路径及权值。

七.附录:测试数据九.附C 语言实现源码∙ 系统用到的抽象数据类型定义:∙ class CDiGraph∙ {∙ public:∙ CDiGraph();∙virtual ~CDiGraph();∙public:∙基本数据:∙void DrawFloyd(CDC* pDC);∙void Floyd();∙void Transform();∙void InitHand();∙//有向图的当前顶点数目∙int vexnum;∙//有向图的当前边数目∙int arcnum;∙//有向图深度优先已经遍历顶点数目∙int m_nDFSnum;∙//有向图存储链表∙CTypedPtrList <CObList,CGraphVertex*> m_DigraphList;∙CString Arrayvex[MAX];∙int Arrayweight[MAX][MAX];∙CString Path[MAX][MAX];基本操作:void CreateDGRandom(CPoint vCenterPoint);//自动创建有向图void CreateDGHand(CPoint vCenterPoint);//手动创建有向图///////////////////////////////////////////////////////// 有向图基本函数 /////////////////////////////////////////////////////////int LocateInList(CString vName);//判断顶点vPoint是否在有向图存储链表CGraphVertex* IsPointInList(CPoint vPoint);//判断顶点名vName是否在有向图存储链表CGraphVertex* IsNameInList(CString vName);//判断边(pBeginVex,pEndVex)是否在有向图中BOOL IsEdgeExist(CGraphVertex* pBeginVex,CGraphVertex* pEndVex); //判断名为vName的顶点是否在有向图中存储链表中CGraphVertex* IsVexNameInList(CString vName);//查找名为vName的顶点在有向图中存储链表中的地址CGraphVertex* FindVexNameInList(CString vName);//设置边(vBeginVex,vEndVex)的权值void SetEdgeWeight(CString vBeginVex,CString vEndVex,int vWeight);void DeleteVex(CPoint vPoint);//删除显示位置为vPoint的顶点void DeleteEdge(CGraphVertex* pBeginVex,CGraphVertex* pEndVex); //删除边(pBeginVex,pEndVex)void InsertEdge(CGraphVertex* pBeginVex,CGraphVertex* pEndVex,int weight);//插入顶点(pBeginVex,pEndVex)之间的边///////////////////////////////////////////////////////// 有向图显示函数 // /////////////////////////////////////////////////////////有向图可视化显示void DrawDiGraph(CDC *pDC);//显示有向图边void DrawEdges(CDC *pDC);//显示有向图顶点void DrawVexs(CDC *pDC);∙};画图类:∙class CDiGraphDraw : public CFormView∙{∙protected:∙CDiGraphDraw(); // protected constructor used by dynamic creation∙DECLARE_DYNCREATE(CDiGraphDraw)∙∙// Form Data∙public:∙//{{AFX_DATA(CDiGraphDraw)∙enum { IDD = IDD_DIGRHDRAW_FORMVIEW };∙// NOTE: the ClassWizard will add data members here∙//}}AFX_DATA∙∙// Attributes∙public:∙∙// Operations∙public:∙void DrawFloyd(CDC *pDC);∙//画出弗洛伊德算法的结果∙void Floyd();∙void SetEdgeWeightHand();∙//手动设置权值∙void DelEdgesHand();∙//手动删除边∙void AddEdgesHand();∙//手动添边∙void MovVertsHand();∙BOOL m_Capture;∙void DelVertsHand();∙//手动删除顶点∙void AddVertsHand();∙//手动添加顶点∙void CreateDGHand();∙//手动创建有向图∙void CreateDGRandom();∙//自动创建有向图∙void ComputeFloyd();∙CGraphVertex* m_pEndNode;∙CGraphVertex* m_pBeginNode;∙CPoint m_StartPoint;∙int m_FunType;∙void DrawDGHand(CDC *pDC);∙void DrawDGRandom(CPoint vCenterPoint, CDC *pDC);∙static DWORD WINAPI DiGraphproc(LPVOID lpParameter); ∙CDataStructVisualDoc* GetDocument();∙CDataStructVisualDoc* pDoc;∙bool m_StartFlag;∙HANDLE hEventDiGraph;∙HANDLE hThreadDiGraph;∙int m_flag;∙有向图边的类:∙class CGraphEdge : public CObject∙{∙public:∙CGraphEdge();∙virtual ~CGraphEdge();∙public:∙bool EdgeDraw(CGraphVertex* pBeginVex,CDC *pDC);∙int info;∙int m_weight;//边的权值∙COLORREF m_color;//图边颜色∙CGraphVertex* m_pAdjVertex;∙CGraphEdge* m_pNextEdge;∙}∙有向图顶点的类:∙class CGraphVertex : public CObject∙{∙public:∙CGraphVertex();∙virtual ~CGraphVertex();∙public:∙bool VexDraw(CDC *pDC);∙CPoint m_point;∙COLORREF m_color; //图顶点颜色∙CGraphEdge* m_pFirstEdge;∙char m_strname;∙BOOL m_bvisit;∙int m_nvisit;∙int m_pos;∙∙};∙弗洛伊德算法及其画图的代码:∙void CDiGraph::Floyd()∙{∙Transform();∙int A[MAX][MAX];∙int i,j,k;∙for(i=0;i<vexnum;i++)∙{∙for(j=0;j<vexnum;j++)∙{∙A[i][j]=Arrayweight[i][j];∙if(A[i][j]!=0&&A[i][j]<INT_MAX)∙{∙Path[i][j]=Arrayvex[i]+Arrayvex[j];∙}∙}∙}∙for(k=0;k<vexnum;k++)∙{∙for(i=0;i<vexnum;i++)∙{∙for(j=0;j<vexnum;j++)∙{∙if(A[i][j]>(A[i][k]+A[k][j]))∙{∙if(A[i][k]<INT_MAX&&A[k][j]<INT_MAX)∙{∙A[i][j]=A[i][k]+A[k][j];∙if(Path[i][k]!='0'&&Path[k][j]!='0') ∙{∙ Path[i][j]=Path[i][k]+Arrayvex[j]; ∙}∙∙}∙}∙}∙}∙}∙for(i=0;i<vexnum;i++)∙{∙for(j=0;j<vexnum;j++)∙{∙Arrayweight[i][j]=A[i][j];∙}∙}∙}∙∙void CDiGraph::DrawFloyd(CDC *pDC)∙{∙CString str;∙CPoint m_point;∙m_point.y=50;∙m_point.x=700;∙pDC->MoveTo(m_point.x,m_point.y);∙pDC->LineTo(m_point.x-10,m_point.y+10);∙pDC->MoveTo(m_point.x-10,m_point.y+10);∙pDC->LineTo(m_point.x-10,m_point.y + vexnum*20 - 10); ∙pDC->MoveTo(m_point.x-10,m_point.y + vexnum*20 - 10); ∙pDC->LineTo(m_point.x,m_point.y + vexnum*20 );∙for(int i=0;i<vexnum;i++)∙{∙m_point.x=700;∙for(int j=0;j<vexnum;j++)∙{∙if(Arrayweight[i][j]<INT_MAX)∙{∙str.Format("%d",Arrayweight[i][j]);∙pDC->TextOut(m_point.x,m_point.y,str);∙m_point.x+=20;∙}∙else∙{∙str.Format("%d",Arrayweight[0][0]);∙pDC->TextOut(m_point.x,m_point.y,str);∙m_point.x+=20;∙}∙}∙m_point.y+=20;∙}∙pDC->MoveTo(m_point.x-10,m_point.y);∙pDC->LineTo(m_point.x,m_point.y-10);∙pDC->MoveTo(m_point.x,m_point.y-10);∙pDC->LineTo(m_point.x,m_point.y-vexnum*20+10);∙pDC->MoveTo(m_point.x,m_point.y-vexnum*20+10);∙pDC->LineTo(m_point.x-10,m_point.y-vexnum*20);∙∙m_point.y=250;∙m_point.x=700;∙pDC->MoveTo(m_point.x,m_point.y);∙pDC->LineTo(m_point.x-10,m_point.y+10);∙pDC->MoveTo(m_point.x-10,m_point.y+10);∙pDC->LineTo(m_point.x-10,m_point.y + vexnum*20 - 10);∙pDC->MoveTo(m_point.x-10,m_point.y + vexnum*20 - 10);∙pDC->LineTo(m_point.x,m_point.y + vexnum*20 );∙for(i=0;i<vexnum;i++)∙{∙m_point.x=700;∙for(int j=0;j<vexnum;j++)∙{∙str.Format("%s",Path[i][j]);∙pDC->TextOut(m_point.x,m_point.y,str);∙m_point.x+=45;∙}∙m_point.y+=20;∙}∙pDC->MoveTo(m_point.x-10,m_point.y);∙pDC->LineTo(m_point.x,m_point.y-10);∙pDC->MoveTo(m_point.x,m_point.y-10);∙pDC->LineTo(m_point.x,m_point.y-vexnum*20+10);∙pDC->MoveTo(m_point.x,m_point.y-vexnum*20+10);∙pDC->LineTo(m_point.x-10,m_point.y-vexnum*20);∙}∙界面显示:∙class CLeftPane : public CFormView∙{∙protected:∙CLeftPane(); // protected constructor used by dynamic creation∙DECLARE_DYNCREATE(CLeftPane)∙∙// Form Data∙public:∙//{{AFX_DATA(CLeftPane)∙enum { IDD = IDD_LEFTPANE_FORMVIEW };∙CTreeCtrl m_LeftTree;∙//}}AFX_DATA∙∙// Attributes∙public:∙∙// Operations∙public:∙CRightFrame* m_pRightSwitchFrame;∙∙// Overrides∙// ClassWizard generated virtual function overrides∙//{{AFX_VIRTUAL(CLeftPane)∙public:∙virtual void OnInitialUpdate();∙protected:∙virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support∙virtual void CalcWindowRect(LPRECT lpClientRect, UINT nAdjustType = adjustBorder);∙//}}AFX_VIRTUAL∙∙// Implementation∙protected:∙virtual ~CLeftPane();∙#ifdef _DEBUG∙virtual void AssertValid() const;∙virtual void Dump(CDumpContext& dc) const;∙#endif∙∙// Generated message map functions∙//{{AFX_MSG(CLeftPane)∙afx_msg void OnSize(UINT nType, int cx, int cy);∙afx_msg void OnCancelMode();∙afx_msg void OnSelchangedLeftpaneTree(NMHDR* pNMHDR, LRESULT* pResult);∙//}}AFX_MSG∙DECLARE_MESSAGE_MAP()∙private:∙void InitTree();∙HTREEITEM m_Root;∙CImageList m_TreeImageList;∙CRect m_sRect;∙};树的显示:∙void CLeftPane::InitTree()∙{∙LPSTR pszText;∙m_TreeImageList.Create(16,16,TRUE,6,1);∙HICON hIcon;∙hIcon=::LoadIcon(AfxGetResourceHandle(),MAKEINTRESOURCE(IDI_ICON1 ));∙m_TreeImageList.Add(hIcon);∙hIcon=::LoadIcon(AfxGetResourceHandle(),MAKEINTRESOURCE(IDI_ICON2 ));∙m_TreeImageList.Add(hIcon);∙hIcon=::LoadIcon(AfxGetResourceHandle(),MAKEINTRESOURCE(IDI_ICON3 ));∙m_TreeImageList.Add(hIcon);∙hIcon=::LoadIcon(AfxGetResourceHandle(),MAKEINTRESOURCE(IDI_ICON4 ));∙m_TreeImageList.Add(hIcon);∙hIcon=::LoadIcon(AfxGetResourceHandle(),MAKEINTRESOURCE(IDI_ICON5 ));∙m_TreeImageList.Add(hIcon);∙m_LeftTree.SetImageList(&m_TreeImageList,TVSIL_NORMAL);∙//////////////////////在树视图控件添加信息/////////////////////////////////////∙m_LeftTree.DeleteAllItems();//清空当前书控件所有节点∙m_Root=m_LeftTree.InsertItem("动态切换视图"); //插入根节点∙TV_INSERTSTRUCT TCItem; //设屏蔽∙TCItem.item.mask=TVIF_TEXT|TVIF_PARAM|TVIF_IMAGE|TVIF_SELECTEDIMA GE;∙TCItem.hInsertAfter=TVI_LAST;//在最后项之后∙CString strTreeNodeName="测试一";∙pszText=strTreeNodeName.LockBuffer();∙TCItem.hParent=m_Root;∙TCItem.item.pszText=pszText;∙TCItem.item.iImage=1;∙TCItem.item.iSelectedImage=2;∙HTREEITEM hCurrent=m_LeftTree.InsertItem(&TCItem);∙m_LeftTree.SetItemData(hCurrent,1);∙strTreeNodeName="测试二";∙pszText=strTreeNodeName.LockBuffer();∙TCItem.hParent=m_Root;∙TCItem.item.pszText=pszText;∙TCItem.item.iImage=1;∙TCItem.item.iSelectedImage=2;∙hCurrent=m_LeftTree.InsertItem(&TCItem);∙m_LeftTree.SetItemData(hCurrent,2);∙m_LeftTree.Expand(m_Root, TVE_EXPAND); //展开根节点∙strTreeNodeName="单链表";∙pszText=strTreeNodeName.LockBuffer();∙TCItem.hParent=m_Root;∙TCItem.item.pszText=pszText;∙TCItem.item.iImage=1;∙TCItem.item.iSelectedImage=2;∙hCurrent=m_LeftTree.InsertItem(&TCItem);∙m_LeftTree.SetItemData(hCurrent,3);∙m_LeftTree.Expand(m_Root, TVE_EXPAND); //展开根结点∙∙strTreeNodeName="有向图";∙pszText=strTreeNodeName.LockBuffer();∙TCItem.hParent=m_Root;∙TCItem.item.pszText=pszText;∙TCItem.item.iImage=1;∙TCItem.item.iSelectedImage=2;∙hCurrent=m_LeftTree.InsertItem(&TCItem);∙m_LeftTree.SetItemData(hCurrent,31);∙strTreeNodeName="创建有向图";∙pszText=strTreeNodeName.LockBuffer();∙TCItem.hParent=hCurrent;∙TCItem.item.pszText=pszText;∙TCItem.item.iImage=3;∙TCItem.item.iSelectedImage=4;∙HTREEITEM hCurrent_CrtUndiGraph=m_LeftTree.InsertItem(&TCItem);∙m_LeftTree.SetItemData(hCurrent_CrtUndiGraph,4);∙m_LeftTree.Expand(m_Root, TVE_EXPAND); //展开根结点∙}界面切换功能:void CLeftPane::OnSelchangedLeftpaneTree(NMHDR* pNMHDR, LRESULT* pResult){NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;// TODO: Add your control notification handler code hereint nIndex=-1;UINT nView;nIndex=m_LeftTree.GetItemData(m_LeftTree.GetSelectedItem());switch(nIndex){case 1:nView=VIEW_SPLITTER1;//if (nView) m_pRightPaneFrame->SwitchToView(nView);break;case 2:nView=VIEW_SPLITTER2;//if (nView) m_pRightPaneFrame->SwitchToView(nView);break;case 3:nView=VIEW_SPLITTERLINKLIST;break;case 4:nView=VIEW_SPLITTER_CRTDIGRAPH;break;default:break;}m_pRightSwitchFrame->SwitchToView(nView);*pResult = 1;}十.小组成员分工情况表最开始的树及有向图是由每个人独立完成来熟悉操作和代码,在做有向图及弗洛伊德算法时,王朴和李元主要研究有向图的建立及可视化,包赫和李崇飞主要研究弗洛伊德算法程序,出现问题时由4个人一起讨论、试验来解决,最后程序由大家共同做出。

相关文档
最新文档