中国石油大学数据结构课程设计
数据结构上机指导书_实验一
数据结构与算法实验指导书中国石油大学(北京)计算机科学与技术系前言《数据结构》是计算机及相关专业的一门核心基础课程,也是很多高校考研专业课之一。
它主要介绍线性结构、树结构、图结构三种逻辑结构元素的存储实现,在此基础上介绍一些典型算法及时、空效率分析。
这门课程的主要任务是培养学生的算法设计能力及良好的程序设计习惯。
通过学习,要求学生能够掌握典型算法的设计思想及程序实现,能够根据实际问题选取合适的存储方案,设计出简洁、高效、实用的算法,为后续课程的学习及软件开发打下良好的基础。
学习这门课程,习题和实验是两个关键环节。
学生理解算法,上机实验是最佳的途径之一。
因此,实验环节的好坏是学生能否学好《数据结构》的关键。
为了更好地配合学生实验,特编写实验指导书。
一、实验目的更好的理解算法的思想、培养编程能力。
二、实验要求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
《数据结构》实验报告学号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篇)第一篇:数据结构课程设计课程设计说明书设计名称:数据结构课程设计题目:设计五:二叉树的相关操作学生姓名:专业:计算机科学与技术班级:学号:指导教师:日期: 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.讲授法:教师通过讲解和演示的方式,系统地传授数据库的基本概念、原理和方法。
中国石油大学数据结构上机实验6
《数据结构》实验报告学号2015011512 姓名胡明禹专业数学与应用数学时间2018.5.8一、实验题目实验6 二叉树的遍历二、实验目的1. 掌握二叉树的存储思想与建立算法2. 掌握二叉树各种遍历方法的实现思想3. 实现二叉链表的递归遍历算法与非递归遍历算法三、算法设计分析(一)实验内容1.从键盘输入数据,建立一颗含有n个结点的二叉树2.从对二叉树进行先序,中序和后序遍历的递归算法实现,输出遍历序列3.实现先序遍历或中序遍历的非递归算法实现(二)总体设计此处给出主要函数功能、及函数间调用关系的的描述。
例如:①先序创建二叉树函数②先序遍历函数③中序遍历函数④后序遍历函数⑤前序遍历非递归算法⑥中序遍历非递归算法其功能描述如下:(1)主函数:统筹调用各个函数以实现相应功能void main()(2)①先序创建二叉树Status CreateBiTree(BiTree &T){char ch;scanf("%c",&ch);if(ch==' ')T=NULL;else{if(!(T = (BiTNode *)malloc(sizeof(BiTNode))))exit(OVERFLOW); T->data = ch;CreateBiTree(T->lchild);CreateBiTree(T->rchild);}return OK;}②先序遍历Status PreOrderTraverse(BiTree T,Status(*Visit)(TElemType e)) {if(T){if(Visit(T->data))if(PreOrderTraverse(T->lchild,Visit))if(PreOrderTraverse(T->rchild,Visit)) return OK;return ERROR;}else return OK;}③中序遍历Status InOrderTraverse(BiTree T,Status(*Visit)(TElemType e)) {if(T){if(InOrderTraverse(T->lchild,Visit))if(Visit(T->data))if(InOrderTraverse(T->rchild,Visit)) return OK;return ERROR;}else return OK;}④后序遍历函数Status PostOrderTraverse(BiTree T,Status(*Visit)(TElemType e)) {if(T){if(PostOrderTraverse(T->lchild,Visit))if(PostOrderTraverse(T->rchild,Visit))if(Visit(T->data))return OK;return ERROR;}else return OK;}⑤先序遍历非递归算法Status IPreOrderTraverse(BiTree T,Status(*Visit)(TElemType e)) {BiTree p;p=T;int NUM=-1;BiTNode *stack[30];while(p||NUM>0){Visit(p->data);NUM++;stack[NUM]=p;p=p->lchild;while(!p&&NUM>-1){p=stack[NUM];NUM--;p=p->rchild;}}return OK;}⑥中序遍历非递归算法Status IInOrderTraverse(BiTree T,Status(*Visit)(TElemType e)) {BiTree p;p=T;int NUM=0;BiTNode *stack[30];while(p||NUM>0){if(p){stack[NUM++]=p;p=p->lchild;}else{NUM--;p=stack[NUM];if(!Visit(p->data)) return ERROR;p=p->rchild;}}return OK;四、实验测试结果及结果分析(一)测试结果(此处给出程序运行截图)(二)结果分析成功完成了题目的基本操作。
中国石油大学数据结构课程设计
中国⽯油⼤学数据结构课程设计——数据结构(C语⾔)课程设计题⽬:可视化弗洛伊德最短路径⼀.实习⽬的通过实习,了解并初步掌握设计、实现较⼤系统的完整过程,包括系统分析、编码设计、系统集成、以及调试分析,熟练掌握数据结构的选择、设计、实现以及操作⽅法,为进⼀步的应⽤开发打好基础。
⼆.问题描述设计、实现随机或⼿动建⽴⼀个有向图,可以使⽤弗洛伊德算法输出有向图中节点之间最短路径及权值,并把有向图和弗洛伊德算法得出的最短路径及最⼩权值可视化。
三.需求分析(1)可随机建⽴有向图,并在屏幕上使图可视化;(2)可⼿动建⽴有向图,添加节点、删除节点、移动节点、添加边、删除边、设置权值,并在屏幕上使图可视化;(3)对已建⽴的有向图实现弗洛伊德算法找出最短路径,并在屏幕上使最短路径及最⼩权值矩阵可视化;四.概要设计.系统中⼦程序及功能要求:数据对象V:⼀个集合,该集合中的所有元素具有相同的特性数据关系R:R={VR}VR={|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)//节点可视化;(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)随机建图:随机去顶节点的个数与位置及节点之间边的连接、⽅向与权值⼤⼩,并在屏幕上输出图结构;测试结果:可随机输出⼀有向图。
中国石油大学 数据库课程设计 联系人客户关系管理系统
数据库课程设计课程名称:联系人客户关系管理系统姓名:某XX 学号:******* 专业:计算机科学与技术批次:2018年春层学习中心:昌平直属学习中心2019年12月6日第一章客户管理系统分析1.1 系统的设计目标系统使用简洁的框架结构,可以进行客户的查看、信息录入等操作,实现客户的管理、客户的统计分析、系统维护等模块组成。
以及一些常规的设置和数据库管理等操作。
1.2 系统的可行性分析1.2.1 用户群体与市场分析客户管理系统将能为企业实现有效的客户关系管理。
它既是一种国际领先的、以“客户价值”为中心的企业管理理论、商业策略和企业运作实践,也是一种以信息技术为手段、有效提高企业收益、客户满意度、雇员生产力的管理软件。
客户管理系统是通过赢得、发展、保持有价值的客户,增加企业收入,优化盈利性,提高客户满意度的商务战略。
通过获得更多的客户线索、更广泛地共享客户信息,协同工作,增加收益,提高给客户的价值,实现企业和客户的"双赢"。
企业希望通过客户管理系统能够了解更多的客户的需求,从而为客户提供个性化的产品和服务,提高客户满意度,与此同时也能够获得更大的利润。
客户管理系统是一种旨在健全、改善企业与客户之间关系的新型管理系统。
指的是企业利用信息技术,通过有意义的交流来了解并影响客户的行为,以提高客户招揽率、客户保持率、客户忠诚度和客户收益率。
客户管理系统是一种把客户信息转换成良好的客户关系的可重复性过程。
利用激励因素来刺激客户进一步消费,并激发其"感激"心理,对保持长期的销售和提高客户保持率十分重要。
1.2.2 技术能力分析根据本系统的功能需求,采用JSP与开源的MySQL数据库引擎进行开发。
由于JSP技术使用Java编程语言编写类XML的tags和scriptlets,来封装产生动态网页的处理逻辑。
网页还能通过tags和scriptlets访问存在于服务端的资源的应用逻辑。
中国石油大学数据结构上机实验2
《数据结构》实验报告学号2015011512 姓名胡明禹专业数学与应用数学时间2018320一、实验题目实验2单链表基本操作二、实验目的1.熟练掌握线性表的顺序存储方式下,基本操作的实现算法,巩固和体会单链表操作特点;2.理解体会动态内存申请与释放;3.通过本次实验,熟练掌握C语言指针的使用三、算法设计分析(一)实验内容1.创建一个空的带头结点的单链表2.采用头插法在单链表中插入n个元素3.删除单链表中第i个元素4.实现单链表按关键字查找操作5.计算单链表的表长并输出单链表6.销毁单链表(二)总体设计此处给出主要函数功能、及函数间调用关系的的描述。
例如:1.构造一个空的单链表的函数;2.插入函数;3.删除函数4.查找函数;5.计算并输出函数;6.销毁函数。
其功能描述如下:(1 )主函数:统筹调用各个函数以实现相应功能void mai n()(2)①构造一个空的单链表的函数Status In itList_L(Li nkList &L){L=(LinkList)malloc(sizeof(LNode));// 构造一个空的线性表L f(!L) exit (OVERFLOW);// 存储分配失败L->next=NULL;〃空表长度为Osystem("cls");〃清空屏幕printf("\n\n 初始化成功\n\n\n"); system("PAUSE");〃按任意键继续return OK;}void CreateList_L(LinkList &L){// 创建一个新表int i,count;LinkList p;system("cls");// 清屏printf("\n 输入总结点数:");scanf("%d",&count);printf("\n 输入各个结点数值,每输一个按下回车:\n");for(i = count; i > 0; i--){p = (LinkList)malloc(sizeof(LNode)); scanf("%d",&p->data);p->next = L->next;L-> next = p;〃赋值}system("cls");// 清屏printf("\n 录入成功\n");}②插入函数Status ListInsert_L(LinkList &L, int i, int newnode){// 在顺序线性表L 中第i 个位置之前插入新的元素LinkList p = L;LinkList s;int j = 0;while(p&&j<i-1){p = p->next;++j;}if(!p||j>i-1)//i 插入的位置不合法{printf("error\n");}s = (LinkList)malloc(sizeof(LNode));s->data = newnode;s->next = p->next;// 将p 的后继结点给s 的后继结点p->next = s;// 将s 给p 的后继结点return OK;}③删除函数Status ListDelete_L(LinkList &L, int i){//在顺序线性表L中删除第i个元素,并用e返回其值LinkList p=L;LinkList q;int j=0;while(p->next&&j<i-1)// 如果满足这样的条件{p = p->next;++j;}if(!(p->next)||j>i-1) return ERROR;// 删除位置非法q= p->next;// 将p 的后继结点给qp->next = q->next;// 将q 的后继结点给p 的后继结点printf("\n\n 删除成功\n\n 被删除的结点是:%d\n",q->data); free(q);return OK;}④查找函数Status FindElemList_L(LinkList &L){// 单链表按照关键字查询LinkList p;int i=1,NUMBER;int n=0;p = L->next;printf("\n 输入查询数字:");scanf("%d",&NUMBER);while(p){if(p->data==NUMBER){printf("\n 查询成功!该数字位于结点%d\n",i);n++;}p = p->next;i++;}if(!n){printf("\n 查询失败!未找到该元素!\n");}return OK;}⑤计算并输出函数Status PrintList_L(LinkList &L){// 输出链表m=0;LinkList p;p=L;printf("\n");while(p->next!=NULL)// 当链表非空{p=p->next;printf("%d: %d\n",++m,p->data);// 输出}printf("\n");return OK;}⑥销毁函数Status DestroyList_L(LinkList &L) // 销毁单链表{ LinkList p, q;p=L;while(p){q=p;p=p->next;free(q); // 释放}if(p==NULL)printf("\n 成功,请退出\n\n");elseprintf (” 失败 \n");return OK;}四、实验测试结果及结果分析(一)测试结果(此处给出程序运行截图)'D:\Microsoft Visual Studio\Common\MSDev98\Bin\Debug\hmy_3 27nexe'入成功I 希W'.羊.:-*;-辛吊fi:j ^_ 单— —ic*i3.l wi 6On 冷】•♦•***・*2默#欲譎值:9 • 'O A IA^OW H Vnual Stu4»o \Com«i^rAM$0«vW^rAD<^u9\hn»yJ.2?.ex ,■ ' •WMcp'S V HIO I JwdoXQnvrcrAMSO^v^VBAQ^bvgfmy,業单»<»<»«><> 歩 兀奠 单屢 S 8S —i2c *s 4-u i&7.a年%去的去长为,7 请祐儀泄注・・・12J 15 门7 £ 4Z 人人障九 2r 44u *j 6x a • • •0\Mig5e 々、“2 女u£*OE»M \M5De*^2"d>e0jaE谓捜衽苜槌熨冬•・・ 7 6 L4 9 2匝内,诵怎出清馬任社情辭紈・■!• ■D H \ME M H 七畔叽|细6占说“血射衬翻、伯e 翱诃津《jwbuqmb 」£T ・Ee"(二)结杲分析 成功完成了题冃所要求的插入,删除,查找等基本操作。
中石油远程教育-数据库课程设计
中国石油大学远程教育学院《数据库课程设计》题目:学生管理系统专业:计算机科学与应用班级:1109学生姓名:逐风者学号:00002013 年05 月1 开发背景 (3)1.1 时代背景[1] (3)1.2 开发环境与开发工具 (3)1.3 设计内容 (3)2 功能描述 (4)2.1 系统需求分析 (4)2.2 功能需求分析 (4)2.3 系统功能模块设计 (5)3 数据分析 (6)3.1数据字典 (6)4 概念模型设计 (7)5 逻辑模型设计和优化 (10)5.1 数据库初始关系模式 (10)5.2 规范化处理 (10)6 课程设计总结和体会 (11)参考文献 (12)1 开发背景1.1 时代背景[1]2013年是移动互联网、电子商务、大数据业务蓬勃发展的一年,抛去这些光环的头衔,对于计算机而言,这一切的核心都离不开数据库设计。
数据库系统设计是把现实世界的具体事物和具体业务虚拟化成计算机可以识别的逻辑,简单的说就是对现实世界的实例化。
优秀的数据库模式能够有效存储数据,满足用户信息要求和处理要求。
为了使数据库应用系统开发设计合理、规范、有序、正确、高效进行,现在广泛采用的是工程化6个阶段开发设计过程与方法,它们是需求分析阶段、概念结构设计阶段、逻辑结构设计阶段、物理结构设计阶段、数据库的实施、数据库系统运行与维护阶段。
1.2 开发环境与开发工具本课程设计使用的是MYSQL 数据库,开发语言的使用的是java,前端界面使用的是Netbeans,这是一款可视化的java 开发工具。
1.3 设计内容设计内容:学生学籍和活动的管理,统计学校专业的选课和学生工会(团体)的选择情况。
2 功能描述2.1 系统需求分析本系统的设计模拟一般高校的学生管理内容,系统主要针对学校专业和工会的选择情况进行分析和统计。
(1)本系统需要管理的实体信息①学院信息:学院编号,学院名称,创办年份,简介;②学生信息:学号、姓名、性别、出生日期、电话、入校日期;③专业信息:专业编号、专业名称、创办年份,所属学院;④社团信息:社团编号、社团名称,社团简介,创办年份;(2)本系统要管理的实体联系信息①学院开设专业。
石大远程在线考试——《数据结构课程设计》_85201441854054813
中国石油大学(北京)远程教育学院期末考试《数据结构》课程设计1.课程设计题目从下面四个题目中任选一题完成。
1.1 通讯录的制作用单链表作为数据结构,结合C或者C++语言基本知识,编写一个班级的通讯录管理系统。
系统包括下面几方面的功能:第1:输入信息:输入某同学的信息;第2:显示信息:显示全部通讯录中学生的信息;第3:查找功能:实现按姓名进行查找,并给出查找信息;第4:删除功能:实现按姓名进行删除,并给出操作结果;第5:每名同学的信息包括:姓名、性别、电话、城市;第6:界面友好,每步给出适当的操作提示;第7:系统具有一定的容错能力。
1.2 图书管理系统设计一个计算机管理系统完成图书管理几本业务。
系统要满足下面基本要求:第1:每种图书的登记内容包括:书名、书号、作者、出版社、现存量和库存量;第2:采编入库:新购图书,确定书号后,登记到图书账目表中,如果表中存在该书,则只将库存量增加;第3:借阅:如果该书的库存量大于0,则借出一本,登记借阅者的书证号和归还期限,改变库存量;第4:归还:注销对借阅者的登记,改变该书的库存量;第5:界面友好,每步给出适当的操作提示;第6:系统具有一定的容错能力。
1.3 产品进销管理系统针对某个行业的库房产品进销存情况进行管理,系统要求具有下列功能:第1:采用一定的存储结构对库房的货品及其数量进行分类管理;第2:可以进行产品类的添加、产品的添加、产品数量的添加;第3:能够查询库房每种产品的总量、进货日期、销出数量、销售时间等;第4:每种产品至少包含信息:产品名、进货日期、进货数量、销出数量、销售时间、库存量;第5:界面友好,每步给出适当的操作提示;第6:系统具有一定的容错能力。
1.4 校园导航问题设计中国石油大学(北京)的校园平面图,至少包括10个场所,可以实现任意两个场所的最短路径。
2.课程设计报告书写规范课程设计报告包括该题目的需求分析、概要设计、详细设计、程序测试、感想与体会几部分内容。
中国石油大学数据库课程设计
中国石油大学(北京)远程教育学院期末考试《数据库课程设计》学习中心:姓名:学号:_关于课程考试违规作弊的说明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,但是购房信息,租房信息中存在着一些数据冗余。
计算机软件及应用数据结构排序中国石油大学华东PPT学习教案
25* temp
21 25 25* 49 16 08 012345
16 temp
16 21 25 25* 49 08
08
0 1 2 3 4 5 temp
5
第4页/共33页
算法分析 设待排序元素个数为currentSize = n, 则该算法 的主程序执行n-1趟(第一个元素不用插入)。 排序码比较次数和元素移动次数与元素排序码 的初始排列有关。 最好情况下,排序前元素已按排序码从小到大 有序,每趟只需与前面有序元素序列的最后一个元素 比较1次,总的排序码比较次数为 n-1, 元素移动次数 为0。
13 输出:13 27
13 输出:13 27 38
26
第25页/共33页
49
76
50
50
65
50
65
76
65
97 76 38 27
97 49 38 27
97 49 38 27
13 输出:13 27 38
13 输出:13 27 38 49
13 输出:13 27 38 49
97
65
97
76
65
76
97
24
第23页/共33页
例 含8个元素的无序序列(49,38,65,97,76,13,27,50) ①先建成堆
49
49
49
38
65
38
65
38
13
97 76 13 27
50 76 13 27
50 76 65 27
50
97
97
49
38
13
50 76 65 27
97
13
38
27
50 76 65 49
2020石大远程在线考试《数据结构》课程设计-实现两个链表的合并参考答案
printf("\n输入链表的长度b:\n");
scanf("%d", &b);
printf("请输入链表数据:");
p2 = create(b);
printf("\n你刚才输入的第二个链表的信息:\n");
print(p2);
scanf("%ld", &p1->number);
while (a)//录入链表信息
{
n = n + 1;
if (n == 1)
head = p1;
else
p2->next = p1;
p2 = p1;
p1 = (struct Node *) malloc(L);
if (a != 1)//分配内存
scanf("%ld", &p1->number);
算法的功能是实现两个链表的交叉合并,并且可以根据两链表的长短将行不通的插入。
(5)void InsertSort(struct Node *p,int m)算法的功能是对一合并好的链表进行升序插入排序。
(6)main()函数主要是对算法进行测试。
数据结构:
数据结构定义如下:
struct Node
{
long int number;
if (p->number > (p->next)->number) {
t = p->number;
p->number = (p->next)->number;
(p->next)->number = t;
石油专业数据结构课程研究与教材建设
石油专业数据结构课程研究与教材建设连远锋;李莉【摘要】针对石油专业数据结构课程教学中存在的问题,分析国内高校数据结构课程的教材建设现状,结合中国石油大学(北京)数据结构课程的建设、教学研究、教学实践和教学理念,阐述数据结构教材的改革与创新,即教材整体遵从数据结构自身特点和石油高等学校的教学特点,面向能力培养,在内容组织上注重知识点引入。
【期刊名称】《计算机教育》【年(卷),期】2012(000)004【总页数】4页(P106-109)【关键词】数据结构;教学改革;教学手段;教材建设【作者】连远锋;李莉【作者单位】中国石油大学(北京)计算机科学与技术系,北京102249;中国石油大学(北京)计算机科学与技术系,北京102249【正文语种】中文【中图分类】TP311.12随着世界油气需求的日益增长和勘探程度的不断变化,石油工业科学技术的发展特别是勘探地球物理技术以及测井技术越来越依赖于计算机技术的应用。
我校是具有浓郁石油特色的高等院校,许多学生毕业后就业于石油信息化领域。
数据结构是信息科学的一门核心课程,是研究非数值计算的程序设计问题中计算机操作对象以及它们之间的关系和操作等的一门学科[1]。
我校的部分专业,如勘探、电子、数学以及管理等专业陆续开设了数据结构课程。
许多石油类相关专业的学生在学习本课程时有一定难度,笔者通过课下与同学们交流,总结其主要原因之一是教学内容与专业背景脱节,教材编写风格单调。
现有教材是以类C伪代码作为算法的描述语言。
由于教材过于抽象且缺乏工程背景,特别是在石油工程上的应用案例,这使得学生增长了对数据结构的畏难情绪。
为了增强石油专业学生对现有石油软件的认识,提高其对石油行业问题的编程解决能力,我们结合“学生为本、因材施教、结合行业、分层教学”的原则,开展关于面向石油专业数据结构教材的编写工作。
1 石油专业数据结构主教材的编写要点1.1 编写目标笔者针对石油高等学校的学科特点和石油行业信息化人才的需求,在对数据结构课程的性质、特点以及教学大纲等进行深入分析和充分研究的基础上,编写了《数据结构》(面向石油专业)一书,它是一本适用于石油高等院校各专业的通用教材。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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个人一起讨论、试验来解决,最后程序由大家共同做出。