数据结构课程设计格式参考
数据结构课程设计格式

数据结构课程设计 格式一、课程目标知识目标:1. 理解并掌握数据结构的基本概念,包括线性表、树、图等;2. 学会分析不同数据结构的特点和适用场景,能够选择合适的数据结构解决实际问题;3. 掌握常见数据结构的具体实现方法,如顺序表、链表、二叉树、图等;4. 了解算法的时间复杂度和空间复杂度分析,能够对数据结构进行性能评估。
技能目标:1. 能够运用所学数据结构知识,设计并实现简单的算法解决问题;2. 培养良好的编程习惯,提高编程能力,能够使用至少一种编程语言实现数据结构及相关算法;3. 学会使用数据结构解决实际问题,如排序、查找、最短路径等,提高问题解决能力。
情感态度价值观目标:1. 培养学生对数据结构和算法的兴趣,激发学习热情,形成自主学习的能力;2. 培养学生的团队协作意识,提高沟通与表达能力,学会在团队中分享和交流;3. 培养学生严谨、细致、勤奋的学习态度,增强面对困难的勇气和毅力;4. 培养学生的创新思维,鼓励尝试不同的解决方案,提高创新意识和创新能力。
课程性质:本课程为高年级学科专业课程,旨在帮助学生掌握数据结构的基本知识和技能,培养学生解决实际问题的能力。
学生特点:学生具备一定的编程基础,具有一定的逻辑思维能力和问题解决能力。
教学要求:结合实际案例,注重理论与实践相结合,强调学生的动手实践能力和创新思维。
在教学过程中,注重引导学生主动探索,培养学生自主学习能力。
同时,关注学生的情感态度价值观培养,提高学生的综合素质。
通过本课程的学习,使学生能够在实际项目中灵活运用数据结构知识,提高项目开发效率。
二、教学内容1. 线性表:介绍线性表的概念、性质和基本运算,包括顺序表和链表两种实现方式。
重点讲解链表的各种操作,如插入、删除、查找等。
教材章节:第一章2. 栈和队列:阐述栈和队列的基本概念、性质及应用场景,分析两种数据结构的操作特点。
教材章节:第二章3. 串:介绍串的定义、存储结构及基本操作,如模式匹配算法等。
数据结构课程设计报告模板

数据结构课程设计报告模板课程设计说明书课程名称:数据结构专业:班级:姓名:学号:指导教师:成绩:完成日期:年月日任务书题目:黑白棋系统设计内容及要求:1.课程设计任务内容通过玩家与电脑双方的交替下棋,在一个8行8列的方格中,进行棋子的相互交替翻转。
反复循环下棋,最后让双方的棋子填满整个方格。
再根据循环遍历方格程序,判断玩家与电脑双方的棋子数。
进行大小判断,最红给出胜负的一方。
并根据y/n选项,判断是否要进行下一局的游戏。
2.课程设计要求实现黑白两色棋子的对峙开发环境:vc++6.0实现目标:(1)熟悉的运用c语言程序编写代码。
(2)能够理清整个程序的运行过程并绘画流程图(3)了解如何定义局部变量和整体变量;(4)学会上机调试程序,发现问题,并解决(5)学习使用C++程序来了解游戏原理。
(6)学习用文档书写程序说明目录1.引言 (1)2.课题分析 (4)3.具体设计过程 (5)3.1设计思路 (5)3.2程序设计流程图 (5)3.3.函数实现说明 (10)4.程序运行结果 (12)5.软件使用说明 (16)6.结论 (19)参考文献 (20)附录:源代码 (21)1.引言数据结构在计算机科学界至今没有标准的定义。
个人根据各自的理解的不同而有不同的表述方法:Sartaj Sahni在他的《数据结构、算法与应用》一书中称:“数据结构是数据对象,以及存在于该对象的实例和组成实例的数据元素之间的各种联系。
这些联系可以通过定义相关的函数来给出。
”他将数据对象(data object)定义为“一个数据对象是实例或值的集合”。
Clifford A.Shaffer在《数据结构与算法分析》一书中的定义是:“数据结构是ADT(抽象数据类型Abstract Data Type)的物理实现。
”Lobert L.Kruse在《数据结构与程序设计》一书中,将一个数据结构的设计过程分成抽象层、数据结构层和实现层。
其中,抽象层是指抽象数据类型层,它讨论数据的逻辑结构及其运算,数据结构层和实现层讨论一个数据结构的表示和在计算机内的存储细节以及运算的实现。
数据结构课程设计报告撰写格式

数据结构课程设计
学院名称:
专业:
班级:
姓名:
年月日
《数据结构课程设计》报告要求(字体黑体,小三,居中)
一、第一类题目(宋体,四号,加粗)
1.问题陈述(宋体,小四,单倍行距)
2.程序代码
3.运行结果
4.设计体会与总结
二、第二类题目(宋体,四号,加粗)
1.问题陈述(宋体,小四,单倍行距)
2.需求分析
3.概要设计
4.详细设计
5.程序代码
6.运行结果与测试
7.设计体会与总结
三、第三类题目(宋体,四号,加粗)
1.问题陈述(宋体,小四,单倍行距)
2.需求分析
3.概要设计
4.详细设计
5.程序代码
6.运行结果与测试
7.设计体会与总结
要求:(1)标题为字体黑体,小三,居中
(2)小标题为宋体,四号,加粗
(3)正文要求为宋体,小四,单倍行距
(4)每个段落缩进2个汉字(4个空格)
(5)每个人报告书不得雷同,尤其第二类与第三类题目,发现雷同者一律按不及格论处。
(6)相关内容可以参考《数据结构课程设计》指导书,但不得抄袭相关内容。
优秀数据结构课程设计模板

优秀数据结构课程设计模板一、课程目标知识目标:1. 学生能理解数据结构的基本概念,掌握常用的数据结构类型及其特点。
2. 学生能描述线性表、栈、队列、树、图等数据结构的基本性质和应用场景。
3. 学生能运用所学知识分析实际问题的数据结构需求,并选择合适的数据结构进行解决。
技能目标:1. 学生具备使用编程语言实现各种数据结构的能力,并能熟练运用这些数据结构进行数据处理。
2. 学生能够运用算法分析技巧,评估不同数据结构在解决问题时的效率,优化程序性能。
3. 学生通过实际案例分析,培养解决复杂数据结构问题的能力,提高编程实践技能。
情感态度价值观目标:1. 学生能够认识到数据结构在计算机科学中的重要地位,增强对计算机科学的兴趣和热情。
2. 学生通过小组讨论和合作解决问题,培养团队协作能力和沟通能力。
3. 学生在学习过程中,养成积极思考、勇于探索的良好习惯,形成严谨、踏实的学术态度。
本课程针对高年级学生,课程性质为理论实践相结合。
在教学过程中,注重培养学生的动手能力、思维能力和创新能力。
课程目标旨在使学生在掌握基本数据结构知识的基础上,能够运用所学解决实际问题,提高编程技能,培养良好的团队协作和沟通能力,为后续学习打下坚实基础。
二、教学内容1. 数据结构基本概念:介绍数据结构的概念、作用和分类,引导学生理解数据结构在软件开发中的重要性。
教学内容:线性结构、非线性结构、逻辑结构与物理结构等。
2. 线性表:讲解线性表的定义、特点,以及线性表的顺序存储和链式存储实现。
教学内容:顺序表、链表、双向链表、循环链表等。
3. 栈与队列:介绍栈和队列的基本概念、操作及应用场景。
教学内容:栈的顺序存储和链式存储、队列的顺序存储和链式存储、栈与队列的应用等。
4. 树与二叉树:讲解树的基本概念、性质,重点介绍二叉树及其遍历算法。
教学内容:树的定义、二叉树的性质、二叉树的遍历、线索二叉树、二叉排序树等。
5. 图:介绍图的基本概念、存储结构,以及图的遍历算法。
数据结构课程设计(5篇)

数据结构课程设计(5篇)第一篇:数据结构课程设计课程设计说明书设计名称:数据结构课程设计题目:设计五:二叉树的相关操作学生姓名:专业:计算机科学与技术班级:学号:指导教师:日期: 2012 年 3 月 5 日课程设计任务书计算机科学与技术专业年级班一、设计题目设计五二叉树的相关操作二、主要内容建立二叉树,并对树进行相关操作。
三、具体要求1)利用完全二叉树的性质建立一棵二叉树。
(层数不小于4层)2)统计树叶子结点的个数。
3)求二叉树的深度。
4)能够输出用前序,中序,后序对二叉树进行遍历的遍历序列。
四、进度安排依照教学计划,课程设计时间为:2周。
本设计要求按照软件工程的基本过程完成设计。
建议将时间分为三个阶段:第一阶段,根据题目要求,确定系统的总体设计方案:即系统包括哪些功能模块,每个模块的实现算法,并画出相应的流程图.同时编写相应的设计文档;第二阶段,根据流程图编写程序代码并调试,再将调试通过的各个子模块进行集成调试;第三阶段,归纳文档资料,按要求填写在《课程设计说明书》上,并参加答辩。
三个阶段时间分配的大概比例是:35: 45: 20。
五、完成后应上交的材料本课程设计要求按照学校有关规范的要求完成,在课程设计完成后需要提交的成果和有关文档资料包括课程设计的说明书,课程设计有关源程序及可运行程序(含运行环境)。
其中课程设计说明书的格式按学校规范(见附件),其内容不能过于简单,必须包括的内容有:1、课程设计的基本思想,系统的总功能和各子模块的功能说明;2、课程设计有关算法的描述,并画出有关算法流程图;3、源程序中核心代码的说明。
4、本课程设计的个人总结,主要包括以下内容:(1)课程设计中遇到的主要问题和解决方法;(2)你的创新和得意之处;(3)设计中存在的不足及改进的设想;(4)本次课程设计的感想和心得体会。
5、源代码要求在关键的位置有注释,增加程序的可读性。
程序结构和变量等命名必须符合有关软件开发的技术规范(参见有关文献)。
数据结构课程设计模板(DOC)

数据结构与算法课程设计报告题目:学院:专业班级:学生姓名:指导教师:2016 年06 月2 9日目录一、课程设计目的 (3)二、课程设计步骤 (3)三、课程设计内容 (5)四、课程设计报告...................................................................... 错误!未定义书签。
五、提交材料 (6)六、考核方式与评分标准 (7)七、参考文献 (9)附录1 齐齐哈尔大学软件工程系课程设计说明书(报告)撰写规范 (10)一、课程设计目的及要求《数据结构与算法分析》课程设计培养计算机专业的学生的算法程序设计能力。
通过上机实验,可以培养学生程序设计的方法和技巧,提高学生编制清晰、合理、可读性好的系统程序的能力,加深对数据结构课程和算法的理解。
使学生更好地掌握数据结构的基本概念、基本原理、及基本算法,具有分析算法、设计算法、构造和开发较复杂算法的基本能力。
要求学生能综合运用《数据结构与算法分析》的相关知识,培养学生上机解决一些与实际应用结合紧密的、规模较大的问题的能力,通过分析、设计、编码、调试等各环节的训练,使学生深刻理解、牢固掌握数据结构和算法设计技术,掌握分析实际问题的能力并提高C语言编程技巧,培养良好的编程风格。
课程设计要求独立完成,题目自选(参考题目见三,也可自拟),但需要老师确认(6月16日前定题),一人一题,要求程序有能采用交互式工作方式的界面进行功能的选择,只能用文件存储数据和处理数据不能使用数据库。
要求在教学周的第18周前完成。
二、课程设计步骤随着计算机性能的提高,它所面临的软件开发的复杂度也日趋增加。
然而,编制一个10000行的程序的难度绝不仅仅是一个5000行的程序的两倍,因此软件开发需要系统的方法。
一种常用的软件开发方法,是将软件开发过程分为分析、设计、实现和维护四个阶段。
虽然数据结构课程中的课程设计的复杂度远不如(从实际问题中提出来的)一个“真正的”软件,但为了培养一个软件工作者所应具备的科学工作的方法和作风,完成课程设计的应有如下的5个步骤:1.问题分析和任务定义通常,课程设计题目的陈述比较简洁,或者说是有模棱两可的含义。
数据结构教案设计模板范文
一、教学目标1. 知识目标:(1)了解数据结构的基本概念和分类。
(2)掌握基本数据结构(如线性表、栈、队列、树、图)的定义、性质和基本操作。
(3)理解数据结构在实际问题中的应用。
2. 能力目标:(1)培养学生运用数据结构解决问题的能力。
(2)提高学生的逻辑思维能力和编程能力。
3. 情感目标:(1)激发学生对数据结构的兴趣,培养其自主学习能力。
(2)培养学生的团队合作精神。
二、教学内容1. 数据结构的基本概念和分类2. 线性表3. 栈和队列4. 树5. 图6. 数据结构在实际问题中的应用三、教学过程(一)导入1. 结合生活实例,引导学生思考数据结构在生活中的应用。
2. 介绍数据结构的基本概念和分类。
(二)新课讲解1. 线性表:(1)介绍线性表的定义、性质和基本操作。
(2)通过实例讲解线性表在实际问题中的应用。
2. 栈和队列:(1)介绍栈和队列的定义、性质和基本操作。
(2)通过实例讲解栈和队列在实际问题中的应用。
3. 树:(1)介绍树的定义、性质和基本操作。
(2)通过实例讲解树在实际问题中的应用。
4. 图:(1)介绍图的定义、性质和基本操作。
(2)通过实例讲解图在实际问题中的应用。
(三)课堂练习1. 完成课后习题,巩固所学知识。
2. 编写程序,实现基本数据结构的相关操作。
(四)课堂总结1. 回顾本节课所学内容,总结数据结构的基本概念、性质和操作。
2. 分析数据结构在实际问题中的应用,引导学生思考如何运用数据结构解决实际问题。
四、教学评价1. 课后作业完成情况。
2. 课堂练习及编程能力。
3. 学生对数据结构的兴趣和自主学习能力。
五、教学反思1. 教学过程中,关注学生的兴趣和需求,调整教学内容和方法。
2. 鼓励学生积极参与课堂讨论,提高课堂氛围。
3. 关注学生的学习进度,及时解决学生在学习过程中遇到的问题。
六、教学资源1. 教材、课件、课后习题等。
2. 在线资源,如教学视频、编程平台等。
七、教学时间1. 课时:2课时2. 教学内容分配:- 数据结构的基本概念和分类:0.5课时- 线性表:1课时- 栈和队列:0.5课时- 树:1课时- 图:1课时- 数据结构在实际问题中的应用:0.5课时。
数据结构课程设计说明书模板
目录1.设计目的与任务 (2)2.需求分析 (2)3.设计 (2)3.1设计思想 (2)3.2设计表示 (3)4.用户手册 (5)5.测试数据及测试结果 (5)6.课程设计总结 (6)程序清单 (6)1.设计目的与任务2.需求分析模拟某校九层教学楼的电梯系统。
该楼有一个自动电梯,能在每层停留。
九个楼层由下至上依次称为地下层、第一层、第二层、……第八层,其中第一层是大楼的进出层,即是电梯的“本垒层”,电梯“空闲”时,将来到该层候命。
乘客可随机地进出于任何层。
对每个人来说,他有一个能容忍的最长等待时间,一旦等候电梯时间过长,他将放弃。
模拟时钟从0开始,时间单位为0.1秒。
人和电梯的各种动作均要消耗一定的时间单位(简记为t),比如:有人进出时,电梯每隔40t测试一次,若无人进出,则关门;关门和开门各需要20t;每个人进出电梯均需要25t;如果电梯在某层静止时间超过300t,则驶回1层侯命。
而题目的最终要求输出时:按时序显示系统状态的变化过程,即发生的全部人和电梯的动作序列。
3.设计3.1设计思想(1)数据结构设计本题中的电梯的变化,是一个动态变化的过程,要在动态过程中实现正常跳转,首先要确定各种跳转的状态,因而这里我使用枚举类型来表示电梯的各种状态的:enum {up,down,stop,home}State(home);同时初始化最初状态为电梯在本垒层。
而在电梯的运行过程中对于乘客来说,显然有一个进入电梯与出电梯的队列,因而在这里我是用的链表来实现这个过程的,同时用结构体来保存该乘客的信息:typedef struct passage{int now;//乘客当前所在的位置int dis;//乘客的目地地int wait;//最长的等待的时间int waitnow;//已经等待的时间struct passage *next;}Passage;虽然电梯中的状态是由枚举类型来实现的,但是在整个程序的运行过程中,我还是为电梯设置了一个结构体类型,以便保存更多的信息:typedef struct lift{int count_C;//计数电梯已到达的层数int count_A;//系统的总时间计数器记得必须初始化为0int flag_in[High];//九个楼层有无请求的标志哪个楼层如果有请求该标志置1int num;//等待队列中的人数记得要进行初始化为0int people;//电梯中人数int flag_out[High];}Lift;(2)算法设计顾名思义本程序在运行的过程中用到的算法便是—“电梯算法”,电梯算法借鉴了磁盘寻道C-LOOK算法,即电梯向一个方向运行,直到这个方向上没有服务为止。
《数据结构》课程设计报告范本(doc 8页)
《数据结构》课程设计报告范本(doc 8页)《数据结构》课程设计报告一、课程设计的内容、要求1 线性表的另一种实现。
对顺序表空间被耗尽问题的一个解决办法是:当数组溢出时,用一个更大的数组替换该数组。
一个较好的法则是:当出现溢出时,数组长度加长一倍具有较高的时间和空间效率。
参照教材中顺序表的有关内容,按上面的要求实现顺序表,并测试当数组溢出时你的实现的运作情况。
二、所采用的数据结构ADT List{数据对象: D = {a i|a i ∈ElemSet, i=1,2…n>=0}数据关系: R1={<a i-1, a i>|a i-1, a i∈D, i=1,2,…,n}基本操作:void IniList(SqList& L);void DestroyList(SqList& L);bool ListEmpty(SqList L);int ListLength(SqList L);void GetElem(SqList L, int i, Elem &e);bool PriorElem(SqList L, Elem cur_e, Elem &pre_e);bool NextElem(SqList L, Elem cur_e, Elem &next_e);void ListInsert(SqList &L, int i, Elem e);void ListDelete(SqList &L, int i);void ClearList(SqList& L);}三、主要模块(或函数)及其功能typedef struct LIST{ElemType *data;int size;int max_size;}LIST;void InitList(LIST *list)//初始化{list->data = (int*)malloc(sizeof(ElemType)*INIT_SIZE);list->size = 0;list->max_size = INIT_SIZE;}void DestroyList(LIST &list){}bool NextElem(LIST list,int cur_e,int &next_e)//后继{if(cur_e < 0 || cur_e > list.size) return false;else{next_e = cur_e + 1;return true;}}void Insert(LIST *list,ElemType value){if(list->size>=list->max_size){int i;ElemType *temp = (int*)malloc(sizeof(ElemType)*list->size*2);cout<<endl<<"线性表原容量改变:原大小为"<<list->max_size;for(i=0;i<list->size;i++){temp[i] = list->data[i];}free(list->data);list->data = temp;list->max_size*=2;cout<<"改变后大小"<<list->max_size<<endl;}list->data[list->size] = value;list->size++;}void Insert_Back(LIST *list,int idx,ElemType value){if(list->size>=list->max_size){int i;ElemType *temp = (int*)malloc(sizeof(ElemType)*list->size*2);cout<<endl<<"线性表原容量改变:原大小为"<<list->max_size;for(i=0;i<list->size;i++){temp[i] = list->data[i];}free(list->data);list->data = temp;list->max_size*=2;cout<<"改变后大小"<<list->max_size<<endl;}if(idx>list->size){list->data[list->size] = value;}else{int i;for(i=list->size;i>idx;i--){list->data[i] = list->data[i-1];}list->data[idx] = value;}list->size++;}void ListDelete(LIST *list,int i,ElemType *e)//删除一个元素{int j;*e=list->data[i];for(j=i+1;j<=list->size-1;j++)list->data[j-1]=list->data[j];list->size--;}void Print_list(LIST *list){int i;if(list->size == 0){cout<<"当前线性表内没有元素。
数据结构课程设计报告格式
《数据结构》课程设计报告题目猴子选大王学生姓名学号专业班级指导老师设计日期 2009年12月19日指导老师评阅意见:一、问题定义1、课程设计目的:数据结构课程设计是学习数据结构课程的一个重要环节。
能巩固和加深课堂教学内容,提高学生实际工作能力,培养科学作风,为学习后续课程和今后的系统开发奠定基础。
通过课程设计,使学生熟练掌握数据结构课程中所学的理论知识,并实际应用,通过综合运用数据结构的基本知识来解决实际问题,加强学生分析和解决问题的能力。
2、课程设计的要求:本次课程设计要求学生正确理解课题,考虑问题要细致,全面,解决问题的方法要科学合理,切合实际。
并能上机实现。
3、课程设计的意义:1、有利于基础知识的理解。
学生对计算机运行的机理等知识内容的理解比较肤浅。
如果接触了程度设计,就能真正理解,从而进一步打破计算机的神秘感。
2、有利于逻辑思维的锻炼。
程序设计是公认的、最能直接有效地训练学生的创新思维,培养分析问题、解决问题能力的学科之一。
即使一个简单的程序,从任务分析、确定算法、界面布局、编写代码到调试运行,整个过程学生都需要有条理地构思,这中间有猜测设想、判断推理的抽象思维训练,也有分析问题、解决问题、预测目标等能力的培养。
3、有利于治学态度的培养。
程序设计中,语句的语法和常量变量的定义都有严格的要求,有时输了一个中文标点、打错了一个字母,编译就不通过,程序无法正常运行。
因此,程序设计初学阶段,学生经常会犯这样的错误,可能要通过几次乃至十多次的反复修改、调试,才能成功,但这种现象会随着学习的深入而慢慢改观。
这当中就有一个严谨治学、一丝不苟的科学精神的培养,又有一个不怕失败、百折不挠品格的锻炼猴子选大王任务:一堆猴子都有编号,编号是1,2,3 ...m ,这群猴子(m个)按照1-m的顺序围坐一圈,从第1开始数,每数到第N个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
郑州师范学院软件工程专业数据结构课程设计报告设计题目:班级:组长:姓名(学号)组员:姓名(学号)…指导教师:完成日期:成绩:目录1需求分析 (1)1.1功能分析 (1)1.2设计平台 (1)2概要设计 (2)2.1类LinkList (4)2.2类Joseph (4)2.3类异常处理 (4)3详细设计和实现 (4)3.1创建结点Node (5)3.2创建双向循环链表 (6)3.3从链表中删除结点 (7)4调试与操作说明 (11)4.1调试情况 (11)4.2操作说明 (11)5设计总结 (12)参考文献 (13)附录 (13)1需求分析1.1功能分析本次选做的课程设计是改进约瑟夫(Joseph)环问题。
约瑟夫环问题是一个古老的数学问题,本次课题要求用程序语言的方式解决数学问题。
此问题仅使用单循环链表就可以解决此问题。
而改进的约瑟夫问题通过运用双向循环链表,同样也能方便地解决。
在建立双向循环链表时,因为约瑟夫环的大小由输入决定。
为方便操作,我们将每个结点的数据域的值定为生成结点时的顺序号和每个人持有的密码。
进行操作时,用一个指针current指向当前的结点,指针front始终指向头结点。
然后建立双向循环链表,因为每个人的密码是通过rand()函数随机生成的,所以指定第一个人的顺序号,找到结点,不断地从链表中删除链结点,直到链表剩下最后一个结点,通过一系列的循环就可以解决改进约瑟夫环问题。
1、本演示程序中,利用单向循环链表存储结构模拟约瑟夫问题的进行。
程序运行后,首先要求用户指定初始报数上限值,然后读取个人的密码。
可设n ≤30。
此题所用的循环链表中不需要“头结点”,因此在程序设计中应注意空表和非空表的界限。
2、演示程序以用户和计算机的对话方式执行,即在计算机终端上显示“提示信息”之后,由用户在键盘上输入演示程序中规定的运算命令:相应的输入数据和运算结果显示在其后。
3、程序执行的命令包括:1)构造约瑟夫环;2)执行约瑟夫环,并输出出列人的序号以及相应的密码;3)结束。
4、测试数据1)m的初始值为20;2)n=7,7个人的密码依次为:3、1、7、2、4、8、4。
3)首先m值为6,正确的出列顺序应为6、1、4、7、2、3、5。
1.2设计平台Windows2000以上操作系统;Microsoft Visual C++ 6.02概要设计已知n个人(以编号1,2,3...n分别表示)围成一圈。
从编号为1的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到一圈的人全部出列。
这个就是约瑟夫环问题的实际场景,有一种是要通过输入n,m,k三个正整数,来求出列的序列。
这个问题采用的是典型的循环链表的数据结构,就是将一个链表的尾元素指针指向队首元素。
p->link=head。
解决问题的核心步骤:首先建立一个具有n个链结点,无头结点的循环链表。
然后确定第1个报数人的位置。
最后不断地从链表中删除链结点,直到链表为空。
改进的约瑟夫环问题与原问题思路一致,只是不再采用单循环链表存储结构,而采用双向循环链表,而且用一个判断语句来决定报数的方向的顺时针还是逆时针。
本课程设计主要采用了类的数据结构,程序中包含了两个类:Linklist, Joseph。
为实现上述程序功能,应以单向循环链表表示约瑟夫环。
为此,需要两个抽象数据类型:单向循环链表和约瑟夫环。
1)、单向循环链表的抽象数据类型定义为:ADT List{数据对象:D={ai|ai∈Elemset,i=1,2,…,n,n≥0}数据关系:R1={<a(i-1),ai>|a(i-1),ai∈D,i=2,…n}基本操作:InitList(&L)操作结果:构造一个空的链表L。
DestroyList(&L)初始条件:线性表L已存在。
操作结果:销毁线性表L。
ListLength(L)初始条件:线性表L已存在。
操作结果:返回L中数据元素个数。
GetElem(L,i,&e)初始条件:线性表L已存在,1≤i≤ListLength(L)。
操作结果:用e返回L中第i个数据元素的值。
ListInsert(&L,I,e)初始条件:线性表L已存在,1≤i≤ListLength(L)+1。
操作结果:在L中第i个位置之前插入新的数据元素e,L的长度加1。
ListDelete(&L,i,&e)初始条件:线性表L已存在且非空,1≤i≤ListLength(L)。
操作结果:删除L的第i个数据元素,并用e返回其值,L的长度减1。
ListTraverse(L,visit())初始条件:线性表L已存在。
操作结果:依次对L的每个数据元素调用函数visit()。
一旦visit()失败,则操作失败。
}ADT List2)约瑟夫环的抽象数据类型定义为:ADT Set{数据对象:D={ai|ai为用户输入的数字密码,i=1,2,…,n,1≤n≤7}数据关系:{}基本操作:CreatSet(&L,s)初始条件:L为单向循环链表。
操作结果:对链表中的数据域进行赋值。
DeleteSet(&L,i,&e)初始条件:线性表L已存在且非空,1≤i≤ListLength(L)。
操作结果:删除L的第i个数据元素,并用e返回其值,L的长度减1。
PrintSet(L)初始条件:链表L已存在。
操作结果:按输出次序显示每个人的密码。
}ADT Set3)本程序包含四个模块:1、主程序模块:V oid main(){初始化;Do{接受命令;处理命令;} while (“命令”=”退出”);}2、约瑟夫环单元模块——实现约瑟夫环的抽象数据类型;3、单向循环链表单元模块——实现单向循环链表的抽象数据类型;4、结点结构单元模块——定义单向循环链表的结点结构。
各模块之间的调用关系如下:结点结构单元模块↓单向循环链表单元模块↓约瑟夫环单元模块↓主程序模块2.1类LinkList主要功能是创建结点,每个结点数值域包括data,password,还有指示前驱结点的指针llink,和指示后继结点的指针rlink。
2.2类Joseph主要功能是实现创建双向循环链表及一些相应的操作。
2.3类异常处理在C++程序中,可以使用try-throw-catch结构处理程序异常。
采用这一程序结构能够将使用和实现分离:类和函数的实现者使用throw语句易地错误类别通知使用者。
使用者根据获悉的错误类别采取相应的措施,这就是异常处理。
3详细设计和实现改进约瑟夫环问题的基本思路和原问题基本一致,只是一个采用单循环链表,另一个采用双向循环链表来解决问题。
第一步是定义结构变量结点linklist,并在该结点下定义结点的元素域:data,password,指针域:lLink和rLink。
然后建立一个由n个链结点,无表头结点的双向循环链表。
并由构造函数对结点赋值,由随机函数rand()产生每个结点的password。
由于每个结点的password是由随机函数产生的,也就是每个结点的password是后知的,所以在一开始人为地指定一个结点的顺序,由此结点开始报数。
报password个数后,报到的那个结点被删除,它的password被记录下,由它的下一个结点开始逆方向报数………如此循环,直到循环链表里只剩下一个结点,那就是问题所求的结果。
具体到问题上,还需要创建一个Joseph类,由构造函数来初始化,输入所有的人数,也就是表长,然后指定由第几个人开始报数。
在Joseph类中定义一个GetWinner()函数,由它来实现获得最后的胜利者。
并在该类中设置一个判断语句来确定先由顺时针报数并淘汰了一个人之后,再按逆时针顺序报数,如此交替进行。
主要功能实现的程序流程图及核心代码。
算法流程图:点。
所以,对于所有人围成的圆圈所对应的数据结构采用一个不带头结点的循环链表来描述。
设头指针为front,front始终指向头结点,并定义指针current记录当前的结点。
并根据具体情况移动(顺逆时针)。
为了记录退出的人的先后顺序,采用一个顺序表进行存储。
程序结束后再输出依次退出的人的编号顺序。
由于只记录各个结点的data值就可以。
最后通过函数调用来输出顺序。
要解决约瑟夫环问题,首先一点就是必须有一个环,所以第一步我们必须建立一个双向循环链表。
而建立一个双向循环链表必须有一个空的双向循环链表,然后运用尾插法建立一个双向循环链表,这样约瑟夫环就创建出来了,接下来就是处理约瑟夫环问题。
3.3从链表中删除结点在双向循环链表中,一个结点的前驱结点地址保存在该结点的lLink域中,这样可以方便地实现在一个指定结点之前插入一个新结点的操作,也可以方便地删除某个指定结点。
函数通过代码:q->llink->rlink=q->rlink;q->rlink->llink=q->llink;delete q;来删除当前的那个结点q,通过循环来一次次删除当前的结点,直到链表中剩下最后一个结点。
具体程序如下:#include<stdio.h>#include<malloc.h>#include<stdlib.h>typedef struct node //定义单循环链表中节点的结构{int num;//序列号即个人的编号int cipher;//个人所持有的密码struct node *next;}linklist;class YSFH{public:linklist *Creat(int n);linklist *Select1(int m);linklist *head;//头指针指示有n个结点的单循环链表creat protected:linklist *Select(linklist *head,int m);private:linklist *p;//存放人员信息linklist *r;//临时存放linklist *q;int k;};/*建立单循环链表函数*/linklist *YSFH::Creat(int n){linklist *head;linklist *p;p=(linklist *)malloc(sizeof(linklist));head=p;p->num=1;printf("随机产生第1个人的密码: ");p->cipher=rand()%10;{ if(p->cipher==0)p->cipher=rand()%10;}printf("%d\n",p->cipher);r=p;p->next=p;for(int k=2;k<=n;k++){p=(linklist *)malloc(sizeof(linklist));p->num=k;//给每人一个编号printf("随机产生第%d个人的密码: ",k);p->cipher=rand()%10;{ if(p->cipher==0)p->cipher=rand()%10;}printf("%d\n",p->cipher);r->next=p;r=p;}p->next=head;return(head);}/*决定出列编号*/linklist *YSFH::Select1(int m){return Select(head,m);}linklist *YSFH::Select(linklist *head,int m){q=head;k=1;p=q->next;//q为p的前驱指针,p指向当前报数的人printf("出列的序号依次为:");//在head中的第一个结点起循环记数找第m个结点while(q!=p){k=k+1;//报一次数if(k%m==0)//所报数等于报数上限值时{printf("%d ",p->num);//输出该结点的num值m=p->cipher;//把该结点的cipher(密码)值赋给mq->next=p->next;//对应的节点从链表中删除free(p);k=0;p=q->next;}else{q=p;p=p->next;//p指向当前报数的人}}head=p;return(head);}void main(){int n,m;m!=0;YSFH Y;printf("输入总人数n: ");scanf("%d",&n);Y.head=Y.Creat(n);printf("随机产生第一次的报数上限值m: ");m=rand()%10;{if(m==0)m=rand()%10;}printf("%d\n",m);Y.head=Y.Select1(m);printf("%d\n",Y.head->num);}4调试与操作说明4.1调试情况这次的课程设计的代码很冗长,所以等有了解题思路后,把代码都写上后难免会有很多错误。