当前位置:文档之家› 数据结构与程序设计-递归

数据结构与程序设计-递归

第5章递归

5.1 递归简介

(Introduction to Recursion)

5.2 递归的原理

(Principles of Recursion)

5.3 回溯: 将工作延迟

(Backtracking: Postponing the Work)

5.4 树形结构编程: 在游戏中提前考虑走法

(Tree-Structured Programs: Look-Ahead in Games)

n掌握:

1.递归的概念:什么是递归、种类、及递归求解

方法。

2.递归过程的机制与利用递归工作栈实现递归的

方法。

3.利用递归解决问题的分治法和回溯法。

n了解:

n迷宫问题和n皇后问题的递归思路及利用栈实现的非递归解法。

n目的:

n通过实例分析递归执行的过程和实现的方式,从而使读者掌握递归适用的场合。

5.1 递归简介

递归与递归程序的概念

n递归(recursion)是一种描述和解决问题的基本方法,用来解决可归纳描述的问题,或说可分解为结构自相似的问题。所谓结构自相似,是指构成问题的部分与问题本身在结构上相似。

n递归的定义

n1)定义一个对象,又用到这个对象的本身;

n2)定义一个结构,它的每一个部分又是这种结构;

n3)定义一个过程,在执行中又直接或间接地调用过程

自己;

n递归程序

n在计算机中,递归问题可使用递归程序解决。

5.1 递归简介

n5.1.1 用于函数调用的堆栈

n5.1.2 表示函数调用的树

n5.1.3 用递归计算数的阶乘

n5.1.4 用分治算法解决汉诺塔问题

5.1.1 用于函数调用的堆栈

n调用记录(invocation record)——为每个调用函数分配的临时存储区域,包括返回地址、调用参数、局部变量等

n函数嵌套调用——函数按“后进先出”次序;执行函数所使用的临时存储区域也具有“后进先出”的特性;于是调用记录必须用“堆栈”保存

n堆栈的变化状态(stack frame)P.158图5.1

图5.1 stack frames for function calls

n递归调用的stack frame与一般的函数调用类似。

5.1.2 表示函数调用的树

n可以用“树”表示函数调用的次序(根节点代表主程序;其它节点代表所调用的某个函数)

n与树有关的术语(孩子、双亲、分支、兄弟、叶子/外部节点、路径、树/节点的高度/层数、树的遍历)

n递归树:P.159图5.2

n用于存储“调用记录”的堆栈(stack frame)的

空间需求——与递归树的高度成正比——于是可以利用递归树分析递归算法的性能。

图5.2 递归树

5.1.4 递归应用:用分治法解决汉诺塔问题分治法

n对于一个较为复杂的问题,如果能够分解成几个相对简单的且解法相同或类似的子问题来求解,这种方法叫分治法。

n Tower of Hanoi问题是一个典型的适合用递归的方法来解决的问题。

n问题描述:如图5.3所示,有A,B,C三个塔座,A上套有n个直径不同的圆盘,按直径从小到大叠放,形如宝塔,编号1,2,3……n。要求将n个圆盘从A移到C,叠放顺序不变,移动过程中遵循下列原则:n每次只能移一个圆盘

n圆盘可在三个塔座上任意移动

n任何时刻,每个塔座上不能将大盘压到小盘上

图5.3 Hanoi塔

解决方法:

n 1. n=1时,直接把圆盘从A移到C

n 2. n>1时,将n个圆盘从A塔座上移到C塔座上可以分为以下三个步骤进行:

⑴将A塔座上的n-1个圆盘借助C塔座先移到B塔座上。

⑵把A塔座上剩下的一个圆盘移到C塔座上。

⑶将n-1个圆盘从B塔座借助A塔座移到C塔座上。

n这样就将求解n个圆盘的Hanoi问题转化为求解n-个圆盘的Hanoi问题,依次类推,直至转化成只有一个圆盘的Hanoi问题。

实现算法:

//Main program:

const int disks = 64; // Make this constant much smaller to run program.

void move(int count, int start, int finish, int temp);

/* Pre: None.

Post: The simulation of the Towers of Hanoi has terminated. */

main( )

{

move(disks, 1, 3, 2);

}

//Recursive function:

void move(int count, int start, int finish, int temp)

{

if (count > 0)

{

move(count-1, start, temp, finish);

cout<<"Move disk "<

<<" to "<

move(count-1, temp, finish, start);

}

}

求解汉诺塔问题的递归树(n=3)

n小结:

n递归算法的效率往往很低, 费时和费内存空间. 但是递归也有其长处, 它能使一个蕴含递归关系且结构复杂的程序简介精炼, 增加可读性. 特别是在难于找到从边界到解的全过程的情况下, 如果把问题推进一步没其结果仍维持原问题的关系, 则采用递归算法编程比较合适.

5.2 递归的原理

n5.2.1 递归算法设计的原则

n5.2.2 递归算法的机器实现

n5.2.3 尾递归

n5.2.4 用栈实现递归过程的非递归算法n注意:区分以下的概念

n算法设计

n算法实现

n算法分析

5.2.1 递归算法设计的原则

n找出关键步骤Find the key step

n首先考虑“如何对问题进行划分?”、“中间的关

键步骤如何实现?”

n找出终止规则Find a stopping rule

n终止规则通常是不需要递归且较易解决的较小的或特殊的情形

n给出算法大纲Outline your algorithm

n将关键步骤和终止规则组合起来,并且通过if

语句区分这两种情形

数据结构课程设计

题目: 学院: 专业班级: 学生姓名: 指导教师: 2016 年06 月2 9日

目录 一、课程设计目的 (3) 二、课程设计步骤 (3) 三、课程设计内容 (4) 四、课程设计报告 (6) 五、提交材料 (6) 六、考核方式与评分标准 (7) 七、参考文献 (8) 附录1 齐齐哈尔大学软件工程系课程设计说明书(报告)撰写规范 (9)

一、课程设计目的及要求 《数据结构与算法分析》课程设计培养计算机专业的学生的算法程序设计能力。通过上机实验,可以培养学生程序设计的方法和技巧,提高学生编制清晰、合理、可读性好的系统程序的能力,加深对数据结构课程和算法的理解。使学生更好地掌握数据结构的基本概念、基本原理、及基本算法,具有分析算法、设计算法、构造和开发较复杂算法的基本能力。 要求学生能综合运用《数据结构与算法分析》的相关知识,培养学生上机解决一些与实际应用结合紧密的、规模较大的问题的能力,通过分析、设计、编码、调试等各环节的训练,使学生深刻理解、牢固掌握数据结构和算法设计技术,掌握分析实际问题的能力并提高C语言编程技巧,培养良好的编程风格。 课程设计要求独立完成,题目自选(参考题目见三,也可自拟),但需要老师确认(6月16日前定题),一人一题,要求程序有能采用交互式工作方式的界面进行功能的选择,只能用文件存储数据和处理数据不能使用数据库。要求在教学周的第18周前完成。 二、课程设计步骤 随着计算机性能的提高,它所面临的软件开发的复杂度也日趋增加。然而,编制一个10000行的程序的难度绝不仅仅是一个5000行的程序的两倍,因此软件开发需要系统的方法。一种常用的软件开发方法,是将软件开发过程分为分析、设计、实现和维护四个阶段。虽然数据结构课程中的课程设计的复杂度远不如(从实际问题中提出来的)一个“真正的”软件,但为了培养一个软件工作者所应具备的科学工作的方法和作风,完成课程设计的应有如下的5个步骤: 1.问题分析和任务定义 通常,课程设计题目的陈述比较简洁,或者说是有模棱两可的含义。因此,在进行设计之前,首先应该充分地分析和理解问题,明确问题要求做什么,限制条件是什么。注意:本步骤强调的是做什么,而不是怎么做。对问题的描述应避开算法和所涉及的数据类型,而是对所需完成的任务作出明确的回答。例如:输入数据的类型、值的范围以及输入的形式;输出数据的类型、值的范围及输出的形式;若是会话式的输入,则结束标志是什么,是否接受非法的输入,对非法输入的回答方式是什么等等。这一步还应该为调试程序准备好测试数据,包括合法的输入数据和非法形式输入的数据。 2.数据类型和系统设计 在设计这一步骤中需分逻辑设计和详细设计两步实现。逻辑设计指的是,对问题描述中涉及的操作对象定义相应的数据类型,并按照以数据结构为中心的原则划分模块,定义主程序模块和各抽象数据类型;详细设计则为定义相应的存储结构并写出各过程和函数的伪码算法。在这个过程中,要综合考虑系统功能,使得系统结构清晰、合理、简单和易于调试,抽象数据类型的实现尽可能做到数据封装,基本操作的规格说明尽可能明确具体。作为逻辑设计的结果,应写出每个

数据结构二叉树的递归算法实验报告

齐鲁工业大学实验报告成绩 课程名称数据结构指导教师单健芳实验日期 院(系)信息学院专业班级计科(嵌入)14-1 实验地点 学生姓名高晨悦学号 201403071007 同组人无 实验项目名称二叉树的递归算法 一、实验目的和要求 1.实现二叉树的先序,中序与后序遍历的递归算法与非递归算法。 2.求二叉树的结点个数,叶子结点个数,二叉树的高度,度为2的结点个数。 二、实验环境 微型计算机vc 6.0 三、实验内容 1.实现二叉树的先序,中序与后序遍历的递归算法与非递归算法。 2.求二叉树的结点个数,叶子结点个数,二叉树的高度,度为2的结点个数。 四、实验步骤 一.实验内容 1.实现二叉树的先序,中序与后序遍历的递归算法与非递归算法。 2.求二叉树的结点个数,叶子结点个数,二叉树的高度,度为2的结点个数。 二.程序的设计思想 1实现二叉树的先序,中序与后序遍历的递归算法与非递归算法。 先构造二叉树,根据先序遍历的思想,输入根后,再输入左子树,直至左子树为空则输入上一层右字树。 (1)二叉树的非递归遍历是用显示栈来存储二叉树的结点指针,先序遍历时,按二叉树前序遍历的顺序访问结点,并将结点的指针入栈,直到栈顶指针指向结点的左指针域为空时取出栈顶指针并删除栈顶指针,访问刚取出的指针指向的结点的右指针指向的结点并将其指针入栈,如此反复执行则为非递归操作。 (2)二叉树的递归遍历:若二叉树为空,则空操作 先序遍历: (a)访问根结点; (b)先序遍历左子树; (c)先序遍历右子树。

中序遍历: (a)中序遍历左子树; (b)访问根结点; (c)中序遍历右子树 后序遍历: (a)后序遍历左子树; (b)后序遍历右子树; (c)访问根结点。 2.求二叉树的结点个数,叶子结点个数,二叉树的高度,度为2的结点个数。 (1)求二叉树的叶子结点个数:先分别求得左右子树中个叶子结点的个数,再计算出两者之和即为二叉树的叶子结点数。 (2)二叉树的结点个数之和:先分别求得左子树右子树中结点之和,再计算两者之和即为所求。 (3)二叉树的高度:首先判断二叉树是否为空,若为空则此二叉树高度为0,。否则,就先分别求出左右子树的深度进行比较,取较大的树加一即为所求。 (4)二叉树的度为2的结点个数:计算有左右孩子的结点个数,即为度为2的结点个数。 三.编程过程中遇到的问题及解决办法 (1)后续遍历的非递归函数涉及到回溯的方法,开始设计的方案想的太过于简单,所以形成了死循环,总是在最后的节点处不停地循环,后改成回溯后,该问题得到解决。 (2)计算二叉树中度为2的结点个数中,返回循环的时候不论根结点有没有左右子树,但个人设计时,根总是会将自己默认为有左右子树,自行增加1.后在同学帮助下才看到自己的这个失误。 四.程序的闪光点(自我评价) 1.程序模块化,各个函数分开描述,方便观察 2.关键处有注释 3.建立二叉树时,用先序提示输入,比较人性化。 五.程序源代码(以文件为单位提供) #include #include #define Maxsize 100 typedef struct TREE{ struct TREE *lTree;

天津大学数据结构和程序设计考研真题

天津大学数据结构和程序设计考研真题-考研资料- 笔记讲义 许多学生在考研复习的时候,都会遇到重点不明确,不知道从何复习的情况。为此,天津考研网建议,考研复习中,专业的考研复习资料,是帮助考生能够快速掌握复习重点及方法必不可少的因素,然后就是真题和讲义,可以让同学了解历年考研的出题方向和大致范围。天津考研网推出了天津大学数据结构和程序设计的考研复习资料及真题解析班,以下为详细介绍: 天津大学数据结构和程序设计考研真题等资料由天津考研网签约的天津大学计算机科学与技术学院高分考研学生历时近一月所作,该考生在考研中取得了专业课129分的好成绩并在复试中更胜一筹,该资料包含该优秀本校考生的考研经验、考研试题解题思路分析、复试流程经验介绍以及针对官方指定参考书的重难要点并根据天津大学本科授课重点整理等,从漫漫初试长路到紧张复试亮剑为各位研友提供全程考研指导攻关。 特别说明:此科目06年以前科目名称为数据结构;自06年到08年科目名称改为计算机基础(包含数据结构、程序设计、计算机原理);自09年开始全国统考,科目名称为计算机学科专业基础综合;自2013年开始由学校自主命题,科目名称改为901数据结构与程序设计。 第一部分由天津考研网提供的核心复习资料: 天津大学数据结构和程序设计资料编者序言:本文的重点在于C++,数据结构的复习和复试基本情况介绍。C++、数据结构又分别从复习规划,复习用书,重点知识点结合历年考题这四个方面来展开的。复习规划大家务必看一下,然后根据自己的实际情况在制定自己的复习时间,因为内容很多,大多数同学都在考试之前复习不完,在心理因素上就落了一节。重点知识点一定要看了,这些知识点几乎每年都会有题了。另外我还给了历年试题的答案供大家参考。有的答案是自己做的答案,可能会有疏忽的地方。望大家提出宝贵的意见和建议。复试的东西现在了解一下即可,等到进复试了,还是有足够的时间看的。另外我还给了些自己复习心得。考完后感慨很多,回顾了这多半年来自己的成败得失。希望大家从一开始就沿着比较高效的方向前进,减少不必要时间的浪费。本资料格式为A4纸打印版,总量达到了130页

程序设计与数据结构-2001

北京航空航天大学程序设计与数据结构试题 (2001年) 一、问答题(10’) 一般情况下,线性表可以采用哪几种存储结构?请分别叙述每一种存储结构的构造原理与特点。 二、(10’) 已知AOE网为G=(V,E),其中V={v1,v2,v3,v4,v5,v6,v7,v8,v9,v10},E={a1, a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14},其中: a1:(v1,v2)5a2:(v1,v3)6a3:(v2,v5)3a4:(v3,v4)3 a5:(v3,v5)6a6:(v4,v5)3a7:(v4,v7)1a8:(v4,v8)4 a9:(v5,v6)4a10:(v5,v7)2a11(v6,v10)4a12:(v7,v9)5 a13:(v8,v9)2a14:(v9,v10)2 注:顶点偶对右下角的数字表示边上的权值。 请按下述过程指出所有关键路径: ee[1:10]: le[1:10]: e[1:14]: l[1:14]: 其中,ee[i]与le[i]分别表示事件v i的最早发生时间与最晚发生时间;e[i]与l[i]分别表示活动a i的最早开始时间与最晚开始时间。 三、(10’) 欲建立一文献库,其正文(文献本身)存放在一个双向循环链表的各个链接点中。 1.为便于链接点的插入、删除操作,以及按题目、发表日期、发表者名称、主题词(假设每文最多给出三个主题词)进行检索,请设计该链表的链接点结构(给出链接点每个域的名称,并说明该域内存放什么信息。注:以下各小题设计链结点结构也这样要求)。画出整个链表结构的示意图。 2.设计一个三级索引结构,其中第三级索引称为题目索引,示按文献题目构造的稠密索引,通过该级索引并根据给定题目可得到每个文献的存放地址;该级索引按文献学科类分类存放。第二级索引称为中类索引,是题目索引的索引,指出同一中类的文献题目索引的存放位置(例如农林类、气象类……,古代史类,近代史类……)。第一级索引称为大类索引,指出同一大类(如:自然科学类、历史类……)的文献的中类索引的存放位置。请设计每一级索引的结点结构,并画出该索引的整体示意图。 3.在设计一种三级索引结构,其中第三级索引仍是题目索引(与2题所述相同),第二级索引把具有相同主题词的文献题目索引地址组织在一个单链表中。第一级索引称为主题词索引,用文献给出的主题词做关键字组成杂凑表,即该级索引为一个杂凑表,能够指出具有同一主题词的文献题目索引的索引链表的第一个链结点的存储位置。该杂凑表采用链地址法处理冲突。请设计每一级索引的结点结构,并画出该索引的整体示意图。 四、(10’) 已知非空线性链表由list 五、(5’+10’) 已知求两个正整数m与n的最大公因子的过程用自然语言可以表述为反复执行如下动作:

数据结构利用栈实现递归

利用栈实现递归参考程序1(Turbo2.0环境): #define MAXSIZE 100 #include struct stack{ int data[MAXSIZE]; int top; }; void init(struct stack *s){ s->top=-1; } int empty(struct stack *s){ if(s->top==-1) return 1; else return 0; } void push(struct stack *s,int i){ if(s->top==MAXSIZE-1){ printf("Stack is full\n"); return; } s->top++; s->data[s->top]=i; } int pop(struct stack *s){ if(empty(s)){ printf("stack is empty"); return -1; } return(s->data[s->top--]); } void trans(int num){ struct stack s; int k; init(&s); while(num){ k=num%16; push(&s,k); num=num/16; } while(!empty(&s)){ k=pop(&s); if(k<10)

printf("%d",k); else printf("%c",k+55); } printf("\n"); } main(){ int num; clrscr(); printf("Input a num,-1 to quit:\n"); scanf("%d",&num); while(num!=-1){ trans(num); scanf("%d",&num); } } 参考程序2:(C++/VC环境) #define STACK_INIT_SIZE 100//存储空间初始分配量 #define OVERFLOW -1 #define OK 1 #define STACKINCREMENT 10//存储空间分配增量 #define ERROR 0 #define TRUE 1 #define FALSE 0 #include "stdio.h" #include "stdlib.h" #include "malloc.h" #include "iostream.h" typedef int status; typedef char SElemType; typedef struct{//顺序栈的定义 SElemType *base; SElemType *top; int stacksize; }SqStack; status InitStack(SqStack &S){//构造一个空栈S S.base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType)); if(!S.base)exit(OVERFLOW);//存储分配失败 S.top=S.base; S.stacksize=STACK_INIT_SIZE; return OK; }

数据结构与程序设计C++描述(Kruse著)高等教育出版社_课后答案.

Programming Principles 1 1.2 THE GAME OF LIFE Exercises 1.2 Determine by hand calculation what will happen to each of the configurations shown in Figure 1.1 over the course of five generations. [Suggestion: Set up the Life configuration on a checkerboard. Use one color of checkers for living cells in the current generation and a second color to mark those that will be born or die in the next generation.] Answer (a) Figure remains stable. (b) (c) (d) Figure is stable. 1 2 Chapter 1 _ Programming Principles (e) (f) Figure repeats itself. (g) (h) (i) Figure repeats itself. (j) (k) (l) Figure repeats itself. Section 1.3 _ Programming Style 3 1.3 PROGRAMMING STYLE Exercises 1.3

E1. What classes would you define in implementing the following projects? What methods would your classes possess? (a) A program to store telephone numbers. Answer The program could use classes called Phone_book and Person. The methods for a Phone_book object would include look_up_name, add_person, remove_person. The methods for a Person object would include Look_up_number. Additional methods to initialize and print objects of both classes would also be useful. (b) A program to play Monopoly. Answer The program could use classes called Game_board, Property, Bank, Player, and Dice. In addition to initialization and printing methods for all classes, the following methods would be useful. The class Game_board needs methods next_card and operate_jail. The class Property needs methods change_owner, look_up_owner, rent, build, mortgage, and unmortgage. The class Bank needs methods pay and collect. The class Player needs methods roll_dice, move_location, buy_property and pay_rent. The class Dice needs a method roll. (c) A program to play tic-tac-toe. Answer The program could use classes called Game_board and Square. The classes need initialization and printing methods. The class Game_board would also need methods make_move and is_game_over. The class Square would need methods is_occupied, occupied_by, and occupy. (d) A program to model the build up of queues of cars waiting at a busy intersection with a traffic light. Answer The program could use classes Car, Traffic_light, and Queue. The classes would all need initialization and printing methods. The class Traffic_light would need additional methods change_status and status. The class Queue would need additional methods add_car and remove_car. E2. Rewrite the following class definition, which is supposed to model a deck of playing cards, so that it conforms to our principles of style. class a { // a deck of cards int X; thing Y1[52]; /* X is the location of the top card in the deck. Y1 lists the cards. */ public: a( ); void Shuffle( ); // Shuffle randomly arranges the cards. thing d( ); // deals the top card off the deck } ; Answer class Card_deck { Card deck[52]; int top_card; public: Card_deck( ); void Shuffle( ); Card deal( );

数据结构课程设计

<<数据结构>> 课 程 设 计 班级:111004 姓名:董丽美 学号:111004122 指导教师:史延新 完成日期:2013 _07 _10

题目一:约瑟夫环问题 【问题描述】约瑟夫(Joseph)问题的一种描述是:编号为1,2,…,n 的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。一开始任选一个正整数作为报数上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数。报m 的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人开始重新从1报数,如此下去,直至所有人全部出列为止。试设计一个程序求出列顺序。【基本要求】利用单向循环链表存储结构模拟此过程,按照出列的顺序打印出各人的编号。 【测试数据】m的初值为20;n=7,7个人的密码依次为:3,1,7,2,4,8,4,首先m值为6(正确的出列顺序应为:6,1,4,7,2,3,5) 一 .需求分析 1.用单循环链表存储并遍历及删除节点的方法,计算并输出约瑟夫环的问题。 2.环中总人数和节点信息由用户输入,且均为正整数。3.在窗口界面输出出列顺序的编号。 二.概要设计

1.设定链表的抽象数据类型定义: ADT List{ 数据对象:D={a(i)|a(i)∝Elemset,i=1,2,…,n,n>=0} 数据关系:R1={|a(i-1),a(i)∝D,i=2,…,n}基本操作: InitList(&L) 操作结果:构造一个空的线性表 ListInsert(&L,i,e) 初始条件:线性表L已经存在。 操作结果:在L中第i个位置之前插入新的数据元素 e,L的长度增加1。 ListDelete(&L,i,&e) 初始条件:线性表L已经存在且非空,1<=i<=ListLength(L)。操作结果:删除L的第i个数据元素,并用e返回其值,L 的长度减1 。 } 2.算法的基本思想: 根据题目要求,采用单循环线性表的基本操作来实现约瑟夫环问题。首先根据所给信息生成链表节点并插入,根据节点记录密码及其所在链表中的顺序,由给出的初始访问值进行遍历,当变量i增量等于所给的值(即关键字)时,指针所指的节点处的顺序值即为所需输出的顺序号。每输出一次顺

数据结构毕业设计题目整理

数据结构课程设计题目 1.飞机订票系统(限1 人完成)(顺序或链式存储) 任务:通过此系统可以实现如下功能: 录入: 可以录入航班情况(数据可以存储在一个数据文件中,数据结构、具体数据自定) 查询: 可以查询某个航线的情况(如,输入航班号,查询起降时间,起飞抵达城市,航班票价,票价折扣,确定航班是否满仓); 可以输入起飞抵达城市,查询飞机航班情况; 订票:(订票情况可以存在一个数据文件中,结构自己设定) 可以订票,如果该航班已经无票,可以提供相关可选择航班; 退票:可退票,退票后修改相关数据文件; 客户资料有姓名,证件号,订票数量及航班情况,订单要有编号。 修改航班信息: 当航班信息改变可以修改航班数据文件 要求: 根据以上功能说明,设计航班信息,订票信息,客户信息的存储结构,设计程序完成功能; 2.宿舍管理查询软件(限1 人完成) 任务:为宿舍管理人员编写一个宿舍管理查询软件, 程序设计要求: 采用交互工作方式 建立数据文件,包括学生信息、宿舍信息、住宿信息,学生信息按关键字(姓名、学号)进行排序(排序方法自选,不能相同); 查询: (用二分查找实现以下操作) 按姓名查询 按学号查询 (用顺序查找实现以下操作) 按房号查询 3.校园导航问题(限1 人完成) 设计要求:设计你的学校的平面图,至少包括10个以上的场所,每两个场所间可以有不同的路,且路长也可能不同,找出从任意场所到达另一场所的最佳路径(最短路径)。 要求:能增加场所 4.图书借阅管理系统(限1 人完成)(顺序或链式存储) 主要分为两大功能: 1)图书管理(增加图书、查询图书、删除图书、图书借阅、还书); 2)会员管理(增加会员、查询会员、删除会员、借书信息); 5.学生成绩管理(限1 人完成)(顺序或链式存储) 包括:课程信息,学生信息等;能增加课程或学生。 实现功能:输入、输出、插入、删除、查找、显示、保存、排序、退出。6.活期储蓄帐目管理(限1 人完成) 活期储蓄处理中,储户开户、销户、存入、支出活动频繁,系统设计要求: 1)能比较迅速地找到储户的帐户,以实现存款、取款记账;

数据结构知识点整理

数据是信息的载体,是描述客观事物的数、字符、以及所有能输入到计算机中,被计算机程序识别和处理的符号(数值、字符等)的集合。 数据元素(数据成员)是数据的基本单位。在不同的条件下,数据元素又可称为元素、结点、顶点、记录等 数据对象具有相同性质的数据元素(数据成员)的集合 数据结构由某一数据对象及该对象中所有数据成员之间的关系组成。记为Data_Structure = {D, R}其中,D是某一数据对象,R是该对象中所有数据成员之间的关系的有限集合。 数据类型是指一种类型,以及定义在这个值集合上的一组操作的总称。 判断一个算法的优劣主要标准:正确性、可使用性、可读性、效率、健壮性、简单性。 算法效率的衡量方法:后期测试,事前估计 算法分析是算法的渐进分析简称 数据结构包括“逻辑结构”和“物理结构”两个方面(层次): 逻辑结构是对数据成员之间的逻辑关系的描述,它可以用一个数据成员的集合和定义在此集合上的若干关系来表示物理结构是逻辑结构在计算机中的表示和实现,故又称“存储结构” 线性表的定义:n(3 0)个表项的有限序列L =(a1, a2, …, an)ai是表项,n是表长度。第一个表项是表头,最后一个是表尾。 线性表的特点:表中元素的数据类型相同;线性表中,结点和结点间的关系是一对一的,有序表和无序表线性表的存储方式。一,顺序存储方式,二,链表存储方式。 顺序表的存储表示有2种方式:静态方式和动态方式。 顺序表的定义是:把线性表中的所有表项按照其逻辑顺序依次存储到从计算机存储中指定存储位置开始的一块连续的存储空间中。 顺序表的特点:用地址连续的一块存储空间顺序存放各表项,各表项的逻辑顺序与物理顺序一致,对各个表项可以顺序访问,也可以随机访问。 单链表是一种最简单的链表表示,也叫线性链表,用她来表示线性表时,用指针表示结点间的逻辑关系。特点:是长度可以很方便地进行扩充。 连续存储方式(顺序表)特点:存储利用率高,存取速度快缺点:插入、删除等操作时需要移动大量数据: 链式存储方式(链表)特点:适应表的动态增长和删除。缺点:需要额外的指针存储空间

C语言程序设计和数据结构

湖南师范大学硕士研究生入学考试自命题考试大纲 考试科目代码:[967] 考试科目名称:C语言程序设计和数据结构 一、试卷结构 1) 试卷成绩及考试时间 本试卷满分为150分,考试时间为180分钟。 2)答题方式:闭卷、笔试 3)试卷内容结构 C语言程序设计部分 80% 数据结构部分 20% 4)题型结构 a: 单项选择题,共40分 b: 程序填空题,共30分 c: 程序阅读题,共25分 d: 编程题,共45分 e: 分析题,共10分 二、考试内容与考试要求 (一)C语言程序设计部分 考试内容 1、基本知识 (1)C语言的数据类型 (2)C语言中各种类型常量的表示法 (3)各类数值型数据间的混合运算 (4)C运算符 (5)关系表达式及运算,逻辑表达式及运算

2、顺序、选择与循环结构 (1)赋值语句,格式输入与输出 (2)if语句,switch语句 (3)goto、while、do-while、for、break、continue语句3、数组 (1)一维数组的定义和引用 (2)二维数组的定义和引用 (3)字符数组的定义和引用,字符串及其处理函数 4、函数 (1)函数定义与调用 (2)局部变量和全局变量 (3)变量的存储类型 (4)内部函数与外部函数 5、宏定义 (1)带参数的宏定义 (2)包含文件的处理 6、指针 (1)地址和指针的概念 (2)数组的指针和指向数组的指针变量 (3)字符串的指针和指向字符串的指针变量 (4)函数的指针和指向函数的指针变量 (5)指针数组和指向指针的数组 7、结构体和共同体 (1)结构体变量的定义和使用方法 (2)指向结构体类型变量的指针 (3)用指针处理链表 (4)共同体变量的定义和使用方法

数据结构与C语言程序设计

《数据结构与C语言程序设计》复习大纲 《数据结构与C语言程序设计》包括“数据结构”与“C语言程序设计”两门课程的内容,各占比例50%。 《数据结构》部分 指定参考书: 《数据结构教程(第二版)》唐发根编著,北京航空航天大学出版社,2005 一、概述 1.简要了解数据的逻辑结构与存储结构的基本概念; 2.了解算法的定义、算法的五个基本性质以及算法分析最基本的概念,包括算法分析的前提、目的。 二、线性表 1.了解线性关系、线性表的定义,线性表的基本操作; 2.线性表的顺序存储结构与链式存储结构(包括单链表、循环链表和双向链表)的构造原理; 3.掌握在以上两种存储结构的基础上对线性表实施的基本操作,重点包括顺序表的插入和删除、链表的建立、插入和删除、检索等操作对应的过程和算法的设计。 三、堆栈与队列 1.了解堆栈与队列(不含循环队列)的基本概念、基本操作; 2.掌握堆栈与队列的顺序存储结构与链式存储结构的构造原理; 3.掌握在不同存储结构的基础上对堆栈与队列实施插入与删除等基本操作过程。

四、树与二叉树 1.了解树型结构的基本概念,基本特征、名词术语; 2.了解完全二叉树、满二叉树的概念;二叉树的基本性质(至少要记住结论); 3.了解二叉树的顺序存储结构与二叉链表存储结构的构造原理及特点,重点是二叉链表存储结构; 4.掌握二叉树的前序遍历、中序遍历、后序遍历和按层次遍历算法(非递归算法)以及利用遍历解决有关二叉树的其它操作; 5.掌握二叉排序树的基本概念、建立(插入)和查找。 五、图 1.了解图结构的基本概念、基本名词术语; 2.掌握图的邻接矩阵存储方法和邻接表存储方法的基本构造原理与特点; 3.图的深度优先搜索和广度优先搜索的基本过程,遍历的基本作用; 4.最小生成树的求解过程,拓扑排序及其目的。 六、文件及查找 1.掌握顺序查找法、折半查找法的查找过程,了解折半查找方法的基本要求; 2.了解散列(Hash)文件的基本特点,散列函数和散列冲突的概念,处理散列冲突的方法。 七、内排序 了解插入排序法、选择排序法、泡排序法、快速排序法以及堆积排序(大顶堆积)法等排序方法的排序原理、规律和特点。 《C语言程序设计》部分 指定参考书: 《C程序设计》(第三版)谭浩强著,清华大学出版社, 2005.7

814程序设计与数据结构考试大纲

814程序设计与数据结构考试大纲 085211计算机技术专业 一、考试目的 本考试是全日制计算机技术专业学位研究生的入学资格考试之专业基础课,各语种考生统一用汉语答题。各招生院校根据考生参加本考试的成绩和其他三门考试的成绩总分来选择参加第二轮,即复试的考生。 二、考试的性质与范围 本考试是测试考生计算机科学基础知识的水平考试。考试范围包括本大纲规定的C++语言程序设计和数据结构。 三、考试基本要求 1. 具备扎实的C++语言程序设计基本功。 2. 具备设计数据结构和算法求解问题的基本能力。 四、考试形式 本考试采取客观试题与主观试题相结合,单项技能测试与综合技能测试相结合的方法,强调考生设计数据结构和算法并编程实现来求解问题的能力。试题分类参见“考试内容一览表”。 五、考试内容 本考试包括两个部分:C++程序设计、数据结构。总分150分。 I. C++程序设计 1. 考试要求 该部分要求考生对C++语言基本特性、面向对象程序设计方法和Visual C++编译器相关特性有很好的了解。 2. 题型 选择题、读程序写出Visual C++下的执行结果、程序填空,共75分。 II. 数据结构 1. 考试要求 该部分要求考生掌握线性表(及其扩展:栈和FIFO队列)、树(包括基本的二叉树和堆、搜索树等特殊树结构)、图等基本数据结构及其上的操作;掌握二分搜索、Hash技术及搜索树等搜索方法;掌握选择、起泡、插入等简单排序算法,堆排序、快速排序、归并排序和谢尔(希尔)等快速排序算法,以及箱子、基数排序等非比较排序算法。具备利用上述数据结构和算法以及设计新数据结构和算法来求解问题的能力。 2. 题型 选择题、简答题、算法设计题,共75分。

数据结构程序设计题目共29题

目录 题目1:设计一元多项式简单计算 (1) 题目2:链表应用1 (1) 题目3:链表应用2 (1) 题目4:通讯录 (2) 题目5:停车场管理系统............................................. 错误!未定义书签。题目6:约瑟夫环 (3) 题目7:运动会分数统计 (3) 题目8:文学研究助手问题 (3) 题目9:银行业务模拟与离散事件模拟 (4) 题目10:学生信息管理系统任务(用顺序表/链表).... 错误!未定义书签。题目11:文章编辑功能 .............................................. 错误!未定义书签。题目12:实验室管理.................................................. 错误!未定义书签。题目13:二叉树的基本操作(建立、求二叉树树深度、遍历).. (4) 题目14:纸牌游戏任务 (5) 题目15:算术表达式求值 (5) 题目16:内部排序算法比较 (5) 题目17:哈夫曼树的构造和哈夫曼编码/译码 (6) 题目18:构造可以使n个城市连接的最小生成树 (7) 题目19:交通咨询系统中的最短路径 (7) 题目20:集合的交、并、差运算 ................................ 错误!未定义书签。题目21:长整数四则运算 (7) 题目22:机订票系统.................................................. 错误!未定义书签。题目23:图书管理系统 (8) 题目24:哈希表应用 (8) 题目25:模拟旅馆管理系统的一个功能——床位的分配与回收 (9) 题目26:地图着色问题 (9) 题目27:俄罗斯套娃问题 (10) 题目28:扫雷 (11) 题目29:用C语言设计一个日历系统 (11)

北航数据结构与程序设计真题-2013北航991真题与答案

2013年“数据结构与C程序设计”(代码991)试题 一、单项选择题(本题共20分,每小题各2分) 1.对于长度为n的线性表,建立其对应的单链表的时间复杂度为( )。 A.O(1);B.O(log2n);.O(n);D.O(n2)。 2.一般情况下,在一个双向链表中插入一个新的链结点,( )。 A.需要修改4个指针域内的指针;B.需要修改3个指针域内的指针; C.需要修改2个指针域内的指针;D.只需要修改1个指针域内的指针。 3.假设用单个字母表示中缀表达式中的一个运算数(或称运算对象),并利用堆栈产生中缀表达式对应的后缀表达式。对于中缀表达式A+B*(C/D-E),当从左至右扫描到运算数E时,堆栈中的运算符依次是( )。(注:不包含表达式的分界符) A.+*/-;B.+*(/-;C.+*-;.+*(-。 4.若某二叉排序树的前序遍历序列为50,20,40,30,80,60,70,则后序遍历序列为( )。 A.30,40,20,50,70,60,80;B.30,40,20,70,60,80,50; C.70,60,80,50,30,40,20;D.70,60,80,30,40,20,50。 5.分别以6, 3, 8, 12, 5, 7对应叶结点的权值构造的哈夫曼(Huffman) 树的深度为( )。 A.6;B.5;C.4;D.3。 6.下列关于图的叙述中,错误的是( )。 A.根据图的定义,图中至少有一个顶点; B.根据图的定义,图中至少有一个顶点和一条边(弧); C.具有n个顶点的无向图最多有n(n-1)/2条边; D.具有n个顶点的有向图最多有n(n-1)条边(弧)。 7.若在有向图G的拓扑序列中,顶点vi在顶点vj之前,则下列4种情形中不可能出现的是( )。 A.G中有弧; B.G中没有弧; C.G中有一条从顶点vi到顶点vj的路径; D.G中有一条从顶点vj到顶点vi的路径。 8.下列关于查找操作的叙述中,错误的是( )。 A.在顺序表中查找元素可以采用顺序查找法,也可以采用折半查找法; B.在链表中查找结点只能采用顺序查找法,不能采用折半查找法; C.一般情况下,顺序查找法不如折半查找法的时间效率高; D.折半查找的过程可以用一棵称之为“判定树”的二叉树来描述。 9.在一棵m阶B-树中,除根结点之外的任何分支结点包含关键字的个数至少是( )。 A.m/2-1;B.m/2;C.m/2-1;D.m/2。 10.若对序列(49, 38, 65, 97, 76, 13, 27, 49’)进行快速排序,则第一趟排序结束(即确定了第1个分界元素的最终位置)时,序列的状态是( )。 A.(13, 27, 49’, 38, 49, 76, 97, 65);B.(13, 38, 27, 49’, 49, 76, 97, 65); C.(13, 38, 49’, 27, 49, 97, 76, 65);D.(13, 38, 49’, 27, 49, 76, 97, 65)。 二、填空题(本题共20分,每小题各2分) 1.非空线性表在采( )存储结构的情况下,删除表的一个数据元素平均需要移动表中近一半元素的位置。2.将一个长度为n的单链表链接到一个长度为m的单链表后面,该算法的时间复杂度用大O符号表示为( )。 3.若完全二叉树的叶结点的数目为k,且最下面一层的结点数大于1,则该完全二叉树的深度为( )。

数据结构和C++程序设计_题库

《数据结构》 Part1 一.选择 1. 组成数据的基本单位是() A)数据项B)数据类型C)数据元素D)数据变量 2.算法分析的目的是() A)找出数据结构的合理性B)研究算法的输入/输出关系 C)分析算法的效率以求改进D)分析算法的易读性 3.在一个具有n个结点的有序单链表中插入一个新结点并仍然有序的时间复杂度是()A)O(1) B)0(n) C)O(n^2) D)O(nlog2n) 4.若线性表采用顺序存储结构,每个元素占用4个存储单元,第一个元素的存储地址为100,则第12个元素的存储地址是() A)112 B)144 C)148 D)412 5.下面关于线性表的叙述中,错误的是() A)顺序表使用一维数组实现的线性表B)顺序表必须占用一片连续的存储单元. C)顺序表的空间利用率高于链表D)在单链表中,每个结点只有一个链域. 6.在需要经常查找结点的前驱与后继的情况下,使用()比较合适 A)单链表B)双链表C)顺序表D)循环链表 7.队列通常采用的两种存储结构是() A)顺序存储结构和链式存储结构B)散列方式和索引方式 C)链表存储结构和线性存储结构D)线性存储结构和非线性存储结构 8.在一个单链表中,若删除p所指结点的后继结点,则执行() A)p->next=p->next->next;B)p=p->next;p->nex=p->next->next; C)p->next=p->next;D)p=p->next->next; 9.若某线性表中最常用的操作是在最后一个元素之后插入一个元素和删除第一个元素,则采用()存储方式最节省运算时间 A)单链表B)仅有头指针的单循环链表C)双链表D)仅有尾指针的单循环链表 10.按二叉树的定义,具有三个结点的二元树共有()种形态。 A)3 B)4 C)5 D)6 11.任何一棵二叉树的叶结点在先序、中序和后序遍历序列中的相对次序()A)发生改变B)不发生改变C)不能确定D)以上都不对12.深度为5的二叉树至多有()个结点 A)16 B)32 C)31 D)10 13.在一棵度为3的树中,度为3的结点数为2个,度为2的结点数为1个,度为1的结点数为2个,那么度为0的结点数为()个。 A)4 B)5 C)6 D)7 14.对于一个具有n个顶点的无向图,若采用邻接表表示,则存放表头结点的数组(顶点表)的大小为() A)n B)n+1 C)n-1 D)n/2 15.静态查找表和动态查找表二者的根本差别在于()

数据结构课程设计(附代码)

上海应用技术学院课程设计报告 课程名称《数据结构课程设计》 设计题目猴子选大王;建立二叉树;各种排序;有序表的合并;成绩管理系统;院系计算机科学与信息工程专业计算机科学与技术班级 姓名学号指导教师日期 一.目的与要求 1. 巩固和加深对常见数据结构的理解和掌握 2. 掌握基于数据结构进行算法设计的基本方法 3. 掌握用高级语言实现算法的基本技能 4. 掌握书写程序设计说明文档的能力 5. 提高运用数据结构知识及高级语言解决非数值实际问题的能力 二.课程设计内容说明 1. 项目一 (1) 对设计任务内容的概述 学生成绩管理** 任务:要求实现对学生资料的录入、浏览、插入和删除等功能。 输入:设学生成绩以记录形式存储,每个学生记录包含的信息有:学号和各门课程的成绩,设学生成绩至少3门以上。存储结构:采用线性链式结构。 (2) 详细设计 LinkList *create():输入学生成绩记录函数; void print(LinkList *head):显示全部记录函数 LinkList *Delete(LinkList *head):删除记录函数 LinkList *Insert(LinkList *head):插入记录函数 void menu_select():菜单选择 void ScoreManage():函数界面

(3) 程序流程图 (4) 程序模块及其接口描述 该程序可以分为以下几个模块: 1、菜单选择:void menu_select(); 提供五种可以选择的操作,在main函数中通过switch语句调用菜单menu_select()函数,进入不同的功能函数中完成相关操作。

相关主题
文本预览
相关文档 最新文档