《数据结构与算法》课程设计报告

合集下载

数据结构与算法实验报告

数据结构与算法实验报告

数据结构与算法实验报告一、实验目的1.学习并掌握线性表的链式存储结构和链表的基本操作;2.掌握链表的插入、删除、查找等基本操作算法的实现;3.了解链表的应用场景。

二、实验内容与过程本次实验主要包括以下实验内容:1.链表的定义与建立;2.链表的插入操作;3.链表的删除操作;4.链表的查找操作;5.链表的遍历操作;6.链表的逆序操作;7.链表的合并操作。

实验过程如下:1.链表的定义与建立首先,我们定义一个链表的结构,其中包括节点的定义,节点的数据域和指针域。

节点的数据域存放具体的数据,指针域用于指向下一个节点。

```typedef struct Nodeint data;struct Node* next;} Node;```然后,我们定义链表的头指针,并初始化为空链表。

```Node* head = NULL;```2.链表的插入操作插入操作是指在链表中间或末尾插入一个新节点。

首先,我们创建一个新节点,并为其分配内存空间。

```Node* newNode = (struct Node*) malloc(sizeof(Node));newNode->data = 10;newNode->next = NULL;```然后,我们遍历链表,找到插入位置。

```Node* current = head;while (current->next != NULL)current = current->next;```最后,我们将新节点插入到链表中。

```current->next = newNode;```3.链表的删除操作删除操作是指删除链表中的一些节点。

首先,我们找到要删除的节点的前一个节点。

```Node* current = head;while (current->next != NULL && current->next->data != data) current = current->next;```然后,我们将要删除的节点的指针域赋值给前一个节点的指针域。

算法与数据结构课程设计

算法与数据结构课程设计

算法与数据结构课程设计一、课程目标知识目标:1. 让学生掌握基本的数据结构(线性表、树、图等)及其在实际问题中的应用。

2. 使学生了解并掌握常用的算法(排序、查找、递归等),并能够分析算法的效率。

3. 引导学生理解算法与数据结构之间的关系,以及它们在软件开发中的重要性。

技能目标:1. 培养学生能够运用所学数据结构和算法解决实际问题的能力。

2. 提高学生运用编程语言(如C++、Java等)实现算法和数据结构的能力。

3. 培养学生分析、设计、优化算法的能力,以及编写规范、高效的程序代码。

情感态度价值观目标:1. 培养学生积极主动地探索和解决问题,形成良好的学习习惯和团队合作精神。

2. 激发学生对计算机科学的兴趣,使其认识到算法与数据结构在实际应用中的价值。

3. 培养学生具备一定的抽象思维能力,敢于面对复杂问题,勇于克服困难。

课程性质:本课程为高中信息技术课程,旨在让学生掌握计算机科学的基本概念和方法,培养其逻辑思维能力和实际操作能力。

学生特点:高中学生具备一定的数学基础和逻辑思维能力,对新鲜事物充满好奇,但可能对复杂概念和抽象知识接受程度有限。

教学要求:结合学生特点,采用案例教学、任务驱动等教学方法,注重理论与实践相结合,让学生在动手实践中掌握知识,提高能力。

在教学过程中,关注学生的个体差异,给予个性化指导,确保课程目标的实现。

通过课程学习,使学生能够达到以上所述的具体学习成果,为后续学习和工作打下坚实基础。

二、教学内容1. 数据结构:- 线性表:数组、链表- 栈与队列- 树:二叉树、线索二叉树、树的应用- 图:图的表示、图的遍历、最短路径2. 算法:- 排序:冒泡排序、选择排序、插入排序、快速排序、归并排序- 查找:顺序查找、二分查找、哈希查找- 递归:递归算法的设计与实现- 算法效率分析:时间复杂度、空间复杂度3. 教学内容的安排与进度:- 数据结构(第一、二周):线性表、栈与队列、树- 算法(第三、四周):排序、查找、递归- 算法效率分析(第五周):时间复杂度、空间复杂度4. 教材章节:- 《算法与数据结构》第一章:数据结构基础- 《算法与数据结构》第二章:线性表- 《算法与数据结构》第三章:栈与队列- 《算法与数据结构》第四章:树和二叉树- 《算法与数据结构》第五章:图- 《算法与数据结构》第六章:排序- 《算法与数据结构》第七章:查找- 《算法与数据结构》第八章:算法效率分析教学内容注重科学性和系统性,按照由浅入深的顺序组织,确保学生在掌握基本概念和方法的基础上,逐步提高解决问题的能力。

算法与数据结构课程设计 报告

算法与数据结构课程设计 报告

算法与数据结构课程设计报告课程设计题目:图的基本操作及应用数据结构课程设计是在学完数据结构课程之后的实践教学环节。

本实践教学是培养学生数据抽象能力,进行复杂程序设计的训练过程。

要求学生能对所涉及问题选择合适的数据结构、存储结构及算法,并编写出结构清楚且正确易读的程序,提高程序设计基本技能和技巧。

一.设计目的1.提高数据抽象能力。

根据实际问题,能利用数据结构理论课中所学到的知识选择合适的逻辑结构以及存储结构,并设计出有效解决问题的算法。

2.提高程序设计和调试能力。

学生通过上机实习,验证自己设计的算法的正确性。

学会有效利用基本调试方法,迅速找出程序代码中的错误并且修改。

3.初步了解开发过程中问题分析、整体设计、程序编码、测试等基本方法和技能。

二.设计任务设计一个基于DOS菜单的应用程序。

要利用多级菜单实现各种功能。

内容如下:1.无向图的基本操作及应用①创建无向图的邻接矩阵②创建无向图的邻接表③无向图的深度优先遍历④无向图的广度优先遍历2.有向图的基本操作及应用①创建有向图的邻接矩阵②创建有向图的邻接表③拓扑排序3.无向网的基本操作及应用①创建无向网的邻接矩阵②创建无向网的邻接表③求最小生成树4.有向网的基本操作及应用①创建有向网的邻接矩阵②创建有向网的邻接表③关键路径④单源最短路径三.设计指导第一步:根据设计任务,设计DOS菜单。

第二步:设计菜单(c语言)#include<stdio.h>void ShowMainMenu(){printf("\n");printf("**************图的基本操作及应用***************\n");printf("* 1 无向图的基本操作及应用*\n");printf("* 2 有向图的基本操作及应用*\n");printf("* 3无向网的基本操作及应用*\n");printf("* 4有向网的基本操作及应用*\n");printf("* 5退出\n");printf("***********************************************\n"); }void UDG(){int n;do{printf("\n");printf("**************无向图的基本操作及应用***************\n");printf("* 1创建无向图的邻接矩阵*\n");printf("* 2创建无向图的邻接表*\n");printf("* 3无向图的深度优先遍历*\n");printf("* 4无向图的广度优先遍历*\n");printf("* 5退出\n");printf("***********************************\n"); printf("请选择:");scanf("%d",&n);switch(n){case 1:printf("----------wait-------");break;case 2:printf("----------wait-------");break;case 3:printf("----------wait-------");break;case 4:printf("----------wait-------");break;case 5:break;default:printf("ERROR!");}}while(n!=5);}void DG(){int n;do{printf("\n");printf("************** 有向图的基本操作及应用***************\n"); printf("* 1创建有向图的邻接矩阵*\n");printf("* 2创建有向图的邻接表*\n");printf("* 3拓扑排序*\n");printf("* 4退出*\n");printf("*******************************\n"); printf("请选择:");scanf("%d",&n);switch(n){case 1:printf("--------wait-------");break;case 2:printf("--------wait-------");break;case 3:printf("--------wait-------");break;case 4:break;default:printf("ERROR!");}}while(n!=4);}void UDN(){int n;do{printf("\n");printf("**************无向网的基本操作及***\n");printf("* 1创建无向网的邻接矩阵*\n");printf("* 2创建无向网的邻接表*\n");printf("* 3Prim算法求最小生成树*\n");printf("* 4kraskal算法求最小生成树*\n");printf("* 5退出\n");printf("*************************************\n"); printf("请选择:");scanf("%d",&n);switch(n){case 1:printf("---------wait-------");break;case 2:printf("-------wait-------");break;case 3:printf("---------wait-------");break; case 4:printf("---------wait-------");break; case 5:break;default:printf("ERROR!");}}while(n!=5);}void DN(){int n;do{printf("\n");printf("**************有向网的基本操作****\n");printf("* 1创建有向网的邻接矩阵*\n");printf("* 2创建有向网的邻接表*\n");printf("* 3关键路径*\n");printf("* 4单源顶点最短路径问题*\n");printf("* 5退出\n");printf("***********************************\n"); printf("请选择:");scanf("%d",&n);switch(n){case 1:printf("---------wait-------");break;case 2:printf("---------wait-------");break;case 3:printf("---------wait-------");break;case 4:printf("---------wait-------");break;case 5:break;default:printf("ERROR!");}}while(n!=5);}void main(){int n;do{ShowMainMenu();printf("请选择:");scanf("%d",&n);switch(n){case 1:UDG();break;case 2:DG();break;case 3:UDN();break;case 4:DN();break;case 5:break;default:printf("ERROR!");break;}}while(n!=5);}第三步:添加功能函数。

数据结构课程设计——报告(样例)

数据结构课程设计——报告(样例)

《数据结构与算法》课程设计报告王婧、龚丹、宋毅编写题目:航空订票管理系统学期:秋班号:学号:姓名:成绩:哈尔滨华德学院电子与信息工程学院年月一、实训设计的目的与要求(注:正文为宋体,五号字,为单倍行距)(一)课程设计目的(不少于字).数据结构课程设计是综合运用数据结构课程中学到的几种典型数据结构,以及程序设计语言(语言),自行实现一个较为完整的应用系统。

.通过课程设计,自己通过系统分析、系统设计、编程调试,写实验报告等环节,进一步掌握应用系统设计的方法和步骤,灵活运用并深刻理解典型数据结构在软件开发中的应用。

.学会将知识应用于实际的方法,提高分析和解决问题的能力,增加综合能力。

具体的有:()熟练掌握链表存储结构及其建立过程和常用操作;()熟练掌握队列的建立过程和常用操作;()学会自己调试程序的方法并掌握一定的技巧。

(二)题目要求(不少于字).每条航线所涉及的信息有:终点站名、航班号、飞机号、飞机周日(星期几)、乘员定额、余票量、订定票的客户名单(包括姓名、订票量、舱位等级,或)以及等候替补的客户名单(包括姓名和所需数量)。

.系统能实现的操作和功能如下:()查询航线:根据客户提出的终点站名输出如下信息:航班号、飞机号、星期几飞行和余票额;()承办订票业务:根据客户提出的要求(航班号、订票数额)查询该航班票额情况,若有余票,则为客户办理订票手续,输出座位号;若已满员或余票量少余订票额,则需重新询问客户要求。

若需要,可登记排队候补;()承办退票业务:根据客户提出的情况(日期、航班号),为客户办理退票手续,然后查询该航班是否有人排队候补,首先询问排在第一的客户,若所退票额能满足他的要求,则为他办理订票手续,否则依次询问其它排队候补的客户。

二、实训环境配置系统三、设计正文.需求分析。

数据结构与算法实验报告[1]

数据结构与算法实验报告[1]

数据结构与算法实验报告实验目的:本次实验主要目的是掌握数据结构与算法的基本概念和实际应用。

通过设计和实现特定的数据结构和算法,加深对其原理和应用的理解,培养分析和解决实际问题的能力。

实验内容:本次实验包括以下几个部分:1\实验环境和工具介绍在本部分,将介绍实验所使用的开发环境和工具,包括操作系统、编程语言、集成开发环境等。

2\实验设计和思路本部分将详细介绍实验的设计思路、算法的选择和实现方式。

具体包括数据结构的选择、算法的设计原理、时间和空间复杂度分析等。

3\实验步骤和代码实现在本部分,将详细列出实验的具体步骤和算法的实现代码。

包括数据结构的定义和操作、算法的实现和测试数据的等。

4\实验结果和分析在本部分,将展示实验的运行结果,并对实验结果进行分析和讨论。

包括实际运行时间、空间占用、算法的优缺点等方面的讨论。

5\实验总结和思考在本部分,将对整个实验进行总结和思考。

包括实验过程中遇到的问题和解决方法,对实验结果的评价,以及对进一步的研究方向的思考等内容。

附件:本文档附带以下附件:1\源代码:包括数据结构的定义和操作,算法的实现等。

2\测试数据:用于验证算法实现的测试数据。

3\实验结果截图:包括算法运行结果、时间和空间占用等方面的截图。

法律名词及注释:1\数据结构:在计算机科学中,数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。

2\算法:算法是解决问题的一系列清晰而简明的指令,是计算或操作的一种良定义的规程。

3\时间复杂度:时间复杂度是度量算法运行时间长短的一个表达式,用大O符号表示。

4\空间复杂度:空间复杂度是度量算法运行过程中所需的存储空间的一个表达式,用大O符号表示。

结语:本文档详细介绍了数据结构与算法实验的设计思路、步骤和实现代码,并对实验结果进行了分析和讨论。

实验过程中,我们掌握了数据结构与算法的基本概念和实际应用,提高了问题解决能力和编程实践能力。

《数据结构与算法》课程设计报告范例1

《数据结构与算法》课程设计报告范例1

《数据结构与算法》课程设计报告姓名:学号:专业:信息与计算科学一、课题:链表的维护与文件形式的保存以有序链表结构表示某家电商场的库存模型。

提/进货时,需对链表进行维护。

每个工作日结束后,应将该链表以文件形式保存;每日营业前,应从文件中恢复该有序链表结构。

链表接点的数据域包括家电名称,品牌,单价和数量,以单价的升序体现链表的有序性。

程序包括:初始化,创建表,插入,删除,更新数据,查询及链表数据与文件之间的转换等;二、功能、算法、体会描述:系统主要有两个界面,第一个界面是查看界面,任何人可以查看到多个库存或日志文件(050902--050905),如果某个库存文件丢失了,可以通过操作恢复,在这也可以也可以查看到某日的金额统计情况,第二个界面是操作界面,只有操作员可以通过密码进入,可以对某个指定的库存文件进行进货,提货,删货,排序,查询操作,操作的情况可以被系统随时保存,当您想退出此界面时可保存库存和日志情况,文件名可自定,保存完后,自动退回到第一个界面,您当然就可以在查看界面中查看到您刚刚保存的库存或者日志文件了。

1.库存查看功能:基本思想:利用SetupGoodsList( )函数,将库存文件内容先转成链表形式,然后利用TraverseList( )函数,遍历一个链表,就可以直接显示查看到了。

具体步骤:先将文件读到结构体中,读满一个结构体内容就将此结构体连到定义好的链表上,这儿利用了InsertRear( )函数,一直这样读下去只到文件里读不到内容为止,语句描述如下:while(ifstr>>g.code){ifstr>>>>g.mark>>g.minq>>g.curq;InsertRear(L,g);}2.日志查看功能:日志文件的内容看起来跟库存文件差不多,但是里面多了个“操作情况”这一览,所以在读的时候要注意这一点,实现这个功能的我编了rizhichakan( )函数基本思想:将文件内容独到结构体数组中,然后再显示出来具体步骤:先读一个字符串到数组d[ ]中,然后用strcmp( ),判断是不是“j”字符串,如果是就连读5个字符串到定义好的结构体数组中,因为这句话是放在while( )循环里的,要能够的起循环就要不断的给d[ ]赋新值,所以循环语句中还有一句:再读第6个字符串到d[ ]中,只要符合循环条件的都会被连续加到结构体数组中,语句描述为:ifstr>>d;//因为是比较两个字符串所以要一个数组while(strcmp(d,"j")==0){ifstr>>r[x].code>>r[x].name>>r[x].mark>>r[x].minq>>r[x].curq;ifstr>>d[0]; //数组赋不起来,所以改成了元素x++;}其它以“t”“s”开头的也同样的道理,这样就将处了开头的“j”“t”“s”字符以外的信息内容全分别存到三个结构体数组中,这样往外显示的时候可以更清楚方便准确,然后就到用for( )语句循环的将结构体内容显示了,语句描述为:for(p=1;p<x;p++){cout<<setw(8)<<"j";cout<<setw(9)<<r[p].code<<setw(16)<<r[p].name<<setw(16)<<r[p].mark<<setw(10)<<r[p]. minq<<setw(10)<<r[p].curq<<endl;体会:在这懂了strcmp( )是比较两个字符串的,不是单纯的字符,对while()循环有了更深刻的理解,明白了文件的内容要经过一个中间环节,才能够显示,这儿的中间环节就是结构体数组。

数据结构与算法课程设计

数据结构与算法课程设计

数据结构与算法课程设计一、课程目标知识目标:1. 理解并掌握常见的数据结构(如线性表、树、图等)的基本概念和应用场景;2. 学习并掌握基本算法设计与分析技巧,包括排序、查找、递归等;3. 了解不同数据结构和算法在实际问题中的应用和性能分析。

技能目标:1. 能够运用所学数据结构设计简单的程序,解决实际问题;2. 能够运用算法分析技巧,评价算法的性能,并进行优化;3. 培养学生的编程能力、逻辑思维能力和问题解决能力。

情感态度价值观目标:1. 激发学生对数据结构与算法的兴趣,培养其主动探究和钻研的精神;2. 培养学生的团队合作意识,使其学会在团队中协作解决问题;3. 培养学生严谨、踏实的学术态度,认识到数据结构与算法在计算机科学中的重要性。

课程性质:本课程为高中信息技术课程,旨在帮助学生掌握数据结构与算法的基本知识,提高编程能力和问题解决能力。

学生特点:高中学生已具备一定的编程基础和逻辑思维能力,对新鲜事物充满好奇心,但需加强对数据结构与算法的实践操作和深入理解。

教学要求:结合学生特点,注重理论与实践相结合,通过案例教学和任务驱动,让学生在实际操作中掌握数据结构与算法的知识,提高其编程能力和问题解决能力。

同时,关注学生的情感态度价值观培养,使其形成良好的学习习惯和团队合作意识。

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

二、教学内容1. 数据结构部分:- 线性表:定义、顺序存储、链式存储;- 栈和队列:基本概念、应用场景、实现方法;- 树:二叉树、遍历方法、线索二叉树;- 图:图的表示方法、遍历算法、最小生成树、最短路径。

2. 算法部分:- 排序算法:冒泡排序、选择排序、插入排序、快速排序、归并排序;- 查找算法:顺序查找、二分查找、哈希查找;- 递归算法:递归概念、应用实例、递归与栈的关系;- 算法分析:时间复杂度、空间复杂度、算法优化。

3. 教学大纲:- 第一周:数据结构概述,线性表的概念及存储;- 第二周:栈和队列,树的基本概念;- 第三周:二叉树及遍历方法,线索二叉树;- 第四周:图的表示和遍历,最小生成树和最短路径;- 第五周:排序算法,查找算法;- 第六周:递归算法,算法分析。

数据结构与算法分析》实验报告

数据结构与算法分析》实验报告

数据结构与算法分析》实验报告《数据结构与算法分析》实验报告一、实验目的本次实验旨在通过实际操作和分析,深入理解数据结构与算法的基本概念和原理,掌握常见数据结构的实现和应用,以及算法的设计和性能评估。

通过实验,提高编程能力和解决实际问题的能力,培养逻辑思维和创新精神。

二、实验环境操作系统:Windows 10编程语言:Python 3x开发工具:PyCharm三、实验内容1、线性表顺序表的实现与操作链表的实现与操作2、栈和队列栈的实现与应用(表达式求值)队列的实现与应用(排队系统模拟)3、树和二叉树二叉树的遍历算法实现(前序、中序、后序)二叉搜索树的实现与操作4、图图的存储结构(邻接矩阵和邻接表)图的遍历算法(深度优先搜索和广度优先搜索)5、排序算法冒泡排序插入排序选择排序快速排序归并排序6、查找算法顺序查找二分查找四、实验步骤及结果1、线性表顺序表的实现与操作定义一个顺序表类,使用数组来存储元素。

实现插入、删除、查找等基本操作。

进行性能测试,分析在不同位置插入和删除元素的时间复杂度。

实验结果表明,在顺序表的前端或中间进行插入和删除操作时,时间复杂度较高,而在末尾操作时效率较高。

链表的实现与操作定义链表节点类和链表类。

实现链表的插入、删除、查找等操作。

比较顺序表和链表在不同操作下的性能差异。

结果显示,链表在频繁插入和删除元素的情况下表现更优,而顺序表在随机访问元素时速度更快。

2、栈和队列栈的实现与应用(表达式求值)用栈来实现表达式求值的算法。

输入表达式,如“2 + 3 ( 4 1 )”,计算并输出结果。

经过测试,能够正确计算各种复杂的表达式。

队列的实现与应用(排队系统模拟)模拟一个简单的排队系统,顾客到达和离开队列。

输出队列的状态和平均等待时间。

实验发现,队列长度和顾客等待时间与到达率和服务率密切相关。

3、树和二叉树二叉树的遍历算法实现(前序、中序、后序)构建一棵二叉树。

分别实现前序、中序、后序遍历算法,并输出遍历结果。

数据结构与算法课程设计报告---图的算法实现

数据结构与算法课程设计报告---图的算法实现

数据结构与算法课程设计报告课程设计题目:图的算法实现专业班级:信息与计算科学1002班目录摘要 (1)1、引言 (1)2、需求分析 (1)3、概要设计 (2)4、详细设计 (4)5、程序设计 (10)6、运行结果 (18)7、总结体会 (19)摘要(题目): 图的算法实现实验内容图的算法实现问题描述:(1)将图的信息建立文件;(2)从文件读入图的信息,建立邻接矩阵和邻接表;(3)实现Prim、Kruskal、Dijkstra和拓扑排序算法。

关键字:邻接矩阵、Dijkstra和拓扑排序算法1.引言本次数据结构课程设计共完成图的存储结构的建立、Prim、Kruskal、Dijkstra 和拓扑排序算法等问题。

通过本次课程设计,可以巩固和加深对数据结构的理解,通过上机和程序调试,加深对课本知识的理解和熟练实践操作。

(1)通过本课程的学习,能够熟练掌握数据结构中图的几种基本操作;(2)能针对给定题目,选择相应的数据结构,分析并设计算法,进而给出问题的正确求解过程并编写代码实现。

使用语言:CPrim算法思想:从连通网N={V,E}中的某一顶点v0出发,选择与它关联的具有最小权值的边(v0,v),将其顶点加入到生成树的顶点集合V中。

以后每一步从一个顶点在V中,而另一个顶点不在V中的各条边中选择权值最小的边(u,v),把它的顶点加入到集合V中。

如此继续下去,直到网中的所有顶点都加入到生成树顶点集合V中为止。

拓扑排序算法思想:1、从有向图中选取一个没有前驱的顶点,并输出之;2、从有向图中删去此顶点以及所有以它为尾的弧;重复上述两步,直至图空,或者图不空但找不到无前驱的顶点为止。

没有前驱-- 入度为零,删除顶点及以它为尾的弧-- 弧头顶点的入度减1。

2.需求分析1、通过键盘输入建立一个新的有向带权图,建立相应的文件;2、对建立的有向带权图进行处理,要求具有如下功能:(1)用邻接矩阵和邻接表的存储结构输出该有向带权图,并生成相应的输出结果;(2)用Prim、Kruskal算法实现对图的最小生成树的求解,并输出相应的输出结果;(3)用Dijkstra算法实现对图中从某个源点到其余各顶点的最短路径的求解,并输出相应的输出结果;(4)实现该图的拓扑排序算法。

数据结构与算法课程设计程序及报告

数据结构与算法课程设计程序及报告

数据结构与算法课程设计报告题目两两相连的房间问题:一所奇怪的房子,这所房子里有n个房间,每个房间里有一些门通向别的房间,可是这些门十分奇怪,它们只能从房间a开向房间b,也就是说,一扇从a开向b的门是不能让一个人从b房间走到a房间的。

你能计算一下任意两个房间之间都互相相通吗?问题分析此程序需要完成如下要求:在这所房子里,从任意一个房间开始,按照开门的方向,均能够找到一个合适的路线,使得一个人能够不重复的到达其他的每一个房间,所以,需以每一个房间都为一次起始点来走向其他的房间,以此来判断这所房子里的任意两个房间之间是否互相相通。

实现本程序需要解决以下问题:1.如何表示每一个房间,即存储房间的信息,并且还要确定这所房子里的各个房间的位置。

2.各个房间之间的门,以及门是从哪个房间开向哪个房间的该如何表示和存储的。

3.从某一个房间开始,如何走到其他各个房间,即如何对房间进行遍历。

4.为了在遍历过程中,不重复的遍历每一个房间,该如何标记已被遍历过的房间,从而只访问未走过的房间。

5.最后通过什么的遍历方式才能判断各个房间之间是否互相相通。

数据结构的选择和概要设计通过对题目要求的理解,我们可以用图来表示这所房子,而房子中的各个房间就相当于图中的各个结点,由于房间的门是有方向的,一扇从a开向b的门是不能让一个人从b房间走到a 房间的,从而可知该图为有向图,那么门就相当于有向图中的弧,从一个门开向另一个门即代表有向图中弧的起始点和终止点。

对于图的存储,我采用邻接表的形式来存储,并将每一个房间进行编号,对于邻接表,则需要定义一个邻接表结点类型、邻接表表头结点类型,通过表头与结点的连接而将有向图中弧的信息存储起来。

那么人从任意一个房间走向另一个房间,即相当于有向图中从一个结点按照弧的信息访问其他的结点,可以采用深度优先搜索遍历。

如果从每一个结点以起始点开始一次遍历就都能访问到其他结点的话则说明有向图是连通图,即该房子里的各个房间能够互相相通。

数据结构与算法课程设计报告

数据结构与算法课程设计报告

合肥学院计算机科学与技术系课程设计报告2012 ~2013 学年第 2 学期课程数据结构与算法设计课程设计课程设计名称欧拉回路学生姓名陶飞学号1104012039专业班级计算机科学与技术11级3班指导教师李红,何立新,华珊珊,陈艳平2013 年 3月题目:欧拉回路是指不令笔离开纸面,可画过图中每条边仅一次,且可以回到起点的一条回路。

现给定一个图,问是否存在欧拉回路?一.问题分析和任务定义:题目要求判断一个给定的图中是否存在欧拉回路。

由欧拉图的定义,当一个图存在欧拉回路时,该图称为欧拉图。

题目问是否存在欧拉回路即等价于问给定的图是否为欧拉图。

所以,证明给定图是欧拉图就说明该图存在欧拉回路,否则不存在欧拉回路。

根据高等教育出版社出版屈婉玲、耿素云、张立昂主编的《离散数学》P.296定理15.1可知:无向图G是欧拉图当且仅当G是连通图且没有奇度顶点。

要证明一个给定的图是否为欧拉图,证明给定的图是连通图且没有奇度顶点即可。

所以,解决题目中的问题就转化为证明给定图是否是连通图且没有奇度顶点。

首先要确定一给定的图是否为连通图。

这里我们可以通过图的深度优先搜索遍历确定。

从任意顶点出发,如果能深度优先遍历到所有的顶点就说明图中所有的顶点都是连图的即为连通图。

然后再确定给定的图是否没有奇度顶点。

我们可以以邻接矩阵的形式存储给定的图,对邻接矩阵的每行分别行进行扫描,记录每个顶点的度数,当每行扫描完后判断该顶点的度数是否为奇数,存在奇度顶点直接结束扫描,说明存在奇度顶点,给定图不是欧拉图。

即不存在欧拉回路。

否则继续扫描,当扫描完所有的行没有发现奇度顶点,即说明给定图没有奇度顶点。

当上述两个问题都确定以后根据定理,当且仅当给定图为连通图且没有奇度顶点时给定的图为欧拉图。

由此可确定,给定的图是否存在欧拉回路。

二.数据结构的选择与概要设计:1.数据结构的选择:图在我们所学的数据结构与算法课程中有四种存储方式:邻接矩阵、邻接表、十字链表和邻接多重表。

数据结构与算法课程设计

数据结构与算法课程设计

数据结构与算法课程设计1. 引言数据结构与算法是计算机科学专业的核心课程之一,也是所有程序员必须掌握的基本技能。

本文将介绍一个基于数据结构与算法的课程设计,旨在提高学生的编程能力和解决问题的能力。

2. 选题背景数据结构和算法是计算机科学的核心概念,它们对于编写高效的程序非常重要。

在现实世界中,数据结构和算法被应用于许多重要场景,如搜索引擎、人工智能、图像处理等。

因此,通过学习数据结构与算法的基本原理和实践经验,可以提高学生的编程能力和解决问题的能力。

3. 选题目标本课程设计的目标是让学生了解数据结构和算法的基本概念,并掌握一些常用的算法和数据结构的实现方法。

通过实践,学生将学会如何用数据结构和算法解决一些常见的问题,提高编程能力和解决问题的能力。

4. 课程内容本课程设计包括以下内容:4.1 算法基础本节讲授算法的基本原理,包括时间和空间复杂度分析、递归和分治算法、贪心算法、动态规划算法等。

4.2 数据结构基础本节讲授数据结构的基本原理,包括数组、栈、队列、链表、树、图等。

4.3 常用算法和数据结构的实现本节讲授常用算法和数据结构的实现方法,包括排序算法、查找算法、哈希表、堆、二叉搜索树等。

4.4 综合实验本节将通过一个综合实验,让学生应用所学的知识,实现一个小型应用程序,并测试其性能和稳定性。

5. 课程教学方法本课程将采用以下教学方法:5.1 理论授课课程将在课堂上进行理论讲解,介绍相关的概念和技术。

5.2 代码演示通过代码演示方式,让学生了解如何实现算法和数据结构。

5.3 实践训练通过实践训练,让学生独立实现算法和数据结构,并掌握其实现方法。

5.4 自主学习学生需要在课后自主学习相关的知识和技术,并实践运用。

6. 评分标准本课程设计的评分标准如下:6.1 综合报告学生需要提交一份综合报告,包括掌握的算法和数据结构的实现、应用到的场景、遇到的问题和解决方法等。

该报告占总成绩的30%。

6.2 代码质量学生需要根据实验要求独立完成代码,代码质量要达到一定的水平。

数据结构与算法课程设计

数据结构与算法课程设计

数据结构与算法课程设计数据结构与算法是计算机科学中非常重要的一门课程,它涉及到如何在计算机中存储和组织数据,以及如何设计高效的算法来操作这些数据。

在本次课程设计中,我们将着重介绍以下几个主题:树和图的应用、排序算法和搜索算法。

首先,我们将学习树和图的应用。

树和图是一种常见的数据结构,广泛应用于各个领域,如网络路由、组织结构等。

在本次课程设计中,我们将设计一个树结构来表示一个公司的组织结构。

每个节点表示一个员工,节点之间的关系表示员工之间的上下级关系。

我们将实现一些基本操作,如插入节点、删除节点和查找节点等,并使用这些操作来管理公司的组织结构。

其次,我们将学习排序算法。

排序是一种常见的算法操作,用于将一组数据按照特定的顺序进行排列。

在本次课程设计中,我们将实现几种经典的排序算法,如冒泡排序、插入排序和快速排序等。

我们将比较这些排序算法的性能,并分析它们的时间复杂度和空间复杂度。

此外,我们还将介绍一些高级的排序算法,如归并排序和堆排序,以及它们的应用场景。

最后,我们将学习搜索算法。

搜索算法用于在一个数据集中查找特定的元素或解决某个问题。

在本次课程设计中,我们将实现两种常见的搜索算法:线性搜索和二分搜索。

线性搜索是一种简单的搜索算法,它逐个比较数据集中的元素,直到找到目标元素或搜索完所有元素。

二分搜索是一种更高效的搜索算法,它利用有序数据集的特性,将搜索范围缩小一半,以快速定位目标元素。

我们将比较这两种搜索算法的性能,并讨论它们的适用场景。

通过本次课程设计,我们将深入理解数据结构与算法的基本概念和原理,并学会应用它们解决实际问题。

这将有助于提升我们的编程能力和算法思维,为以后的学习和工作打下坚实的基础。

总结起来,本次课程设计将涉及树和图的应用、排序算法和搜索算法三个主题。

通过设计和实现相关的数据结构和算法,我们将深入学习它们的原理和应用,提升我们的编程能力和算法思维。

通过这个课程设计,我们将掌握以下几个方面的知识和技能:1. 数据结构:我们将学习不同类型的数据结构,如树和图,并了解它们的特性、操作和应用场景。

数据结构与算法课程设计

数据结构与算法课程设计

数据结构与算法 课程设计一、课程目标知识目标:1. 理解数据结构的基本概念,掌握常用的数据结构,如线性表、栈、队列、树和图等;2. 掌握基本的算法设计与分析技巧,包括排序、查找、递归和贪心算法等;3. 学会运用数据结构与算法解决实际问题,培养问题求解能力。

技能目标:1. 能够运用所学数据结构,构建合适的数据模型,提高数据处理和分析能力;2. 能够编写清晰、高效的算法代码,具备一定的编程实践能力;3. 能够运用算法分析工具,对算法性能进行评估,提高算法优化能力。

情感态度价值观目标:1. 培养学生对数据结构与算法的兴趣,激发学习热情,形成积极向上的学习态度;2. 培养学生的团队协作意识,提高沟通与协作能力,学会共同解决问题;3. 培养学生的创新意识,鼓励学生敢于尝试、勇于探索,形成独立思考的习惯。

课程性质分析:本课程为计算机科学与技术相关专业的核心课程,旨在培养学生掌握数据结构与算法的基本知识,提高编程实践能力和问题求解能力。

学生特点分析:学生为高中二年级学生,具有一定的编程基础和逻辑思维能力,对数据结构与算法有一定了解,但实践经验不足。

教学要求:1. 注重理论与实践相结合,提高学生的动手实践能力;2. 采用案例教学,引导学生学会运用所学知识解决实际问题;3. 关注学生个体差异,因材施教,提高学生的综合素质。

二、教学内容1. 数据结构基本概念:介绍数据结构的基本概念、作用和分类,结合课本第一章内容,让学生了解各类数据结构的特点和应用场景。

2. 线性表:讲解线性表的定义、特点及实现方法,结合课本第二章,学习数组、链表等线性表结构及其操作。

3. 栈与队列:学习栈、队列的基本概念、操作及应用,参照课本第三章,掌握栈、队列的实现方法及其应用场景。

4. 树与二叉树:介绍树、二叉树的基本概念、性质及遍历方法,结合课本第四章,学习二叉树、线索二叉树、堆等树结构及其应用。

5. 图:学习图的表示方法、遍历算法及最短路径算法,参考课本第五章,掌握图的相关概念及算法。

数据结构与算法课程设计报告

数据结构与算法课程设计报告

数据结构与算法课程设计报告摘要:本文是对数据结构与算法课程设计的报告,主要介绍了课程设计的目标、设计思路和实现过程。

通过该课程设计,学生能够加深对数据结构和算法的理解,提高编程能力和问题解决能力。

本文详细介绍了课程设计的背景和需求分析,然后提出了设计思路和方案,并对具体实现进行了详细的说明和分析。

最后,总结了课程设计的收获和不足之处,并提出了改进的建议。

关键词:数据结构,算法,课程设计,设计思路,实现过程第一部分:引言1.1 背景数据结构和算法是计算机科学中非常重要的基础知识,对于软件开发和问题解决都起着至关重要的作用。

因此,数据结构与算法课程设计作为计算机科学专业的核心课程之一,对于学生的学习和培养具有重要意义。

1.2 需求分析本课程设计的目标是通过实际的项目开发,让学生深入理解数据结构和算法的原理,并能够灵活运用于实际问题的解决中。

具体需求如下:学生能够选择合适的数据结构和算法来解决实际问题。

学生能够设计和实现基于数据结构和算法的算法。

学生能够分析和评估算法的效率和性能。

第二部分:设计思路与方案2.1 设计思路本课程设计的设计思路是通过实际的项目开发来实现学生对数据结构和算法的深入理解。

项目的选择应该能够涵盖多种数据结构和算法的应用,并且能够充分体现算法的效率和性能优化。

2.2 设计方案基于上述设计思路,我们选择了一个图论相关的项目作为课程设计的实践项目。

该项目涉及到图的表示和遍历、最短路径算法以及最小生成树算法等多个知识点。

学生需要设计和实现一个图的数据结构,并能够基于该数据结构实现相关的算法。

第三部分:具体实现与分析3.1 图的数据结构设计与实现为了表示一个图,我们选择了邻接表作为数据结构的实现方式。

邻接表能够有效地表示图的结构,并且支持图的遍历和算法的实现。

通过链表的方式,每个节点可以存储与其相邻的节点信息。

此外,我们还设计了相关的操作函数,包括添加节点、添加边、删除节点和删除边等。

3.2 最短路径算法实现与分析在设计最短路径算法时,我们采用了Dijkstra算法作为实现的基础。

《数据结构和算法设计》实验报告

《数据结构和算法设计》实验报告

《数据结构与算法设计》实验报告——实验二一、实验目的按照四则运算加、减、乘、除、幂(^)和括号的优先关系和惯例,编写计算器程序。

二、实验内容简单计算器。

请按照四则运算加、减、乘、除、幂(^)和括号的优先关系和惯例,编写计算器程序。

要求:①从键盘输入一个完整的表达式,以回车作为表达式输入结束的标志。

②输入表达式中的数值均为大于等于零的整数。

中间的计算过程如果出现小数也只取整。

例如,输入:4+2*5= 输出:14输入:(4+2)*(2-10)= 输出:-48三、程序设计概要设计1、宏定义#define TRUE 1#define FALSE 0#define OK 1#define ERROR 02、基本函数:(1)void InitStack_char(SqStack *S) //char型栈初始化(2)void InitStack_int(sqStack *S) //int型栈初始化(3)void Push_char(SqStack *S,char ch) //char型元素进栈(4)void Push_int(sqStack *S,int num) //int型元素进栈(5)char GetTop_char(SqStack *S) //取char型栈顶元素(6)int GetTop_int(sqStack *S) //取int型栈顶元素(7)Status In(char c) //判断是否为运算符,若是运算符则返回,否则返回(8)char Precede(char a,char b) //判断两运算符的先后次序(9)Status Pop_char(SqStack *S,char &x) //char型栈出栈(10)Status Pop_int(sqStack *S,int &x) //int型栈出栈(11)int Operate(int a,char theta,int b) //计算a和b运算结果3、流程图详细设计数据类型typedef struct node //构造char型栈{char ch;struct node *next;}node;typedef struct{struct node *base;struct node *top;}SqStack;typedef struct lnode //构造int型栈{int num;struct lnode *next;}lnode;typedef struct{struct lnode *base;struct lnode *top;}sqStack;操作部分void InitStack_char(SqStack *S){S->base = (node *)malloc(sizeof(node));S->base->next=NULL;S->top = S->base;} //char型栈初始化void InitStack_int(sqStack *S){S->base = (lnode *)malloc(sizeof(lnode));S->base->next=NULL;S->top = S->base;} //int型栈初始化void Push_char(SqStack *S,char ch){node *p;p=(node*)malloc(sizeof(node));p->ch=ch;p->next=S->top;S->top=p;} //char型元素进栈Status Push_int(sqStack *S,int num){lnode *p;p=(lnode*)malloc(sizeof(lnode));p->num=num;p->next=S->top;S->top=p;return OK;} //int型元素进栈char GetTop_char(SqStack *S){return (S->top->ch);} //取char型栈顶元素int GetTop_int(sqStack *S){return (S->top->num);} //取int型栈顶元素Status Pop_char(SqStack *S,char &x){if(S->base == S->top)return ERROR;node *p;p=S->top;x=p->ch;S->top=p->next;free(p);return OK;} //char型栈出栈Status Pop_int(sqStack *S,int &x){if(S->base == S->top)return ERROR;lnode *p;p=S->top;x=p->num;S->top=p->next;free(p);return OK;} //int型栈出栈计算功能int Operate(int a,char theta,int b){int i,z = 1;switch(theta){case '+':z = (a + b);break;case '-':z = (a - b);break;case '*':z = (a * b);break;case '/':z = (a / b);break;case '^':for(i = 1;i<=b;i++)z = z*a;break;}return (z);} //计算a和b运算结果Status In(char c){if(c=='+'||c=='-'||c=='*'||c=='/'||c=='('||c==')'||c=='='||c=='^') return OK;elsereturn ERROR;} //判断是否为运算符char Precede(char a,char b){if(a=='+'||a=='-'){if(b=='+'||b=='-'||b==')'||b=='=')return '>';elsereturn '<';}if(a=='*'||a=='/'){if(b=='('||b=='^')return '<';elsereturn '>';}if(a=='('){if(b==')')return '=';elsereturn '<';}if(a==')'){if(b!='(')return '>';}if(a=='#'){if(b=='=')return '=';elsereturn '<';}if(a=='^')return ('>');} //判断两运算符的先后次序主函数int main() //主函数{char c,x,theta;int a,b,c1; //定义变量SqStack OPTR; //定义字符栈sqStack OPNR; //定义整型栈InitStack_char(&OPTR); //初始化InitStack_int(&OPNR); //初始化Push_char(&OPTR,'#'); //将字符型栈底设为#c = getchar(); //从键盘输入得到字符while(c!='='||GetTop_char(&OPTR)!='#') //判定是否执行循环if(!In(c)){c1 = 0;while(!In(c)){c1 = c1*10+c-'0';c = getchar();}Push_int(&OPNR,c1);} //当扫描字符不是运算符时,转化为整型数存入栈中else{switch(Precede(GetTop_char(&OPTR),c)) //判定运算符的优先关系{case '<':Push_char(&OPTR,c);c = getchar();break; //当前运算符优先级高,存入char栈case '=':Pop_char(&OPTR,c);c = getchar();break; //运算符次序相等,存入char栈case '>': //当前运算符优先级低Pop_char(&OPTR,theta);Pop_int(&OPNR,b);Pop_int(&OPNR,a);Push_int(&OPNR, Operate(a,theta,b));//计算运算结果,并存入int栈break; //继续循环}}printf("%d\n",GetTop_int(&OPNR)); //计算完成,取出int栈顶元素,并输出return 0;}四、程序调试分析编写程序的过程中遇到了很多的问题,最突出的两个问题就是整数和两位数的运算处理,一开始修改了主函数部分之后,原来可以执行一位数运算的程序出现了error,由于没有及时保存,并且之前的代码无法恢复,只得重新编写一次。

数据结构与算法课程设计报告--教学计划编制

数据结构与算法课程设计报告--教学计划编制

数据结构与算法课程设计报告题目:教学计划编制目录一、需求分析 (3)1.1系统概述 (3)1.1.1研究背景 (3)1.1.2研究意义及目的 (3)1.2具体分析 (4)1.2.1功能需求分析 (4)1.2.2运行环境 (4)二、总体设计 (5)三、数据储存结构的设计 (6)3.1 采用邻接表的方式储存先修关系图 (6)3.2 邻接表储存的代码实现 (6)3.2.1 数据结构设计 (6)3.2.2 AOV图的创建代码 (7)四、功能实现算法设计 (9)4.1 拓扑排序算法设计 (9)4.2 获取各个顶点的入度算法设计 (11)4.3 分类型输出算法设计 (11)五、程序代码 (12)六、运行结果 (20)七、课程设计总结 (22)教学计划编制问题课程设计报告一、需求分析1 .1系统概述1.1.1研究背景大学的每个专业都要制定教学计划。

假设任何专业都有固定的学习年限,每学年含两学期,每学期的时间长度和学分上限值均相等。

每个专业开设的课程都是确定的,而且课程在开设时间的安排必须满足先修关系。

每门课程有哪些先修课程是确定的,可以有任意多门,也可以没有。

每门课恰好占一个学期。

试在这样的前提下设计一个教学计划编制程序。

1.1.2研究意义及目的具体说来,教学计划编制是以课程先修关系为基础,分析教学中的问题和需要,确定教学目标,建立解决问题的步骤,合理组合和安排各种教学要素,为优化教学效果而制定实施方案的系统的计划过程。

由此可以看出,教学设计的过程实际上就是为教学活动制定蓝图的过程。

通过教学设计,教师可以对教学活动的基本过程有个整体的把握,可以根据教学情境的需要和教育对象的特点确定合理的教学目标,选择适当的教学方法、教学策略,采用有效的教学手段,创设良好的教学环境,实施可行的评价方案,从而保证教学活动的顺利进行。

另外,通过教学设计,教师还可以有效地掌握学生学习的初始状态和学习后的状态,从而及时调整教学策略、方法,采取必要的教学措施,为下一阶段的教学奠定良好基础。

数据结构与算法课程设计报告

数据结构与算法课程设计报告

数据结构与算法分析课程设计报告课题名称: 1. txt编译器2. 带括号的算术表达式求值3. Huffman编码(二叉树用)4. 课表拓扑排序提交文档学生姓名:提交文档学生学号:同组成员名单:指导教师姓名:指导教师评阅成绩:指导教师评阅意见:..提交报告时间:2013年 1月 6日实验一:1.实验的目的和要求:<1>采用C++的ASCII码文件和串函数实现;<2>熟练掌握串运算的应用;<3>熟练掌握计算机系统的基本操作方法,了解如何编辑、编译、链接和运行一个C++程序;<4>上机调试程序,掌握查错、排错使程序能正确运行。

2.实验的环境:●硬件环境: Windows XP操作系统●软件环环境:Microsoft Visual Studio C++6.03.算法描述:●类的层次结构EditorNext_line();goto_line();insert_line();substitute_line();change_line();read_file();write_line();find_string();●测试程序说明按行读取文件->显示文本内容->删除指定行->在指定行插入->显示指定行内容4.源程序清单:(程序文字:6号字体,行距12磅)#include <iostream>#include <string>#include <fstream>#include <cmath>#include <cstdlib>using namespace std;/*链表的节点。

保存文件中一行的内容*/struct Line{int id;string content;struct Line* next;};class TextEditor{public:// 文件中一行最多的字符数enum{MAX_SIZE_PER_LINE = 10000};/*构造函数参数:fileName 文件路径*/TextEditor(string fileName);/*打印文件内容*/void print();/*保存文件*/void save();/*为文件增加一行参数:lineIndex 要增加的行所在行号content 要增加的行的内容返回:添加成功返回 true ,否则返回 false*/bool addLine(int lineIndex,string content);/*为文件删除一行参数:lineIndex 要删除的行所在行号返回:删除成功返回 true ,否则返回 false*/bool deleteLine(int lineIndex);/*为文件修改一行参数:lineIndex 要修改的行所在行号content 要修改的行的修改后的内容返回:修改成功返回 true ,否则返回 false*/bool modifyLine(int lineIndex,string content);/*搜索文件中的行参数:keyword 要搜索的行含有的关键字返回:搜索结果,是一个链表*/struct Line * searchLines(string keyword);/*查询文件的总行数返回:文件的总行数*/int getNumOfLines();private:// 文件路径string fileName;// 链表形式,按行存储文件在内存中struct Line * artical;};TextEditor::TextEditor(string fileName){this->fileName = fileName;this->artical = NULL;ifstream fin(this->fileName.c_str());if(fin){int lineId = 0;struct Line * pr, *p;char *buffe = new char[MAX_SIZE_PER_LINE+1];while(!fin.eof()){p = new struct Line();// 生成行号p -> id = ++ lineId;// 文件读入行内容fin.getline(buffe,MAX_SIZE_PER_LINE);p -> content = string(buffe);// 初始化指针p -> next = NULL;// 添加新的一行(新的节点)if(this->artical == NULL){this->artical = p;pr = p;}else{pr -> next = p;pr = p;}}}fin.close();}void TextEditor::print(){struct Line *p = this->artical;// 输出的行号的宽度int lineIdWidth = (int)log10(this->getNumOfLines()) + 1;while(p){// 设置行号输出的宽度cout.width(lineIdWidth);cout << (p -> id) << " : " << (p -> content) << endl;p = p -> next;}}void TextEditor::save(){ofstream fout(this->fileName.c_str());if(fout){struct Line *p = this->artical;while(p){fout << p->content;// 不是最后一行,输出一个换行符号if(p -> next != NULL){fout << endl;}p = p->next;}}fout.close();}bool TextEditor::addLine(int lineIndex,string content){int numOfLines = this->getNumOfLines();// 要插入新行的位置不合法if(lineIndex < 1 || lineIndex > (numOfLines+1)){return false;}else{// 新行struct Line * newLine = new struct Line();// 生成行号newLine -> id = lineIndex;// 行内容newLine -> content = content;// 初始化指针newLine -> next = NULL;if(this->artical == NULL){this->artical = newLine;}else{struct Line * pr = this->artical , *p = pr ;// 找到要插入行的位置while(p && (lineIndex > p->id )){pr = p;p = p -> next;}// 插入第一行特别处理if(lineIndex == 1){p = newLine -> next = this -> artical;this -> artical = newLine;}else{p = newLine -> next = pr -> next;pr -> next = newLine;}// 更改插入行之后所有行的行号while(p){p -> id ++;p = p -> next;}}return true;}}bool TextEditor::deleteLine(int lineIndex){int numOfLines = this->getNumOfLines();// 要删除行的位置不合法if(lineIndex < 1 || lineIndex > numOfLines){return false;}else{struct Line * pr = this->artical , *p = pr ;// 找到要删除行的位置while(p && (lineIndex != p->id )){pr = p;p = p -> next;}// 删除第一行要特别处理if(lineIndex == 1){this -> artical = p -> next;free(p);p = this -> artical;}else{pr -> next = p -> next ;free(p);p = pr -> next;}// 更改删除行之后所有行的行号while(p){p -> id --;p = p -> next;}return true;}}bool TextEditor::modifyLine(int lineIndex,string content){int numOfLines = this->getNumOfLines();// 要修改行的位置不合法if(lineIndex < 1 || lineIndex > numOfLines){return false;}else{struct Line * pr = this->artical , *p = pr ;// 找到要修改行的位置while(p && (lineIndex != p->id )){pr = p;p = p -> next;}// 修改行的内容p -> content = content ;return true;}}struct Line * TextEditor::searchLines(string keyword){struct Line * p = this->artical ,*pr ,*searchResult = NULL ;while(p){// 当前行含有要搜索的关键字if(p -> content.find(keyword) != string::npos){// 生成一个匹配项struct Line * matchLine = new struct Line();matchLine -> id = p -> id;matchLine -> content = p -> content;matchLine -> next = NULL;// 添加到第一条搜素结果要特殊处理if(searchResult == NULL){searchResult = matchLine;pr = matchLine;}else{pr -> next = matchLine;pr = matchLine;}}p = p -> next;}return searchResult;}int TextEditor::getNumOfLines(){int numOfLines = 0;struct Line *p = this->artical;while(p){numOfLines++;p = p->next;}return numOfLines;}int main(int argc, char *argv[]){// 菜单while(1){/*第一级菜单*/cout<<"[B/b] B E G I N"<<endl;cout<<"[Q/q] Q U I T "<<endl;char ch_1;cin >> ch_1;switch(ch_1){case 'B':case 'b':{system("cls");cout<<"Welcom To My Editor"<<endl;cout << "Please input the file name:";string fileName;cin >> fileName;TextEditor textEditor(fileName);system("cls");// 输出文件内容//textEditor.print();while('B'||'b'){/*第二级菜单*/cout << endl;cout<<"---------[A/a] Add ------"<<endl;cout<<"---------[D/d] Del ------"<<endl;cout<<"---------[M/m] Modify ------"<<endl;cout<<"---------[S/s] Search ------"<<endl;cout<<"---------[R/r] Read ------"<<endl;cout<<"---------[H/h] Help ------"<<endl;cout<<"---------[B/b] Back ------"<<endl;char ch_2;cin >> ch_2;switch(ch_2){// 添加行case 'A':case 'a':{system("cls");cout << "Please input the linenum:[1~" << (textEditor.getNumOfLines()+1) << "] :";int lineIndex;cin >> lineIndex;cout << "Please input the content:" ;string content;cin >> content;if(textEditor.addLine(lineIndex,content)){cout << "Done!"<<endl;}else{cout << "Fall!"<<endl;}break;}// 删除行case 'D':case 'd':{system("cls");cout << "Please input the linenum[1~" << textEditor.getNumOfLines() << "] :";int lineIndex;cin >> lineIndex;if(lineIndex > textEditor.getNumOfLines()){cout<<"Errors: invalid linenum!"<<endl;}else{if(textEditor.deleteLine(lineIndex)){cout << "Done!"<<endl;}else{cout << "Fall!"<<endl;}}break;}// 修改行case 'M':case 'm':{system("cls");cout << "Please input the linenum[1~" << textEditor.getNumOfLines() << "] :";int lineIndex;cin >> lineIndex;if(lineIndex > textEditor.getNumOfLines()){cout<<"Errors: invalid linenum!"<<endl;}else{cout << "Please input the content:" ;string content;cin >> content;if(textEditor.modifyLine(lineIndex,content)){cout << "Done!"<<endl;}else{cout << "Fall!"<<endl;}}break;}// 搜索行case 's':case 'S':{system("cls");cout << "Please input the keyword:";string keyword;cin >> keyword;// 搜索行struct Line * searchResult = textEditor.searchLines(keyword) ,*p = searchResult;// 输出搜索结果cout << "search result:"<< endl;while(p){cout << p->id << " : " << endl << p->content << endl;p = p -> next;}break;}// 打印文件case 'R':case 'r':{system("cls");textEditor.print();break;}// 返回case 'H':case 'h':{system("cls");cout<<"Add : To add a line "<<endl;cout<<"Del : To delete a line"<<endl;cout<<"Modify : To modify a line"<<endl;cout<<"Search : To output a line which has the keyword"<<endl;cout<<"Read : San the file"<<endl;cout<<"Back : Back to the top"<<endl;break;}case 'B':case 'b':{system("cls");textEditor.save();break;}// 选择错误default:{system("cls");cout<<"Errors: invalid command"<<endl;break;}} // end switch// 从二级菜单返回一级菜单if(ch_2 == 'B'||ch_2 == 'b'){break;}}// end while(1)break;}case 'Q':case 'q':{exit(0);break;}default:{cout<<"Errors: invalid command"<<endl;break;}}}return 0;}5.运行结果:6.实验运行情况分析(包括算法、运行结果、运行环境等问题的总体讨论)。

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

《数据结构与算法》课程设计报告实验人:计算机科学与技术(软件开发方向)计软05-3 刘显明学号:0504030312一、设计题目:停车场管理二、问题描述:设停车场是一个可停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。

汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在南端,最先到达的第一辆车停放在停车场的最北端),若停车场内已停了n辆汽车,则后来的汽车只能在门外的通道上等候,一旦有车开走,收排在通道上的第一辆车即可开入;当停车场内每辆车要离开时,在它之后进入的车辆必须先退出停车场为其让路,待该辆车开出大门,其他车辆再按原次序进入停车场,每辆停放在停车场的车在它离开停车场时必须按它停留在停车场内的时间长短交纳停车费。

试为停车场编写按上述要求进行管理的模拟程序。

三、基本要求:以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟管理。

每一组输入数据包括三个数据项:汽车"到达"或"离去"信息,汽车牌照号码以及到达或离去的时刻。

对每一组输入数据进行操作后的输出信息为:若是在停车场内停留的时间和应交纳的费用(在便道上停留的时间不收费)。

栈以顺序结构实现,队列以链表结构实现。

四、测试数据:设n=2,输入数据:('A',1,5),('A',2,15),('D',1,15),('A',3,20),('A',4,25),('A',5,30),('D',2,35),('D',4,40),('E',0,0)。

其中:'A'表示到达(arrival);'D'表示离去(departure);'E'表示输出(end)。

五、实现提示:需要另设一个栈,临时停放为给要离去的汽车让路而从停车车退出来的汽车,也用顺序存储结构实现。

输入数据按到达的时刻有序。

栈中每个元素表示一辆汽车,包含两个数据项:汽车的牌照号码和进入停车车的时刻。

六、需求分析:(1)以顺序栈来表示停车场,限定停车场的容量n。

以链队列来表示便道。

限制以实型变量money来存放停车场费率。

(2)按照从终端读入的数据序列进行模拟管理。

每辆车需要三个数据,其中车辆数据为:A表示到达,D表示离去,E表示程序结束。

车辆牌照为整型数据。

进场或离场时间同样为整型数据。

(3)对每一组输入数据进行操作后的输出信息为:若是车辆到达,则输出汽车在停车场内或便道上的停车位置;若是车辆离去,则输出汽车在停车场内停留的时间和应交纳的费用(在便道上停留的时间不收费)。

(4)该程序可以模拟停车场的管理过程。

(5)测试数据:设n=2,输入数据:('A',1,5),('A',2,15),('D',1,15),('A',3,20),('A',4,25),('A',5,30),('D',2,35),('D',4,40),('E',0,0)。

其中:'A'表示到达(arrival);'D'表示离去(departure);'E'表示输出(end)。

七、概要设计:1.设定栈的抽象数据类型定义为:ADT stack{数据对象:D={ai|ai∈charset,I=1,2,……,n,n>=0}数据关系:R1={<ai-1,ai>ai-1,ai∈D,I=2……,n}基本操作:Initstack(&S)操作结果:构造一个空栈S。

DestroyStack(&S)初始条件:栈S已经存在。

操作结果:操作结果:销毁栈S。

ClaerStack(&S)初始条件:栈S已经存在。

操作结果:将S清空为空栈。

StackLength(&S)初始条件:栈S已经存在。

操作结果:返回栈S的长度。

StackEmpty(&S)初始条件:栈S已经存在。

操作结果:若S为空栈,则返回TURE,否则返回FALSE。

GetTop(S,&e)初始条件:栈S已经存在。

操作结果:若栈S不空,则以e返回栈顶元素。

Push(&S,e)初始条件:栈S已经存在。

操作结果:在栈S的栈顶插入新的栈顶元素e。

Pop(&S,&e)初始条件:栈S已经存在。

操作结果:删除S的栈顶元素,并以e返回其值。

StackTraverse(S,visit())初始条件:栈S已经存在。

操作结果:从栈底到栈顶依次对S中的每个元素调用函数visit( )。

}ADT stack2.设定链式队列的抽象数据类型为:typedef struct Qnode{QelemType data;Struct Qnode *next;}Qnode,*QueuePtr;typedef struct{QueuePtr front; //队头指针QueuePtr rear; //队尾指针ADT Queue{数据对象:D={ai|ai∈ElemSet,i=1,2,……,n,n>=0}数据关系:R1={<ai-1,ai>|ai-1,ai∈D,i=2,……,n}约定其中端为队列头,端为队列尾。

基本操作:InitQueue(&Q)操作结果:构造一个空队列Q。

DestroyQueue(&Q)初始条件:队列Q已经存在。

操作结果:队列Q被销毁,不再存在。

ClearQueue(&Q)初始条件:队列Q已经存在。

操作结果:将Q清为空队列。

QueueEmpty(Q)初始条件:队列Q已经存在。

操作结果:若Q为空队列,则返回TRUE,否则FALSE。

QueueLength(Q)初始条件:队列Q已经存在。

操作结果:返回Q的元素个数,即队列的长度。

GetHead(Q,&e)初始条件:Q为非空队列。

操作结果:用e返回的e队头元素。

EnQueue(&Q,e)初始条件:队列Q已经存在。

操作结果:插入元素e为Q的新的队尾元素。

DeQueue(&Q,&e)初始条件:Q为非空队列。

操作结果:删除Q的队头元素,并用e返回其值。

QueueTraverse(Q,visit())初始条件:Q已经存在且非空。

操作结果:从队头到队尾,依次对Q的每个数据元素调用函数visit()。

一旦visit()失败,则操作失败。

}ADT Queue3.本程序有4个模块1)主程序模块main(){初始化while(命令=="1"){接受命令;/*绘表*/do{命令;}while(重复条件)if(条件){if(条件){接受命令;处理命令;for(初始值;循环条件;自加运算){for(初始值;循环条件;自加运算)}else if{接受命令;处理命令;}}if(条件){接受命令;处理命令;do{命令;}while(循环条件){接受命令;处理命令;}else{接受命令;退出程序;}}2)2个栈模块-----实现栈抽象数据类型3)队列模块----实现队列抽象数据类型各模块之间的调用关系:主程序模块栈模块队列模块八、详细设计:1.求停车车管理的详细算法#include "stdio.h"#include "alloc.h"#include "stdlib.h"/*#define NULL 0*/#define ERROR 0#define OK 1#define OVERFLOW 0#define STACK_INIT_SIZE 2/*车库容量*//*----------------------------------------------------------------------*/ typedef struct time{int hour;int min;}Time; /*时间结点*//*----------------------------------------------------------------------*/ typedef struct/*车信息*/{char label;float time;}Car,Car2;typedef struct/*车库信息*/{Car *top;Car *base;int stacksize;}SqStack;int InitStack(SqStack *S){S->base=(Car *)malloc(STACK_INIT_SIZE*sizeof(Car)); if(!(S->base)) return ERROR;S->top=S->base;S->stacksize=STACK_INIT_SIZE;return OK;}int StackEmpty(SqStack S){if(S.top==S.base)return OK;elsereturn ERROR;}int StackFull(SqStack S){if(S.top-S.base>=STACK_INIT_SIZE)return OK;elsereturn ERROR;}int Push(SqStack *S,Car e){if(S->top-S->base>=STACK_INIT_SIZE)return OVERFLOW;else{*(S->top++)=e;return OK;}}int Pop(SqStack *S,Car *e){if(S->top==S->base)return ERROR;*e=*(--(S->top));}/*----------------------------------------------------------------*/ typedef struct/*备用车道*/{Car2 *top2;Car2 *base2;int stacksize2;}SqStack2;int InitStack2(SqStack2 *S2){S2->base2=(Car2 *)malloc(STACK_INIT_SIZE*sizeof(Car2));if(!(S2->top2)) return ERROR;S2->top2=S2->base2;S2->stacksize2=STACK_INIT_SIZE;return OK;}int Push2(SqStack2 *S2,Car2 e2){if(S2->top2-S2->base2>=STACK_INIT_SIZE)return OVERFLOW;*(S2->top2++)=e2;return OK;}int Pop2(SqStack2 *S2,Car2 *e2){if(S2->top2==S2->base2)exit(OVERFLOW);*e2=*(--(S2->top2));return OK;}int StackEmpty2(SqStack2 S2){if(S2.top2==S2.base2)return OK;elsereturn ERROR;}/*--------------------------------------------------------------------*/ typedef struct QNode/*车道信息*/{Car data;struct QNode *next;}QNode,*QueuePtr;typedef struct{QueuePtr front;QueuePtr rear;}LinkQueue;int InitQueue(LinkQueue *Q){Q->front=Q->rear=(QueuePtr)malloc(sizeof(QNode)); if(!(Q->front)) return ERROR;Q->front->next=NULL;return OK;}int EnQueue(LinkQueue *Q,Car e){QueuePtr p;p=(QueuePtr)malloc(sizeof(QNode));if(!p) return ERROR;p->data=e;p->next=NULL;Q->rear->next=p;Q->rear=p;return OK;}int QueueEmpty(LinkQueue Q){if(Q.front==Q.rear)return OK;elsereturn ERROR;}int DeQueue(LinkQueue *Q,Car *e){QueuePtr p;if(Q->front==Q->rear) return ERROR;p=Q->front->next;*e=p->data;Q->front->next=p->next;if(Q->rear==p)Q->rear=Q->front;free(p);return OK;}/*-----------------------------------------------------------------------*/ /*主函数*/main(){int i,position_s=1,position_q=1;int ch=1,status;float time,money;LinkQueue Q;Car car_I,car_D,car_M;SqStack S;SqStack2 S2;clrscr();InitStack(&S);InitStack2(&S2);InitQueue(&Q);/*初始化*//*--------------------------------------------------------------------------*/ while(ch==1){clrscr();for(i=0;i<80;i++)printf("*");printf("\n");for(i=0;i<24;i++)printf("-");printf("\YAOTIANSHUNRI CAR POSITION\t");for(i=0;i<24;i++)printf("-");printf("\n\t\t\t");for(i=0;i<10;i++)printf("-");printf("Information:");for(i=0;i<10;i++)printf("-");printf("\n\n");do{printf("\n\t\t\t1-arrival 2-departure 0-exit 2/1/0 ?\b");scanf("%d",&status);}while(status!=1&&status!=2&&status!=0);if(status==1)/*当车到达*/{printf("\n\t\t\tCar Number :");scanf("%d",&car_bel);printf("\n\t\t\tTime : ?\b");scanf("%f",&(car_I.time));if(!StackFull(S)){Push(&S,car_I);printf("\n\n");for(i=0;i<80;i++)printf("-");printf("\n");printf("\tCAR NUMBER :");printf(" %d",car_bel);printf("\tARRIVE TIME :");printf(" %5.2f",car_I.time);printf("\n\n");for(i=0;i<80;i++)printf("-");printf("\n\n");printf("\nWelcome to our YAOTIANSHUNRI CAR POSITION !\\n\nThe position of your car is %d",position_s);position_s++;printf("\n");printf("Do you want to continue 1-continue/0-quit ?\b");scanf("%d",&ch);}else{EnQueue(&Q,car_I);printf("Welcome to our YAOTIANSHUNRI CAR POSITION ,We are sorry that\ \n\nOur position is full,but you are free to place your car\\n\non our road.The position of your car is %d",position_q);position_q++;printf("\nDo you want to continue 1-continue/0-quit ?\b");scanf("%d",&ch);}}else if(status==2)/*当车离开*/{clrscr();for(i=0;i<80;i++)printf("*");printf("\n");for(i=0;i<24;i++)printf("-");printf("\tYAOTIANSHUNRI CAR POSITION\t");for(i=0;i<24;i++)printf("-");printf("\n\t\t\t");for(i=0;i<10;i++)printf("-");printf("Information");for(i=0;i<10;i++)printf("-");printf("\n\n");printf("\tYour are going to drive your car away ,\n\t\tPlease fill of the form !\n"); printf("\n\t\tYour car Number :");scanf("%d",&car_bel);printf("\n\t\t\tTime : ?\b");scanf("%f",&(car_D.time));do{Pop(&S,&car_M);if(car_bel!=car_bel)Push2(&S2,car_M);elsecar_I.time=car_M.time;}while(car_bel!=car_bel);while(!StackEmpty2(S2)){Pop2(&S2,&car_M);Push(&S,car_M);}while(!QueueEmpty(Q)&&!StackFull(S)){if(!StackFull(S)){DeQueue(&Q,&car_M);Push(&S,car_M);printf("The car %d just drived away ,\n\n\tthe car%d has entered the\ YAOTIANSHUNRI CAR POSITION .\n",car_bel,car_bel);}}time=car_D.time-car_I.time;if(time<0.0000)printf("Sorry!You input a wrong time !Please check and type again.\n");if(time>0.00001&&time<3.0)money=time*2.0;elsemoney=time*3.0;printf("\n\n");for(i=0;i<80;i++)printf("-");printf("\n\t");printf("Your car number %d :\tThe fee is :%5.2f",car_bel,money);printf("\n\n");for(i=0;i<80;i++)printf("-");printf("\n\n");printf("Welcome to back ! Do you want to continue 1-contine/0-quit ?\b");scanf("%d",&ch);}else exit(0);/*退出程序*/}}九、使用说明:(1)本程序为运行在Windows下的MyTc控制台程序,执行文件为:停车场管理.exe(2)进入该程序后,首先输入停车场的容量。

相关文档
最新文档