数据结构一学期作业(顺序栈,三元组,串,树,邻接表,邻接矩阵,二叉树,等等代码c语言实现)


-
一学期数据结构的代码作业,基本上涵盖了课本上面所有算法的C语言代码实现,压缩包无密码 2019/11/03 21:43 1,478 BF_KMP.cpp 2019/11/03 21:22 2,664 KMP.cpp 2019/10/24 18:49 3,956 LinkStack.cpp 2019/11/21 19:15 705 M_ArrayMap.cpp 2019/11/20 21:49 2,021 M_BiTree.cpp 2019/11/21 18:55 372 M_linkmap.cpp 2019/11/05 22:50 88 test.cpp 2019/10/24 21:51 1,795 work.cpp 2019/09/25 18:47 767 三元组.cpp 2019/11/10 21:35 2,140 串.cpp 2019/11/20 21:49 2,021 二叉树.cpp 2019/09/22 22:58 1,305 复数.cpp 2019/09/25 11:20 1,750 带头结点链表.cpp 2019/11/11 19:51 11,164 广义表.cpp 2019/11/11 20:30 1,917 数组.cpp 2019/09/28 16:28 1,879 无头结点链表.cpp 2019/12/16 20:10 1,955 查找表.cpp 2019/11/25 21:17 2,442 树.cpp 2019/09/10 21:44 641 立方体.cpp 2019/10/24 18:28 3,455 算术表达式求值.cpp 2019/12/09 21:30 1,406 邻接矩阵.cpp 2019/10/27 14:38 1,183 链栈.cpp 2019/10/27 14:23 1,123 链队列.cpp 2019/10/18 21:44 1,070 顺序栈.cpp 2019/09/24 14:57 1,663 顺序表.cpp 2019/10/15 15:47 1,087 顺序队列.cpp 2019/12/08 17:19 2,019 领接表.cpp
623KB
数据结构(C++)有关练习题
2008-01-02实验一 复习C++有关知识<br>实验目的:<br>通过实验掌握下列知识: <br>1、复习C++有关基本知识;<br>2、熟悉VC编程、编译和调试环境;<br>内容及步骤:<br>编写一个类Complex,定义复数的加法、减法、乘法和除法运算,要求在编写该类时重载这些运算操作符,并重载I/O操作符,以便输入和输出复数;<br>实验报告要求:<br>按要求写出完整的实验代码;<br><br>实验二 单链表结构及计算<br>实验目的:<br>通过实验掌握下列知识: <br>1、熟悉线性表的基本运算在两种存储结构(顺序结构和链式结构)上的实现;<br>2、继续熟悉VC编程、编译和调试环境;<br>内容及步骤:<br>1、 设有一个线性表(e0,e1,e2,e3,…,en-2,en-1)存放在一个一维数组A[arraySize]中的前n个数组元素位置。请编写一个函数将这个线性表原地逆置,即将数组的前n个原地址内容置换为(en-1,en-2,…,e3,e2,e1,e0)。<br>2、 针对带附加头结点的单链表,试编写下列函数:<br>A. 定位函数Locate:在单链表中寻找第i个结点。若找到,则函数返回第i个结点的地址;若找不到,则函数返回NULL;<br>B. 球最大值函数max:通过单链表的一趟遍历,在单链表中确定值最大的结点;<br>C. 统计函数number:统计单链表中具有给定值x的所有元素数量;<br>D. *建立函数create:根据一维数组a[n]建立一个单链表,使单链表中各元素的次序与a[n]中各元素的次序相同,要求该程序的时间复杂度为O(n)。<br>E. *整理函数tideup:在非递减有序的单链表中删除值相同的多余结点。<br>实验报告要求:<br>按要求写出完整的实验代码;<br><br>实验三 堆栈结构与递归<br>实验目的:<br>通过实验掌握下列知识: <br>1、掌握堆栈的结构和运算应用;<br>2、掌握并运用递归的概念进行编程;<br>内容及步骤:<br>1、 借助堆栈实现单链表上的逆置运算;<br>要求: a. 用C++编程;<br> b. 首先用C++实现单链表编程,再基于编写好的单链表类,实现堆栈类的定义和实现。<br> c. 链表类和堆栈类都要包含必要的成员函数(按照教材要求)。<br>2、 已知a[n]为整数数组,试写出实现下列运算的递归代码(C或C++代码均可):<br>要求: a. 求数组中的最大整数;<br> b. 求n个数的和;<br> c. 利用堆栈类,将本题a和b的代码改成非递归的方式。<br>实验报告要求:<br>按要求写出完整的实验代码;<br><br>实验四 综合(课程设计)<br>内容及步骤:<br>1、假定一维数组a[n]中的每个元素值均在[0,200]区间内,用C++编写一个算法,分别统计出落在[0,20],[21,50],[51,80],[81,130],[131,200]等各区间内的元素个数。<br>2、 请用C++编写一个算法,完成以下功能:<br>a. 从键盘输入一段文字,以$作结束符号;<br>b. 统计文字中的文本行数,字母,数字以及其他符号的数量,并在屏幕上显示;<br>3、 请用C++编写一个算法,完成矢量的加法与成法运算,运算规则如下:<br>a. 矢量加法:(a1,a2,……,an)+(b1,b2,……,bn)=(a1+b1,a2+b2,……,an+bn);<br>b. 矢量减法:(a1,a2,……,an)-(b1,b2,……,bn)=(a1-b1,a2-b2,……,an-bn);<br>c. 矢量点积:(a1,a2,……,an)*(b1,b2,……,bn)=(a1*b1,a2*b2,……,an*bn);<br>d. 矢量与实数相乘:a*(b1,b2,……,bn)=(a*b1,a*b2,……,a*bn);<br>4、 请用C++结合链表编写一个简单的机票订票程序,要求完成以下功能:<br>a. 允许出现多个班机;<br>b. 创建一个班机链表,每个节点都包含指向一个乘客链表的指针;<br>c. 该程序要有顾客购票,查询班机起飞降落时间,班机订票情况等3个功能,并实现菜单选项<br>5、 用C++编写一个简单的行编辑器,每个结点保存一行文本,程序以E file开始,然后显示行数和提示符,如果输入I,后面跟着一个数字n,就在第n行之前插入后续文本,如果I后面没有跟数字,就在当前行之前插入文本,如果输入D,后面跟着m,n,一个数字n或者没有数字,就分别删除m到n行,第n行或者当前行,命令L用于显示文本;<br>6、 用C++编写求多项式的和与积的算法,要求如下: <br>a. 要求从键盘分别输入2个多项式的系数以及最高次幂;<br>b. 通过重载操作符+和*,完成多项式的和与积的计算;<br>c. 输出运算结果;<br>7、 编写一个程序,将10进制数转换为其它(2-9)进制数。可以将要转换的数重复除以基数,然后讲除的余数按反方向排列来实现;<br>8、 已知A[n]为正数数组,试写出实现下列运算的递归算法;<br>a. 求数组A中的最大整数;<br>b. 求n个数的平均值;<br>c. 求n个整数的平均值;<br>9、 已知f为单链表的表头指针,链表中存储的都是整型数据,试写出实现下列运算的递归算法:<br>a. 求链表中的最大整数;<br>b. 求链表的结点个数;<br>c. 求所有整数的平均数;<br>告要求:<br>写出能运行的完整的代码。<br><br>实验五 二叉树(一)<br>实验目的:<br>通过实验掌握下列知识: <br>1、熟悉二叉树的存储结构和遍历算法;<br>2、通过二叉树遍历操作了解递归的本质和方法;<br>内容及步骤:<br>1、 试建立一个二叉搜索树,并实现以下成员函数:<br>a. 默认构造函数和带数据域、左子树指针、右子树指针的构造函数;<br> b. 按照二叉搜索树的要求设计插入函数Insert(int Info);<br> c. 用递归的方法设计前序遍历和后续遍历函数,遍历时要输出遍历的每个结点;<br> d. 设计一个构造函数,当对象结束时,要释放整个二叉搜索树所占的内存空间(提示,通过后序遍历算法找到叶结点,并删除叶结点,不断重复此过程,直到整科树为空);<br>2、实现1所要求的代码后,运行设计好的代码,将以下的几组整数序列建成搜索二叉树,并记录下它们的前序遍历序列和后序遍历序列:<br>a. 1、3、5、7、9;<br>b. 1、13、35、13、27;<br> c. 50、25、78、13、44、99、66。<br>实验报告要求:<br>1、 按要求记录下二叉搜索树的完整实验代码;<br>2、 按要求记录下要求的输出结果。<br><br><br>实验六 二叉树(二)<br>实验目的:<br>通过实验掌握下列知识: <br>1、继续熟悉二叉树的存储结构和遍历算法;<br>2、熟悉二叉搜索树的应用,并做一个小型的课程设计;<br>内容及步骤:<br>1、 在前一个实验的基础上,继续增加搜索函数Search(int Info)(如果找到结点,返回指向该结点的指针,如果没有,则返回空指针)和删除函数bool Delete(int Info),如果找到结点,则删除该结点,并保持二叉搜索树的基本结构,并返回true,否则返回false;<br>2、利用二叉搜索树实现一个音像商店(小型书店、小型超市、或小型药店)的交易管理系统,要求实现以下功能:<br>a. 该系统应该有一个字符型的主菜单;<br>b. 能按字母顺序显示库存商品的名称和数量;<br>c. 能添加和删除新的商品;<br>d. 当输入一个商品时,能显示该商品是否在库存中,如存在库存中,则显示其名称和数量,否则显示“未找到”。<br>e. 如有可能,请建立一个存储商品名称和数量的文本文件,并为二叉搜索树建立一个成员函数SetupInventory(),用于从该文本文件中读取库存商品的数据,<br>实验报告要求:<br>1、 按要求记录下二叉搜索树的完整实验代码;<br>2、 按要求记录下要求的输出结果。<br><br>实验六 图(课程设计)<br>实验目的:<br>通过实验掌握下列知识: <br>1、熟悉图的存储结构和遍历算法;<br>2、熟悉图的应用,并做一个小型的课程设计;<br>内容及步骤:<br>1、 设计一个图的类,采用临接表法进行存储,该图每个结点的数据类型类模板的模板参数进行定义(注:需先设计一个结点类Node);<br>2、 为该类分别设计一个实现深度优先搜索和广度优先搜索的成员函数,并要输出搜索结果;<br>注: 1、为了让你设计的图类拥有数据,可以设计一个成员函数,用于构造你自己预先设计好的图;<br> 2、要求的图如下,也可以自己构造图,但是需要注意的是,图不能是退化的单链表:<br> <br>实验报告要求:<br>1、 按要求记录下图的类的完整实验代码;<br>2、 纪录你所使用的图;<br>3、 按要求记录下要求的输出结果;<br><br><br>实验八 综合实验<br>内容及步骤:<br>1、请使用C++编写班级学生学籍管理程序<br>每个学生的信息包括:姓名、学号和英语、数学、程序设计及体育成绩。从键盘输入数据,建立数据文件student.dat,然后,利用C++编程完成如下处理:<br>(1)对学生姓名或学号进行查询,显示其信息 。<br>(2)对所有学生,按班级计算每一科平均成绩。<br>(3)分别按英语、数学、程序设计及体育成绩排序并输出到文件。<br>注:要用面向对象的方法来设计程序,每个班是一个类的实例;<br>2、用链表建立通讯录。通讯录内容有:姓名、通讯地址、电话号码。<br> (1)通讯录是按姓名项的字母顺序排列的;<br>(2)能查找通讯录中某人的信息;<br>(3)能添加和删除通讯录中的指定项。<br>注:要用面向对象的方法来设计程序,每个通讯录是一个类的实例;<br>3、从终端读入字符集大小为n(即字符的个数),逐一输入n个字符和相应的n个权值(即字符出现的频度),建立哈夫曼树,进行编码并且输出。<br>注:可用C或C++编写。<br>4、用邻接矩阵或邻接图实现一个有向图的存储,并实现单源最短路径算法的实现(这个类的一个成员函数),并能输出该图的关键路径。<br>注:1、要用面向对象的方法设计代码;<br>2、一个图是一个类的实例;<br>3、类中要指出该图的起点。<br>实验报告要求:<br>写出完整的代码。<br><br><br><br>习题1 绪论------------------------------------------------------------------------------------6<br>习题2 线性表---------------------------------------------------------------------------------8<br>习题3 栈和队列------------------------------------------------------------------------------11<br>习题4 串---------------------------------------------------------------------------------------13<br>习题5 数组------------------------------------------------------------------------------------15<br>习题6 树与二叉树---------------------------------------------------------------------------17<br>习题7 图---------------------------------------------------------------------------------------24<br>习题8 查找------------------------------------------------------------------------------------31<br>习题9 排序------------------------------------------------------------------------------------34<br> <br>第1部分 C++基本知识<br>各种数据结构以及相应算法的描述总是要选用一种语言工具。在计算机科学发展过程中,早期数据结构教材大都采用PASCAL语言为描述工具,后来出现了采用C语言为描述工具的教材版本、至今又出现了采用C++语言为描述工具的多种教材版本。本教实验指导书是为已经学习过C++语言的学生而编写。编写实验指导书目的为了配合理论教学。程序要求在C++ Builder开发环境之下调试运行,采用面向对象方法进行设计。典型的数据结构被设计成为类(class),典型算法设计成为类的函数成员,然后在主函数中声明创建类对象,根据实际需要调用重要的算法。<br>由于C++的使用具有一定的难度,为了同学更好的学习数据结构自身的知识内容,减轻描述工具所带来的困难,这里针对数据结构上机实验所必须的C++基本知识(结构体、类等等)做补充介绍。<br>一、 源程序组成<br><br> 这部分内容详细参见本指导书的第3部分的程序实例。<br>二、结构体及运用<br>数据结构课程所研究的问题均运用到“结构体”和“类”。在C++语言中结构体和函数又是理解和掌握“类”的语法基础。定义结构体的一般格式:<br>struct 结构体类型名<br> { 类型名1 变量名1; //数据子域<br>类型名2 变量名2;……<br>类型名n 变量名n;<br>}<br>其中struct是保留字。结构体类型名由用户自己命名。在使用时必须声明一个具体的结构体类型的变量,声明创建一个结构体变量的方法是:<br> 结构体类型名 结构体变量名;<br>一个结构体中可以包含多个数据子域。数据子域的类型名一般指基本数据类型(int char 等),也可是已经定义的另一结构体名。数据子域变量名可以是简单变量,也可以是数组。它们也可以称为结构体的数据成员,它们的访问控制具有‘公有’属性。<br>1. 通过“结构体变量名.数据子域” 可以访问数据子域。<br> // 设计Student结构体,在主程序中运用。<br>#include <iostream.h><br>#include <conio.h><br>#include <string.h><br>struct Student //定义结构体Student<br>{ long num; // 学号<br> int x; // 成绩<br> char name[10]; // 姓名<br>}<br>int main( ) <br> { Student s1; //声明创建一个结构体变量s1<br>//为s1的数据子域提供数据<br>s1.num=1001 ; <br>s1. x=83; <br>strcpy( s1.name, “ 李 明”); <br>//输出结构体变量s1 的内容<br>cout<< “ 姓名: ”<< s1.name <<endl;;<br>cout<< “ 学号: ”<< s1.num<<endl:<br>cout<< “ 成绩:”<< s1.x <<ednl; <br>_getch(); return 0;<br> }<br> 2. 设计一维数组,每个数组元素是Student结构体类型,通过以下语句段可以说明结构体数组的一般用法:通过“结构体数组名[下标].数据子域”访问数据域。<br> Student a[5]; //声明创建一个结构体数组a<br> for(int i=0, i<5, i++)<br>{ cout<<“学号:”; cin>>a[i].num; //输出数组元素a[i]的学号域<br>cout<<“姓名:”; cin>> a[i].name; //输出数组元素a[i]的姓名域<br>cout<<“成绩:”; cin>>a[i].x; //输出数组元素a[i]的成绩域 <br> } <br>以上是关于结构体的基本概念和简单运用。<br><br><br>三、 类的基本概念及运用<br>类的是面向对象程序的基本单位。类是由数据成员和相关的函数成员组成。从面向对象的角度考虑“学生”这个类,它不仅包括“学生”的一般属性:学号、姓名、成绩等等,还应包括对于这些属性的操作:输入/输出、听课、实验、等等。 <br>类定义的一般格式:<br>class 类名<br> { 若干数据成员;<br> 若干函数成员;<br> };<br>类的数据成员和函数成员均存在访问控制权限问题。访问控制分为三种:公有(public)、私有(private)和受护(protected)。<br>数据成员的定义和结构体中的数据域定义是相似的。不同的是它们必须明确访问控制。而公有数据成员,可以认为与结构体的数据域的访问权限相同。<br>成员函数的定义又和一般函数的定义基本相同。不同的是类中成员函数也必须明确访问控制权限。如果在类之中定义成员函数带函数体,并未有什么特殊之处。如果在类之中仅有成员函数的原型声明,当在类定义之外定义函数体时,需要加上类限定标识“类名::”。下面是“学生”类的定义:<br>class Students //定义类结构体Students<br> { private: //私有成员<br>long num; // 学号<br> int x; // 成绩<br> char name[10]; // 姓名<br>public: //公有成员<br> Students();<br> ~Students() { };<br> void SetDat( long n, int x0, char *na0 ) <br>{ num=n; x=x0; strcpy( name,na0);<br>}<br> void PrintOut( ); //输出函数的原型声明<br> …….;<br>};<br>void Students::PrintOut( ) // 输出函数前加Students:: <br> { cout<< “ 姓名: ”<< name <<endl;;<br>cout<< “ 学号: ”<< num<<endl:<br>cout<< “ 成绩:”<< x <<ednl; <br> }<br> 在主程序中运用类 Students。<br>int main( ) <br> { Students s; //声明创建一个类对象s,调用构造函数<br>s.PrintOut( ); //输出s的内容<br>long m; int y; char xname[10]; <br>cout<< “ 输入学号,成绩,姓名:” ;<br>cin>>m>>y>>xname;<br>s. SetDat( m, y, xname ) ; //修改对象s数据 <br>s. PrintOut(); //输出改变后s的内容<br>_getch(); return 0;<br>}<br>运行结果:<br> 姓名:O<br>学号:0<br>成绩:0 <br>输入学号,成绩,姓名:1001 90 WangMing<br>姓名:WangMing<br>学号:1001<br>成绩:90<br>这个例题中数据成员全部定义为私有(private),以便保证数据安全性。<br>而函数成员全部定义为公有(public)成员函数,可以作为类对外部的的接口。 通过s. SetDat( m, y, xname ) ; 直接访公有函数成员SetDat( ), 将实参(主函数的局部变量m, y, xname) 的数据赋给私有数据成员 num,x,name。 通过 s.PrintOut( );直接访公有函数成员PrintOut( ),间接访问输出私有成员num,x,name。<br>四、 结构体在类中的使用<br> 1.结构体数组做类的数据成员<br>const int MAXSIZE=100; // 数组的容量<br>struct ElemType // 数据元素的类型<br> { int numb;<br> char name[20];<br> long tel;<br> };<br>class Sqlist<br> { private:<br> ElemType elem[MAXSIZE]; //结构体ElemType类型的数组elem[ ]做数据成员<br> int length;<br> public:<br> Sqlist( void);<br> ~Sqlist(){ };<br>//其他函数……<br>};<br>2.结构体指针变量做类的数据成员<br>struct NodeType // 结点的结构定义<br> { int data; // 数据域 <br> NodeType *next; // 指针域 <br> };<br>class Link //类声明<br>{ private:<br> NodeType *Head; //指向结构构体NodeType的指针变量Head做数据成员 <br> public:<br> Link ( ){ Head=new NodeType; // 为头结点申请空间<br> Head->next=Head; // 头结点Head 形成空环<br> };<br> ~ Link (){ };<br> void creat();<br> void outs(); <br> };<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>第2部分 书面练习题<br>习题1 绪论<br>1.1 单项选择题<br>1. 数据结构是一门研究非数值计算的程序设计问题中,数据元素的① 、数据信息在计算机中的② 以及一组相关的运算等的课程。<br> ① A.操作对象 B.计算方法 C.逻辑结构 D.数据映象<br> ② A.存储结构 B.关系 C.运算 D.算法<br>2. 数据结构DS(Data Struct)可以被形式地定义为DS=(D,R),其中D是① 的有限集合,R是D上的② 有限集合。<br> ① A.算法 B.数据元素 C.数据操作 D.数据对象<br> ② A.操作 B.映象 C.存储 D.关系<br>3. 在数据结构中,从逻辑上可以把数据结构分成 。<br>A.动态结构和静态结构 B.紧凑结构和非紧凑结构 <br>C.线性结构和非线性结构 D.内部结构和外部结构<br>4. 算法分析的目的是① ,算法分析的两个主要方面是② 。<br>① A. 找出数据结构的合理性 B. 研究算法中的输入和输出的关系<br>C. 分析算法的效率以求改进 D. 分析算法的易懂性和文档性<br>② A. 空间复杂性和时间复杂性 B. 正确性和简明性<br>C. 可读性和文档性 D. 数据复杂性和程序复杂性<br>5. 计算机算法指的是① ,它必具备输入、输出和② 等五个特性。<br> ① A. 计算方法 B. 排序方法<br>C. 解决问题的有限运算序列 D. 调度方法<br>② A. 可行性、可移植性和可扩充性 B. 可行性、确定性和有穷性 <br> C. 确定性、有穷性和稳定性 D. 易读性、稳定性和安全性<br><br>1.2 填空题(将正确的答案填在相应的空中)<br>1. 数据逻辑结构包括 、 和 三种类型,树形结构和图形结构合称为 。<br>2. 在线性结构中,第一个结点 前驱结点,其余每个结点有且只有 个前驱结点;最后一个结点 后续结点,其余每个结点有且只有 个后续结点。<br>3. 在树形结构中,树根结点没有 结点,其余每个结点有且只有 个直接前驱结点,叶子结点没有 结点,其余每个结点的直接后续结点可以 。<br>4. 在图形结构中,每个结点的前驱结点数和后续结点数可以 。<br>5. 线性结构中元素之间存在 关系,树形结构中元素之间存在 关系,图形结构中元素之间存在 关系。<br>6. 算法的五个重要特性是__ __ , __ __ , ___ _ , __ __ , _ ___。<br>7. 分析下面算法(程序段),给出最大语句频度 ,该算法的时间复杂度是__ __。<br>for (i=0;i<n;i++)<br> for (j=0;j<n; j++)<br> A[i][j]=0;<br>8. 分析下面算法(程序段),给出最大语句频度 ,该算法的时间复杂度是__ __。<br>for (i=0;i<n;i++)<br> for (j=0; j<i; j++)<br>A[i][j]=0;<br>9. 分析下面算法(程序段),给出最大语句频度 ,该算法的时间复杂度是__ __。<br>s=0;<br>for (i=0;i<n;i++)<br> for (j=0;j<n;j++)<br> for (k=0;k<n;k++)<br> s=s+B[i][j][k];<br>sum=s;<br>10. 分析下面算法(程序段)给出最大语句频度 ,该算法的时间复杂度是__ __。<br>i=s=0;<br>while (s<n)<br>{ i++; <br> s+=i; //s=s+i <br>} <br>11. 分析下面算法(程序段)给出最大语句频度 ,该算法的时间复杂度是__ __。<br>i=1;<br>while (i<=n)<br> i=i*2;<br>1.3 算法设计题<br>1. 试写一算法,自大到小依次输出顺序读入的三个数X,Y和Z的值.<br>2. 试写一算法,求出n个数据中的最大值。写出最大语句频度,该算法的时间复杂度。<br> 习题答案<br> 1.1 1. C , A 2. B,D 3. C 4. C, A 5. C,B<br>1.2 1. 线性结构、树形结构、图形结构,非线性结构<br> 2. 没有、1、没有、1<br> 3. 前驱、1、后续、任意多个<br> 4. 任意多个<br> 5. 一对一、一对多、多对多<br> 6. 有穷性、确定性、可行性、输入、输出<br> 7. 最大语句频度:n2 , 时间复杂度:. O (n2)<br> 8. 最大语句频度:n (n+1)/2 , 时间复杂度:. O (n2)<br> 9. 最大语句频度:n3 , 时间复杂度:. O (n3)<br>10. 最大语句频度:n , 时间复杂度:. O (n ) <br>11. 最大语句频度:log2n, 时间复杂度:. O (log2n )<br><br><br><br><br>习题2 线性表<br>2.1 单项选择题<br>1. 一个向量(即一批地址连续的存储单元)第一个元素的存储地址是100,每个元素的长度为2,则第5个元素的地址是__ __。<br> A. 110 B. 108 C. 100 D. 120<br>2. 线性表的顺序存储结构是一种__ _的存储结构,而链式存储结构是一种__ _的存储结构。<br>A.随机存取 B.索引存取 C.顺序存取 D.散列存取<br>3. 线性表的逻辑顺序与存储顺序总是一致的,这种说法__ _。<br>A. 正确 B. 不正确<br>4. 线性表若采用链式存储结构时,要求内存中可用存储单元的地址__ _。<br>A. 必须是连续的 B. 部分地址必须是连续的<br>C. 一定是不连续的 D. 连续或不连续都可以<br>5. 在以下的叙述中,正确的是__ _。<br>A. 线性表的顺序存储结构优于链表存储结构<br>B. 线性表的顺序存储结构适用于频繁插入/删除数据元素的情况<br>C. 线性表的链表存储结构适用于频繁插入/删除数据元素的情况<br>D. 线性表的链表存储结构优于顺序存储结构<br>6. 每种数据结构都具备三个基本运算:插入、删除和查找,这种说法__ _。<br>A. 正确 B. 不正确<br>7. 不带头结点的单链表head为空的判定条件是____。<br>A. head= =NULL B. head->next= =NULL<br>C. head->next= =head D. head!=NULL<br>8. 带头结点的单链表head为空的判定条件是____。<br>A. head= =NULL B. head->next= =NULL<br>C. head->next= =head D. head!=NULL<br>9. 非空的循环单链表head的尾结点(由p所指向)满足____。<br>A. p->next= =NULL B. p= =NULL<br>C. p->next= =head D. p= =head <br> 10. 在双向循环链表的p所指结点之后插入s所指结点的操作是____。<br>A. p->right=s; s->left=p; p->right->left=s; s->right=p->right;<br>B. p->right=s; p->right->left=s; s->left=p; s->right=p->right;<br>C. s->left=p; s->right=p->right; p->right=s; p->right->left=s;<br>D. s->left=p; s->right=p->right; p->right->left=s; p->right=s;<br> 11. 在一个单链表中,已知q所指结点是p所指结点的前驱结点,若在q和p之间插入s结点,则执行____。<br>A. s->next=p->next; p->next=s; B. p->next=s->next; s->next=p;<br>B. q->next=s; s->next=p; C. p->next=s; s->next=q;<br>12. 在一个单链表中,若p所指结点不是最后结点,在p之后插入s所指结点,则执行____。<br>A. s->next=p; p->next=s; B. s->next=p->next; p->next=s;<br>C. s->next=p->next; p=s; C. p->next=s; s->next=p;<br>13. 在一个单链表中,若删除p所指结点的后续结点,则执行____。<br>A. p->next= p->next->next; B. p= p->next; p->next= p->next->next;<br>C. p->next= p->next; D. p= p->next->next;<br>14. 从一个具有n个结点的单链表中查找其值等于x结点时,在查找成功的情况下,需平均比较____个结点。<br>A. n B. n/2 C. (n-1)/2 D. (n+1)/2<br> 15. 在一个具有n个结点的有序单链表中插入一个新结点并仍然有序的时间复杂度是__ __。<br>A. O(1) B. O(n) C. O (n2) D. O (nlog2n)<br> 16. 给定有n个元素的向量,建立一个有序单链表的时间复杂度是__ __。<br>A. O(1)) B. O(n) C. O (n2) D. O (n*log2n)<br>2.2 填空题(将正确的答案填在相应的空中)<br>1. 单链表可以做__ __的链接存储表示。<br>2. 在双链表中,每个结点有两个指针域,一个指向____ __,另一个指向___ __。<br>3. 在一个单链表中p所指结点之前插入一个s (值为e)所指结点时,可执行如下操作:<br>q=head;<br>while (q->next!=p) q=q->next;<br>s= new Node; s->data=e;<br>q->next= ; //填空<br>s->next= ; //填空<br>4. 在一个单链表中删除p所指结点的后继结点时,应执行以下操作:<br>q= p->next;<br>p->next= _ ___; //填空<br>delete ; //填空<br>5. 在一个单链表中p所指结点之后插入一个s所指结点时,应执行s->next=__ __和p->next=____的操作。<br> 6. 对于一个具有n个结点的单链表,在已知p所指结点后插入一个新结点的时间复杂度是__ __;在给定值为x的结点后插入一个新结点的时间复杂度是__ __。<br>2.3 算法设计题:<br>1.设顺序表va中的数据元数递增有序。试写一算法,将x插入到顺序表的适当位置上,以保持该表的有序性。<br>2.试写一算法,实现顺序表的就地逆置,即利用原表的存储空间将线性表(a1, a2,…. an)逆置为(an, an-1,…., a1)。<br>3. 已知线性表中的元素以值递增有序排列,并以单链表作存储结构。试写一算法,删除表中所有大于x且小于y的元素(若表中存在这样的元素)同时释放被删除结点空间。<br>4. 试写一算法,实现单链表的就地逆置(要求在原链表上进行)。<br> 习题答案<br> 2.1 1. B 2. A, C 3. B 4. D 5. C 6. A 7. A 8. B<br> 9. C 10. D 11.B 12.B 13.A 14.D 15.B 16.C<br> 2.2 1. 线性结表 2. 前驱结点、后继结点<br> 3. s, p 4. q->next, q<br> 5. p->next, s 6. O (1) , O (n)<br><br>习题3 栈和队列<br>3.1 单项选择题<br>1. 一个栈的入栈序列a,b,c,d,e,则栈的不可能的输出序列是____。<br> A. edcba B. decba C. dceab D. abcde <br>2. 若已知一个栈的入栈序列是1,2,3,…,n,其输出序列为p1,p2,p3,…,pn,若p1=n,则pi为____。<br> A. i B. n=i C. n-i+1 D. 不确定<br>3. 栈结构通常采用的两种存储结构是____。<br>A. 顺序存储结构和链式存储结构<br>B. 散列方式和索引方式<br>C. 链表存储结构和数组<br>D. 线性存储结构和非线性存储结构<br>4. 判定一个顺序栈ST(最多元素为m0)为空的条件是____。<br>A. top !=0 B. top= =0 C. top !=m0 D. top= =m0-1<br>5. 判定一个顺序栈ST(最多元素为m0)为栈满的条件是____。<br>A. top!=0 B. top= =0 C. top!=m0 D. top= =m0-1<br>6. 栈的特点是____,队列的特点是____。<br> A. 先进先出 B. 先进后出<br>7. 向一个栈顶指针为HS的链栈中插入一个s所指结点时,则执行__ __。<br>(不带空的头结点)<br>A. HS—>next=s;<br>B. s—>next= HS—>next; HS—>next=s;<br>C. s—>next= HS; HS=s;<br>D. s—>next= HS; HS= HS—>next;<br>8. 从一个栈顶指针为HS的链栈中删除一个结点时,用x保存被删结点的值,则执行__ __。(不带空的头结点) <br>A. x=HS; HS= HS—>next; B. x=HS—>data;<br>C. HS= HS—>next; x=HS—>data; D. x=HS—>data; HS= HS—>next;<br>9. 一个队列的数据入列序列是1,2,3,4,则队列的出队时输出序列是____ 。<br> A. 4,3,2,1 B. 1,2,3,4 <br> C. 1,4,3,2 D. 3,2,4,1<br>10. 判定一个循环队列QU(最多元素为m0)为空的条件是____。<br>A. rear - front= =m0 B. rear-front-1= =m0<br>C. front= = rear D. front= = rear+1<br>11. 判定一个循环队列QU(最多元素为m0, m0= =Maxsize-1)为满队列的条件是____。<br>A. ((rear- front)+ Maxsize)% Maxsize = =m0<br>B. rear-front-1= =m0 C. front= =rear <br>D. front= = rear+1<br>12. 循环队列用数组A[0,m-1]存放其元素值,已知其头尾指针分别是front和rear,则当前队列中的元素个数是____。<br>A. (rear-front+m)%m B. rear-front+1<br>C. rear-front-1 D. rear-front<br>13. 栈和队列的共同点是____。<br>A. 都是先进后出 B. 都是先进先出<br>C. 只允许在端点处插入和删除元素 D. 没有共同点<br>3.2 填空题(将正确的答案填在相应的空中)<br>1. 向量、栈和队列都是____结构,可以在向量的____位置插入和删除元素;对于栈只能在____插入和删除元素;对于队列只能在____插入元素和____删除元素。<br>2. 向一个长度为n的向量的第i个元素(1≤i≤n+1)之前插入一个元素时,需向后移动____个元素。<br>3. 向一个长度为n的向量中删除第i个元素(1≤i≤n)时,需向前移动____个元素。<br>4. 向栈中压入元素的操作是____。<br>5. 对栈进行退栈时的操作是____。<br>6. 在一个循环队列中,队首指针指向队首元素的____。<br>7. 从循环队列中删除一个元素时,其操作是____。<br>8. 在具有n个单元的循环队列中,队满时共有____个元素。<br>9. 一个栈的输入序列是12345,则栈的输出序列43512是____。<br>10. 一个栈的输入序列是12345,则栈的输出序列12345是____。<br>3.3 算法设计题:<br>1. 输入一个任意的非负十进制整数,输出与其等值的八进值数。<br>2. 按照四则运算加、减、乘、除和幂运算(↑)优先关系的惯例,并仿照教科书3.2节例3—1的格式,画出对下列算术表达式求值时操作数栈和运算符栈的变化过程:<br>A-B*C/D+E↑F<br>3. 假设以带头结点的循环链表表示队列,并且只设一个指针指向队尾元素结点(注意不设头指针),试编写相应的队列初始化、入队列和出队列的算法。<br><br> 习题答案<br>3.1 1. C 2. C 3. A 4. B 5.D 6. BA 7.C 8. B 9. C 10. C <br>11. A 12. A 13.C <br>3.2 1. 线性、任何、栈顶、队尾、队首 2. n-i+1 3. n-i<br> 4.先移动栈顶指针,后存入元素 5. 先取出元素,后移动栈顶指针<br> 6.前一个位置 7. 先移动队首元素,后取出元素<br> 8. n-1 9. 不可能的 10. 可能的<br><br><br>习题4 串<br>4.1 单项选择题<br>1.以下叙述中正确的是 。<br>A.串是一种特殊的线性表 B.串的长度必须大于零<br>C.串中无素只能是字母 D.空串就是空白串<br>2.空串与空格串是相同的,这种说法____。<br>A. 正确 B. 不正确<br>3.串是一中特殊的线性表,其特殊性体现在____。<br>A. 可以顺序存储 B. 数据元素是一个字符<br>C. 可以链接存储 D. 数据元素可以是多个字符<br>4.设有两个串p和q,求q在p中首次出现的位置的运算称作____。<br>A. 连接 B. 模式匹配<br>C. 求子串 D. 求串长<br>5.设串s1=’ABCDEFG’,s2=’PQRST’,函数con (x,y)返回x和y串的连接串,subs(s,i,j)返回串s的从序号i的字符开始的j个字符组成的子串,len(s)返回串s的长度,则con (subs (s1,2,len (s2)), subs (s1,len (s2),2))的结果串是____。<br>A. BCDEF B. BCDEFG<br>C. BCPQRST D. BCDEFEF<br>6.设串的长度为n,则它的子串个数为 。<br>A.n B.n(n+1) C.n(n+1)/2 D.n(n+1)/2+1<br>4.2 填空题(将正确的答案填在相应的空中)<br>1.串的两种最基本的存储方式是____。<br>2.两个串相等的充分必要条件是____。<br>3.空串是____,其长度等于____。<br>4.空格串是____,其长度等于____。<br>5.设s=’I︺AM︺A︺TEACHER’,其长度是____。<br>4.3 判断题<br>1.串是由有限个字符构成的连续序列,串长度为串中字符的个数,子串是主串中<br>符构成的有限序列。 ()<br>2.子串定位函数的时间复杂度在最坏情况下为O(n*m),因此子串定位函数没有实际使用的价值。 ()<br>3.KMP算法的最大特点是指主串的指针不需要回溯。 ()<br>4.设模式串的长度为m,目标串的长度为n;当n≈m且处理只匹配一次的模式时,朴素的匹配(即子串定位函数)算法所花的时间代价也可能会更为节省。 ()<br>5.如果一个串中的所有字符均在另一串中出现,则说前者是后者的子串。 ()<br>4.3 算法设计题<br>1.编写算法,从串s 中删除所有和串 t相同的子串。<br>2.编写算法,实现串的基本操作Replace(&S,T,V)。<br>3.写一个递归算法来实现字符串逆序存储,要求不另设存储空间。<br>习题答案<br>4.1 1.A 2.B 3.B 4.B 5.D 6.C<br>4.2 <br>1.顺序存储方式和链接存储方式<br> 2.两个串的长度相等且对应位置的字符相同<br> 3.零个字符的串、零<br> 4.由一个或多个空格字符组成的串、其包含的空格个数<br> 5.14<br>4.3 × × √ √ ×<br>4.4 <br>3. void reverse(char arr[])<br>{char ch;<br> int i=1; <br>do{cin>>ch;<br> reverse(arr);<br> arr[i]=ch;<br> i++;<br> }while(ch!=’#’&&i<n)<br>}<br><br>习题5 数组和广义表<br>5.1 单项选择题<br>1. 常对数组进行的两种基本操作是____。<br>A. 建立与删除 B. 索引和修改 <br> C. 对数据元素的存取和修改 D. 查找与索引<br>2. 二维数组M的成员是6个字符(每个字符占一个存储单元,即一个字节)组成的串,行下标i的范围从0到8,列下标j的范围从0到9,则存放M 至少需要①_ _个字节;M数组的第8列和第5行共占②____个字节。<br>① A. 90 B. 180 C. 240 D. 540<br>② A. 108 B. 114 C. 54 D. 60<br>3. 二维数组A中,每个元素的长度为3个字节,行下标i从0到7,列下标j从0到9,从首地址SA开始连续存放在存储器内,存放该数组至少需要的字节数是____。<br>A. 80 B. 100 C.240 D. 270<br> 4. 二维数组A中,每个元素A的长度为3个字节,行下标i从0到7,列下标j从0到9,从首地址SA开始连续存放在存储器内,该数组按行存放时,数组元素A[7][4]的起始地址为____。<br>A. SA+141 B. SA+144 C. SA+222 D. SA+225<br> 5. 二维数组A中,每个元素A的长度为3个字节,行下标i从0到7,列下标j从0到9,从首地址SA开始连续存放在存储器内,该数组按列存放时,元素A[4][7]的起始地址为____。<br>A. SA+141 B. SA+180 C. SA+222 D. SA+225<br>5.2 填空题(将正确的答案填在相应的空中)<br>1. 已知二维数组A[m][n]采用行序为主方式存储,每个元素占k个存储单元,并且第一个元素的存储地址是LOC(A[0][0]),则A[i][j]的地址是_______。<br>2. 二维数组A[10][20]采用列序为主方式存储,每个元素占一个存储单元并且A[0][0]的存储地址是200,则A[6][12]的地址是____。<br>3. 二维数组A[10..20][5..10]采用行序为主方式存储,每个元素占4个存储单元,并且A[10][5]的存储地址是1000,则A[18][9]的地址是____。<br>4.求下列广义表操作的结果:<br>(1) GetTail[GetHead[((a,b),(c,d))]];<br>(2) GetTail[GetHead[GetTail[((a,b),(c,d))]]]<br>5.利用广义表的GetHead和GetTail操作写出如上题的函数表达式,把原子banana分别从下列广义表中分离出来.<br> (1) L1=(((apple)),((pear)),(banana),orange);<br> (2) L2=(apple,(pear,(banana),orange));<br>5.3 算法设计题:<br>1. 假设稀疏矩阵A和B均以三元组顺序表作为存储结构。试写出矩阵相加的算法,另设三元组表C存放结果矩阵。<br>2. 假设系数矩阵A和B均以三元组顺序表作为存储结构。试写出满足以下条件的矩阵相加的算法:假设三元组顺序表A的空间足够大,将矩阵B加到矩阵A上,不增加A,B之外的附加空间,你的算法能否达到O(m+n)的时间复杂度?其中m和n分别为A,B矩阵中非零元的数目。<br>3.试编写一个以三元组形式输出用十字链表表示的稀疏矩阵中非零元素及其下标的算法。<br>习题答案<br> 5.1 1. C 2. D,A 3.C 4. C 5. B <br> 5.2 1. LOC (A[0][0])+(n*i+j)*k 2. 200+(6*20+12)= 326<br> 3. 1000+((18-10)*6 +(9-5))*4 = 1208<br> 4.(1). (b) (2). (d)<br>5. (1) GetHead [GetHead[GetTail[GetTail[L1]]]];<br>(2) GetHead [GetHead [GetHead[GetTail[L2 ]]]];<br><br>习题6 树和二叉树<br>6.1 单项选择题<br>1. 由于二叉树中每个结点的度最大为2,所以二叉树是一种特殊的树,这种说法____。<br>A. 正确 B. 错误<br>2. 假定在一棵二叉树中,双分支结点数为15,单分支结点数为30个,则叶子结点数为 个。 A.15 B.16 C.17 D.47<br>3. 按照二叉树的定义,具有3个结点的不同形状的二叉树有____种。<br>A. 3 B. 4 C. 5 D. 6<br>4. 按照二叉树的定义,具有3个不同数据结点的不同的二叉树有____种。<br>A. 5 B. 6 C. 30 D. 32<br>5. 深度为5的二叉树至多有____个结点。<br>A. 16 B. 32 C. 31 D. 10<br>6. 设高度为h的二叉树上只有度为0和度为2的结点,则此类二叉树中所包含的结点数至少为_ ___。 <br>A. 2h B. 2h-1 C. 2h+1 D. h+1<br>7. 对一个满二叉树,m个树叶,n个结点,深度为h,则____ 。<br>A. n=h+m B. h+m=2n C. m=h-1 D. n=2 h-1<br>8. 任何一棵二叉树的叶结点在先序、中序和后序遍历序列中的相对次序____。<br>A.不发生改变 B.发生改变 C.不能确定 D.以上都不对<br>9. 如果某二叉树的前根次序遍历结果为stuwv,中序遍历为uwtvs,那么该二叉树的后序为____。 A. uwvts B. vwuts C. wuvts D. wutsv<br>10. 二叉树的前序遍历序列中,任意一个结点均处在其子女结点的前面,这种说法____。 A. 正确 B. 错误<br>11. 某二叉树的前序遍历结点访问顺序是abdgcefh,中序遍历的结点访问顺序是dgbaechf,则其后序遍历的结点访问顺序是____。<br>A. bdgcefha B. gdbecfha C. bdgaechf D. gdbehfca<br>12. 在一非空二叉树的中序遍历序列中,根结点的右边____。<br>A. 只有右子树上的所有结点 B. 只有右子树上的部分结点<br>C. 只有左子树上的部分结点 D. 只有左子树上的所有结点<br>13. 如图6.1所示二叉树的中序遍历序列是____。<br>A. abcdgef B. dfebagc C. dbaefcg D. defbagc<br><br><br><br><br><br><br><br><br><br><br> <br><br> 图6.1 <br>14. 一棵二叉树如图6.2所示,其中序遍历的序列为__ __。<br>A. abdgcefh B. dgbaechf C. gdbehfca D. abcdefgh<br>15.设a,b为一棵二叉树上的两个结点,在中序遍历时,a在b前的条件是 。<br>A.a在b的右方 B.a在b的左方<br>C.a是b的祖先 D.a是b的子孙<br>16. 已知某二叉树的后序遍历序列是dabec,中序遍历序列是debac,它的前序遍历序列是____。 A. acbed B. decab C. deabc D. cedba<br>17. 实现任意二叉树的后序遍历的非递归算法而不使用栈结构,最佳方案是二叉树采用____存储结构。<br>A. 二叉链表 B. 广义表存储结构 C. 三叉链表 D. 顺序存储结构<br>18. 如图6.3所示的4棵二叉树,____不是完全二叉树。<br><br><br><br><br><br><br><br><br>19. 如图6.4所示的4棵二叉树,____是平衡二叉树。<br><br><br><br><br><br><br><br><br><br><br>20. 在线索化二叉树中,t所指结点没有左子树的充要条件是____。<br>A. t—>left=NULL B. t—>ltag=1<br>C. t—>ltag=1且t—>left=NULL D. 以上都不对<br>21. 二叉树按某种顺序线索化后,任一结点均有指向其前驱和后续的线索,这种说法____。 A. 正确 B. 错误<br>22. 二叉树为二叉排序树的充分必要条件是其任一结点的值均大于其左孩子的值、小于其右孩子的值。这种说法____。 A. 正确 B. 错误<br>23. 具有五层结点的二叉平衡树至少有____个结点。<br>A. 10 B. 12 C. 15 D. 17<br>24. 树的基本遍历策略可分为先根遍历和后根遍历;二叉树的基本遍历策略可分为先序遍历、中序遍历和后序遍历。这里,我们把由树转化得到的二叉树叫做这棵数对应的二叉树。结论____是正确的。<br>A.树的先根遍历序列与其对应的二叉树的先序遍历序列相同<br>B.树的后根遍历序列与其对应的二叉树的后序遍历序列相同<br>C.树的先根遍历序列与其对应的二叉树的中序遍历序列相同<br>D.以上都不对<br>25. 树最适合用来表示____。<br>A. 有序数据元素 B. 无序数据元素 <br>C. 元素之间具有分支层次关系的数据 D. 元素之间无联系的数据<br>6.2 填空题(将正确的答案填在相应的空中)<br>1. 有一棵树如图6.5所示,回答下面的问题:<br>⑴ 这棵树的根结点是____;<br>⑵ 这棵树的叶子结点是____;<br>⑶ 结点k3的度是____;<br>⑷ 这棵树的度是____;<br>⑸ 这棵树的深度是____;<br>⑹ 结点k3的子女是____;<br>⑺ 结点k3的父结点是____;<br> <br>2. 指出树和二叉树的三个主要差别____、____、____。<br>3. 从概念上讲,树与二叉树是两种不同的数据结构,将树转化为二叉树的基本目的是___ _。<br><br><br><br><br><br>4. 一棵二叉树的结点数据采用顺序存储结构,存储于数组t中,如图6.6所示,则该二叉树的链接表示形式为__ __。<br>5. 深度为k的完全二叉树至少有____个结点。至多有____个结点,若按自上而下,从左到右次序给结点编号(从1开始),则编号最小的叶子结点的编号是____。<br>6. 在一棵二叉树中,度为零的结点的个数为n 0,度为2的结点的个数为 n 2,则有n0=____。<br>7. 一棵二叉树的第i(i≥1)层最多有____个结点;一棵有n(n>0)个结点的满二叉树共有____个叶子和____个非终端结点。<br>8. 结点最少的树为____,结点最少的二叉树为____。<br>9. 现有按中序遍历二叉树的结果为abc,问有____种不同形态的二叉树可以得到这一遍历结果,这些二叉树分别是____。<br>10. 由如图6.7所示的二叉树,回答以下问题:<br>⑴ 其中序遍历序列为____;<br>⑵ 其前序遍历序列为____;<br>⑶ 其后序遍历序列为____;<br><br><br><br><br>6.3 简答题<br>1. 根据二叉树的定义,具有三个结点的二叉树有5种不同的形态,请将它们分别画出。<br>2. 假设一棵 二叉树的先序序列为EBADCFHGIKJ和中序序列为ABCDEFGHIJK。<br>请画出该树。<br>3. 由如图6.7所示的二叉树,回答以下问题:<br>(1)画出该二叉树的中序线索二叉树;<br>(2)画出该二叉树的后序线索二叉树;<br>(3)画出该二叉树对应的森林。<br>4. 已知一棵树如图6.8所示,转化为一棵二叉树,表示为____。<br><br><br><br>5. 以数据集{4,5,6,7,10,12,18}为结点权值,画出构造Huffman树的每一步图示,计算其带权路径长度为。<br>6. 一棵含有N个结点的k叉树,可能达到的最大深度和最小深度各为多少?<br>7. 证明:一棵满k叉树上的叶子结点数n 和非叶子结点数n 之间满足以下关系:<br> n =(k-1)n +1<br>6.4 算法设计题<br>1. 编写按层次顺序(同一层自左至右)遍历二叉树的算法。<br>2.试编写算法,对一棵二叉树,统计叶子的个数。<br>3.试编写算法,对一棵二叉树根结点不变,将左、右子树进行交换,树中每个结点的左、右子树进行交换。<br>7. 假设用于通讯的电文仅有八个字母(a,b,c,d,e,f,g,h)组成,字母在电文中出现的频率分别为0.07, 0.19, 0.02, 0.06, 0.32, 0.03, 0.21, 0.10。试为这八个字母设计哈夫曼编码。<br>使用0-7的二进制表示形式是另一种编码方案。对于上述实例,比较两种方案的优缺点。<br>8. 试编写算法,对一棵以孩子-兄弟链表表示的树统计叶子的个数。假设一棵 二叉树的先序序列为EBADCFHGIKJ和中序序列为ABCDEFGHIJK。请画出该树。<br> 习题答案<br>6.1 1. B 2. B 3. C 4. C 5. C 6. A 7. D 8. A 9. C 10. A<br>11. D 2. A 13. B 14. B 15. B 16. D 17. C 18. C <br>19. B 20. B 21. B 22. B 23. B 24. A 25. C <br>6.2 <br> 1. ⑴ k1 ⑵ k2,k5,k7,k4 ⑶ 2 ⑷ 3 ⑸ 4 ⑹ k5,k6 ⑺ k1 <br>2. 树的结点个数至少为1(不同教材规定不同),而二叉树的结点个数可以为0;<br>树中结点的最大度数没有限制,而二叉树结点的最大度数为2;<br>树的结点无左、右之分,而二叉树的结点有左、右之分;<br>3. 树可采用孩子-兄弟链表(二叉链表)做存储结构,目的并利用二叉树的已有算法解决树的有关问题。<br>4. 如图6.9所示 <br> 5. 2 k-1 、 2 k-1 、 2 k-2+1<br> 6. n2+1<br> 7. 2 i-1 2[log2n+1]-1 2[log2n+1] –1<br> 8. 只有一个结点的树;空的二叉树<br>9. 5;如图6.10所示<br>10. dgbaechif 、abdgcefhi 、gdbeihfca 、<br>6.3 1. 5种, 图6.11<br>2. 二叉树如图6.12所示。<br><br><br><br><br><br>3. 中序线索二叉树如图6.13(左)所示;后序线索二叉树如图6.13(右)所示;<br>该二叉树转换后的的森林如图6.14所示。<br><br><br><br><br><br><br><br><br><br><br><br><br>4. 图6.8的树转化为一棵二叉树如下,图6.15:<br><br><br><br><br><br><br><br><br>5. 画出构造Huffman树如图6.16所示,计算其带权路径长度为 。<br><br><br><br><br>6. 一棵含有N个结点的k叉树,可能达到的最大深度 h=N-k+1 ,<br>最小深度各为: logkN+1。<br><br>习题7 图<br>7.1 单项选择题<br>1.在一个图中,所有顶点的度数之和等于所有边数的____倍。<br>A. 1/2 B. 1 C. 2 D. 4 <br>2.任何一个无向连通图的最小生成树 。<br>A.只有一棵 B.有一棵或多棵 C.一定有多棵 D.可能不存在<br>3.在一个有向图中,所有顶点的入度之和等于所有顶点的出度之和的____倍。<br>A. 1/2 B. 1 C. 2 D. 4<br>4.一个有n个顶点的无向图最多有____条边。<br>A. n B. n(n-1) C. n(n-1)/2 D. 2n<br>5.具有4个顶点的无向完全图有____条边。<br>A. 6 B. 12 C. 16 D. 20<br>6.具有6个顶点的无向图至少应有____条边才能确保是一个连通图。<br>A. 5 B. 6 C. 7 D. 8<br>7.在一个具有n个顶点的无向图中,要连通全部顶点至少需要____条边。<br>A. n B. n+1 C. n-1 D. n/2<br>8.对于一个具有n个顶点的无向图,若采用邻接矩阵表示,则该矩阵的大小是____。<br>A. n B. (n-1)2 C. n-1 D. n2<br>9.对于一个具有n个顶点和e条边的无向图,若采用邻接表表示,则表头向量的大小为_①___;所有邻接表中的接点总数是_②___。<br>① A. n B. n+1 C. n-1 D. n+e<br>② A. e/2 B. e C.2e D. n+e <br>10.已知一个图如图7.1所示,若从顶点a出发按深度搜索法进行遍历,则可能得到<br>的一种顶点序列为__①__;按宽度搜索法进行遍历,则可能得到的一种顶点序列<br>为__②__。<br>① A. a,b,e,c,d,f B. e,c,f,e,b,d C. a,e,b,c,f,d D. a,e,d,f,c,b<br>② A. a,b,c,e,d,f B. a,b,c,e,f,d C. a,e,b,c,f,d D. a,c,f,d,e,b<br><br><br><br><br> <br><br><br><br><br>11.已知一有向图的邻接表存储结构如图7.2所示。<br><br><br><br><br><br><br><br><br><br><br>⑴ 根据有向图的深度优先遍历算法,从顶点v1出发,所得到的顶点序列是____。<br>A. v1,v2,v3,v5,v4 B. v1,v2,v3,v4,v5<br>C. v1,v3,v4,v5,v2 D. v1,v4,v3,v5,v2<br>⑵ 根据有向图的宽度优先遍历算法,从顶点v1出发,所得到的顶点序列是____。<br>A. v1,v2,v3,v4,v5 B. v1,v3,v2,v4,v5<br>C. v1,v2,v3,v5,v4 D. v1,v4,v3,v5,v2<br>12.采用邻接表存储的图的深度优先遍历算法类似于二叉树的____。<br>A. 先序遍历 B. 中序遍历 C. 后序遍历 D. 按层遍历<br>13.采用邻接表存储的图的宽度优先遍历算法类似于二叉树的____。<br>A. 先序遍历 B. 中序遍历 C. 后序遍历 D. 按层遍历<br>14.判定一个有向图是否存在回路除了可以利用拓扑排序方法外,还可以利用____。<br>A. 求关键路径的方法 B. 求最短路径的Dijkstra方法<br>C. 宽度优先遍历算法 D. 深度优先遍历算法<br>15.关键路径是事件结点网络中 。<br>A.从源点到汇点的最长路径 B.从源点到汇点的最短路径<br>C.最长的回路 D.最短的回路<br>16.下面不正确的说法是 。<br> (1)在AOE网中,减小一个关键活动上的权值后,整个工期也就相应减小;<br> (2)AOE网工程工期为关键活动上的权之和;<br> (3)在关键路径上的活动都是关键活动,而关键活动也必在关键路径上。<br>A.(1) B.(2) C.(3) D.(1)、(2)<br>17.用DFS遍历一个无环有向图,并在DFS算法退栈返回时打印出相应的顶点,则输出的顶点序列是 。<br>A.逆拓朴有序的 B.拓朴有序的 C.无序的<br>18.在图7.3所示的拓朴排列的结果序列为 。<br>A.125634 B.516234 C.123456 D.521634<br> <br><br>19.一个有n个顶点的无向连通图,它所包含的连通分量个数为 。<br>A.0 B.1 C.n D.n+1<br>20.对于一个有向图,若一个顶点的入度为k1,、出度为k2,则对应邻接表中该顶点单链表中的结点数为 。<br>A.k1 B.k2 C.k1-k2 D.k1+k2<br>21.对于一个有向图,若一个顶点的入度为k1,、出度为k2,则对应逆邻接表中该顶点单链表中的结点数为 。<br>A.k1 B.k2 C.k1-k2 D.k1+k2<br>7.2 填空题(将正确的答案填在相应饿空中)<br>1.n个顶点的连通图至少____条边。<br>2.在无权图G的邻接矩阵A中,若(vi,vj)或<vi,vj>属于图G的边集合,则对应元素A[i][j]等于____,否则等于____。<br>3.在无向图G的邻接矩阵A中,若A[i][j]等于1,则A[j][i ]等于____。<br>4.已知图G的邻接表如图7.4所示,其从顶点v1出发的深度有限搜索序列为____,其从顶点v1出发的宽度优先搜索序列为____。<br><br><br><br><br><br><br><br><br><br><br> 图7.4 图G的邻接表<br>5.已知一个有向图的邻接矩阵表示,计算第i个结点的入度的方法是____。<br>6.已知一个图的邻接矩阵表示,删除所有从第i个结点出发的边的方法是____。<br>7.如果含n个顶点的图形成一个环,则它有 棵生成树。<br>8.一个非连通无向图,共有28条边,则该图至少有 个顶点。<br>9.遍历图的过程实质上是 。BFS遍历图的时间复杂度为 ,DFS遍历图的时间复杂度为 ,两者不同之处在于 ,反映在数据结构上的差别是 。<br>10.一个图的 表示法是唯一的,而 表示法是不唯一的。<br>11.有向图中的结点前驱后继关系的特征是 。<br>12.若无向图G的顶点度数最小值大于等于 时,G至少有一条回路。<br>13.根据图的存储结构进行某种次序的遍历,得到的顶点序列是 的。<br>7.3 综合题<br>1.已知如图7.5所示的有向图,请给出该图的:<br>(1)每个顶点的入/出度;<br>(2)邻接距阵;<br>(3)邻接表;<br>(4)逆邻接表;<br>(5)强连通分量。<br><br><br><br><br><br>2.请用克鲁斯卡尔和普里姆两种算法分别为图7.6、图7.7构造最小生成树: <br>(1)<br> <br> <br> <br> <br>图7.6<br>(2)<br> <br><br><br><br><br><br>图7.7<br>3.试列出图7.8中全部的拓扑排序序列。<br><br><br><br><br><br><br>图7.8<br><br><br>4.请用图示说明图7.9从顶点a到其余各顶点之间的最短路径。<br><br><br><br><br><br><br><br><br>图7.9<br><br><br>5.已知AOE网有9个结点:V1,V2,V3,V4,V5,V6,V7,V8,V9,其邻接矩阵如下:<br>(1)请画出该AOE图。<br>(2)计算完成整个计划需要的时间。<br>(3)求出该AOE网的关键路径。<br>∝ 6 4 5 ∝ ∝ ∝ ∝ ∝<br>∝ ∝ ∝ ∝ 1 ∝ ∝ ∝ ∝<br>∝ ∝ ∝ ∝ 1 ∝ ∝ ∝ ∝<br>∝ ∝ ∝ ∝ ∝ 2 ∝ ∝ ∝<br>∝ ∝ ∝ ∝ ∝ ∝ 9 7 ∝<br>∝ ∝ ∝ ∝ ∝ ∝ ∝ 4 ∝<br>∝ ∝ ∝ ∝ ∝ ∝ ∝ ∝ 2<br>∝ ∝ ∝ ∝ ∝ ∝ ∝ ∝ 4<br>∝ ∝ ∝ ∝ ∝ ∝ ∝ ∝ ∝<br><br><br>习题答案<br> 7.1 1. C 2.B 3.B 4. C 5. A 6. A 7.C<br>8.D 9. AC 10.DB 11. CB 12. A 13. D 14.D 15.A 16.A 17.A 18.B 19.B 20.B 21.A <br> 7.2 1.n-1 2. 1;0 3. 1 <br>4.v1,v2,v3,v6,v5, v4;v1,v2,v5,v4,v3, v6<br>5.求矩阵第i列非零元素之和 <br>6. 将矩阵第i行全部置为零<br>7.n<br>8.9<br>9.对每个顶点查找其邻接点的过程;O(e)(e为图中的边数);O(e);<br>遍历图的顺序不同;DFS采用栈存储访问过的结点,BFS采用队列存储访问过<br>的结点。<br>10.邻接矩阵 邻接表<br>11.一个结点可能有若干个前驱,也可能有若干个后继<br>12.2<br>13.唯一<br><br>7.3 1.<br><br><br><br><br><br><br><br><br>2.<br> (1).<br><br><br><br><br><br><br><br><br><br>(2)<br> <br><br><br><br><br><br><br>3.<br>152364<br>152634<br>156234<br>561234<br>516234<br>512634<br>512364<br>4.<br><br><br><br><br><br><br><br><br><br>5.(1)该AOE图为:<br> <br>(2)完成整个计划需要18天。<br>(3)关键路径为:(V1,V2,V5,V7,V9)和(V1,V2, V5,V8,V9,)<br><br>习题8 查找<br>8.1 单项选择题<br>1.顺序查找法适合于存储结构为____的线性表。<br>A. 散列存储 B. 顺序存储或链接存储<br>C. 压缩存储 D. 索引存储<br>2.对线性表进行二分查找时,要求线性表必须____。<br>A. 以顺序方式存储 B. 以链接方式存储<br>C. 以顺序方式存储,且结点按关键字有序排序<br>D. 以链接方式存储,且结点按关键字有序排序<br>3.采用顺序查找方法查找长度为n的线性表时,每个元素的平均查找长度为____.<br>A. n B. n/2 C. (n+1)/2 D. (n-1)/2<br>4.采用二分查找方法查找长度为n的线性表时,每个元素的平均查找长度为____。<br>A.O(n2) B. O(nlog2n) C. O(n) D. O(log2n)<br>5.二分查找和二叉排序树的时间性能____。<br>A. 相同 B. 不相同<br>6.有一个有序表为{1,3,9,12,32,41,45,62,75,77,82,95,100},当二分查找值82为的结点时,____次比较后查找成功。<br>A. 1 B. 2 C. 4 D. 8<br>7.设哈希表长m=14,哈希函数H(key)=key%11。表中已有4个结点:<br>addr (15)=4; addr (38)=5; addr (61)=6; addr (84)=7<br>如用二次探测再散列处理冲突,关键字为49的结点的地址是____。<br>A. 8 B. 3 C. 5 D. 9<br>8.有一个长度为12的有序表,按二分查找法对该表进行查找,在表内各元素等概率情况下查找成功所需的平均比较次数为____。<br>A. 35/12 B. 37/12 C. 39/12 D. 43/12<br>9.对于静态表的顺序查找法,若在表头设置岗哨,则正确的查找方式为 。<br>A.从第0个元素往后查找该数据元素<br>B.从第1个元素往后查找该数据元素<br>C.从第n个元素往开始前查找该数据元素<br>D.与查找顺序无关<br>10.解决散列法中出现的冲突问题常采用的方法是 。<br>A.数字分析法、除余法、平方取中法<br>B.数字分析法、除余法、线性探测法<br>C.数字分析法、线性探测法、多重散列法<br>D.线性探测法、多重散列法、链地址法<br>11.采用线性探测法解决冲突问题,所产生的一系列后继散列地址 。<br>A.必须大于等于原散列地址<br>B.必须小于等于原散列地址<br>C.可以大于或小于但不能等于原散列地址<br>D.地址大小没有具体限制<br>12.对于查找表的查找过程中,若被查找的数据元素不存在,则把该数据元素插入到集合中。这种方式主要适合于 。<br>A.静态查找表 B.动态查找表 <br>C.静态查找表与动态查找表 D两种表都不适合<br>13.散列表的平均查找长度 。<br>A.与处理冲突方法有关而与表的长度无关<br>B.与处理冲突方法无关而与表的长度有关<br>C.与处理冲突方法有关而与表的长度有关<br>D.与处理冲突方法无关而与表的长度无关<br>8.2 填空题(将正确的答案填在相应的空中)<br>1.顺序查找法的平均查找长度为____;折半查找法的平均查找长度为____;哈希表查找法采用链接法处理冲突时的平均查找长度为____。<br>2.在各种查找方法中,平均查找长度与结点个数n无关的查找方法是____。<br>3.折半查找的存储结构仅限于____,且是____。<br>4. 假设在有序线性表A[1..20]上进行折半查找,则比较一次查找成功的结点数为____,则比较二次查找成功的结点数为____,则比较三次查找成功的结点数为____,则比较四次查找成功的结点数为____,则比较五次查找成功的结点数为____,平均查找长度为____。<br>5. 对于长度为n的线性表,若进行顺序查找,则时间复杂度为____;若采用折半法查找,则时间复杂度为____;<br>6.已知有序表为(12,18,24,35,47,50,62,83,90,115,134),当用折半查找90时,需进行 次查找可确定成功;查找47时,需进行 次查找成功;查找100时,需进行 次查找才能确定不成功。<br>7.二叉排序树的查找长度不仅与 有关,也与二叉排序树的 有关。<br>8.一个无序序列可以通过构造一棵 树而变成一个有序树,构造树的过程即为对无序序列进行排序的过程。<br>9.平衡二叉排序树上任一结点的平衡因子只可能是 、 或 。<br>10. 法构造的哈希函数肯定不会发生冲突。<br>11.在散列函数H(key)=key%p中,p应取____。<br>12.在散列存储中,装填因子 的值越大,则____; 的值越小,则____。<br>8.3 综合练习题:<br>1. 画出对长度为10的有序表进行折半查找的判定树,并求其等概率时查找成功的平均查找长度。<br>2.含九个叶子结点的3阶B-树中至少有多少个非叶子结点?含10个叶子结点的3阶B-树中至多有多少个非叶子结点?<br>3.试从空树开始,画出按以下次序向2-3树即3阶B-树中插入关键码的建树过程:20,30,50,52,60,68,70.如果此后删除50和68,画出每一步执行后2-3树的状态。<br>4. 选取哈稀函数H(k)=(3k)MOD 11。用开放定址法处理冲突,di=i((7k)MOD 10+1)(I=1,2,3,…).试在0-10的散列地址空间中对关键字序列(22,41,53,46,30,13,01,67)造哈希表,并求等概率情况下查找成功时的平均查找长度。<br>5. 已知一组关键字{49,38,65,97,76,13,27,44,82,35,50},画出由此生成的二叉排序树,注意边插入边平衡。<br> 习题答案<br>8.1 1.B 2.C 3.C 4.D 5.B 6.C 7.D 8.B <br>9.C 10.D 11.C 12.B 13.C<br><br>8.2 1. (n+1)/2 、((n+1)*log2(n+1))/n-1 、1+ ( 为装填因子)<br> 2. 哈希表查找法<br> 3. 顺序存储结构、有序的<br> 4. 1、2、4、8、5、3.7<br>(依题意,构造一棵有序二叉树,共12个结点,第一层1个结点,第二层2个结点,第三层4个结点,第四层5个结点,则:ASL=(1*1+2*2+3*4+4*5)/12=37/12)<br> 5. O(n)、O(log2n)<br> 6.2、4、3<br> 7.结点个数n、生成过程<br> 8.二叉排序树<br> 9.0、1、-1<br> 10.直接定址<br>11.素数<br>12.存取元素时发生冲突的可能性就越大、存取元素时发生冲突的可能性就越小<br><br><br><br><br>习题9 排序<br>9.1 单项选择题<br>1. 在所有排序方法中,关键字比较的次数与记录的初始排列次序无关的是____。<br>A. 希尔排序 B. 起泡排序 C. 插入排序 D. 选择排序<br>2. 设有1000个无序的元素,希望用最快的速度挑选出其中前10个最大的元素,最好选用____排序法。<br>A. 起泡排序 B. 快速排序 C. 堆排序 D. 基数排序<br>3. 在待排序的元素序列基本有序的前提下,效率最高的排序方法是____。<br>A. 插入排序 B. 选择排序
4.26MB
c语言数据结构算法演示(Windows版)
2013-11-03一、 功能简介 本课件是一个动态演示数据结构算法执行过程的辅助教学软件, 它可适应读者对算法的输入数据和过程执行的控制方式的不同需求, 在计算机的屏幕上显示算法执行过程中数据的逻辑结构或存储结构的变化状况或递归算法执行过程中栈的变化状况。整个系统使用菜单驱动方式, 每个菜单包括若干菜单项。每个菜单项对应一个动作或一个子菜单。系统一直处于选择菜单项或执行动作状态, 直到选择了退出动作为止。 二、 系统内容 本系统内含84个算法,分属13部分内容,由主菜单显示,与《数据结构》教科书中自第2章至第11章中相对应。各部分演示算法如下: 1. 顺序表 (1)在顺序表中插入一个数据元素(ins_sqlist) (2)删除顺序表中一个数据元素(del_sqlist) (3)合并两个有序顺序表(merge_sqlist) 2. 链表 (1)创建一个单链表(Crt_LinkList) (2)在单链表中插入一个结点(Ins_LinkList) (3)删除单链表中的一个结点(Del_LinkList) (4)两个有序链表求并(Union) (5)归并两个有序链表(MergeList_L) (6)两个有序链表求交(ListIntersection_L) (7)两个有序链表求差(SubList_L) 3. 栈和队列 (1)计算阿克曼函数(AckMan) (2)栈的输出序列(Gen、Perform) (3)递归算法的演示 汉诺塔的算法(Hanoi) 解皇后问题的算法(Queen) 解迷宫的算法(Maze) 解背包问题的算法(Knap) (4)模拟银行(BankSimulation) (5)表达式求值(Exp_reduced) 4. 串的模式匹配 (1)古典算法(Index_BF) (2)求Next 函数值(Get_next)和按Next 函数值进行匹配 (Index_KMP(next)) (3)求 Next 修正值(Get_nextval)和按 Next 修正值进行匹配(Index_KMP(nextval)) 5. 稀疏矩阵 (1)矩阵转置 (Trans_Sparmat) (2)快速矩阵转置 (Fast_Transpos) (3)矩阵乘法 (Multiply_Sparmat) 6. 广义表 (1)求广义表的深度(Ls_Depth) (2)复制广义表(Ls_Copy) (3)创建广义表的存储结构(Crt_Lists) 7. 二叉树 (1)遍历二叉树 二叉树的线索化 先序遍历(Pre_order) 中序遍历(In_order) 后序遍历(Post_order) (2) 按先序建二叉树(CrtBT_PreOdr) (3) 线索二叉树 二叉树的线索化 生成先序线索(前驱或后继) (Pre_thre) 中序线索(前驱或后继) (In_thre) 后序线索(前驱或后继) (Post_thre) 遍历中序线索二叉树(Inorder_thlinked) 中序线索树的插入(ins_lchild_inthr)和删除(del_lchild_inthr)结点 (4)建赫夫曼树和求赫夫曼编码(HuffmanCoding) (5)森林转化成二叉树(Forest2BT) (6)二叉树转化成森林(BT2Forest) (7)按表达式建树(ExpTree)并求值(CalExpTreeByPostOrderTrav) 8. 图 (1)图的遍历 深度优先搜索(Travel_DFS) 广度优先搜索(Travel_BFS) (2)求有向图的强连通分量(Strong_comp) (3)有向无环图的两个算法 拓扑排序(Toposort) 关键路径(Critical_path) (4)求最小生成树 普里姆算法(Prim) 克鲁斯卡尔算法(Kruscal) (5)求关节点和重连通分量(Get_artical) (6)求最短路径 弗洛伊德算法(shortpath_Floyd) 迪杰斯特拉算法(shortpath_DIJ) 9. 存储管理 (1)边界标识法 (Boundary_tag_method) (2)伙伴系统 (Buddy_system) (3)紧缩无用单元 (Storage_compaction) 10. 静态查找 (1)顺序查找(Search_Seq) (2)折半查找 (Serch_Bin) (3)插值查找 (Search_Ins) (4)斐波那契查找 (Search_Fib) (5)次优查找树(BiTree_SOSTree) 11. 动态查找 (1)在二叉排序树上进行查找(bstsrch)、插入结点(ins_bstree)和删除结点(del_bstree) (2)在二叉平衡树上插入结点(ins_AVLtree) 和删除结点(del_AVLtree) (3)在 B-树上插入结点(Ins_BTree) 和 删除结点(Del_BTree) (4)在 B+树上插入结点(Ins_PBTree) 和 删除结点(Del_PBTree) 12. 内部排序 (1)简单排序法 直接插入排序(Insert_sort) 表插入排序(内含插入(Ins_Tsort) 重排(Arrange)两个算法) 起泡排序(BubbleSort) 简单选择排序(SelectSort) (2)复杂排序法 堆排序(HeapSort) 快速排序(QuickSort) 锦标赛排序(Tournament) (3)其他 快速地址排序(QkAddrst) 基数排序(RadixSort) 13. 外部排序 (1)多路平衡归并排序(K-Merge) (2)置换-选择排序(Repl_Selection) 各个算法演示屏的补充说明如下: 1. 顺序表和链表的插入、删除和链表的生成 算法演示屏由显示顺序表或链表的图示、算法文本及变量等三个窗口组成。在演示算法之前,需先在弹出的小窗口中输入线性表的数据元素及算法参数 i(插入或删除的位置)和 b(被插的数据元素)的值。顺序表的图示窗口在演示屏的上方,链表的图示窗口在左侧。 2. 有序表的操作 算法演示屏的状态和 1 中所述相同。 3. 汉诺塔问题 算法演示屏由4个窗口组成。右侧上方为算法文本,在算法中有4个形式参量,其中值参 n 为圆盘个数,x、y、和 z 分别表示3个塔座;右侧下方为递归工作栈,栈中每个记录包含调用语句行号 adr 及值参 n 和 x、y、z;左侧上方显示汉诺塔图形及移动操作结果;左侧下方显示移动操作的记录。 4. 迷宫问题 左侧窗口显示迷宫的逻辑结构,由 N×N 个方格组成,左上[1,1]为入口,右下[N,N]为出口,并且以红色钉子填充表示障碍,空白表示通路,红色交通灯表示已游历过的路,箭头表示继续游历的方向,演示结束时显示一条通路或迷宫不通的信息。右侧下窗口为递归工作栈,栈中每个记录含6个数据项,其中 adr 指示调用语句行号,k 指示步数,(x,y) 表示当前坐标,i 指示路径方向(起始方向为 1,顺时针方向旋转搜索)。 5. 皇后问题 左侧图示窗口包含棋盘和递归工作栈两部分,栈中记录含3个数据项,其中 adr 指示调用语句行号,k 指示列号,i 指示行号。此算法演示可求得所有可行结果,在求得每一种排布的结果之后,均会弹出一个窗口显示“找到第 j (j=1,2,…) 种排布”,单击“确定”按钮将继续进行,直至找到所有可能构成的排布。 6. 背包问题 右侧图示窗口的上方显示背包、物件及其体积。 若有解,则在求得每一组结果之后,均会弹出一个窗口提示求得一组解,单击提示窗口中的小人将继续进行。该窗口的下方为递归工作栈,栈中的记录含3个数据项,其中 adr 指示调用语句所在行号,n 指示物件个数,t 指示背包总体积。 7. 阿克曼函数 整个演示屏只有显示算法文本和显示算法执行过程中栈的状态两个窗口。在执行算法之前,首先应按照提示输入参数 m 和 n 的值。 8. 栈的输出序列 图示窗口的内容为:由算法 Gen 生成的栈的操作序列(列出在窗口的下方)、算法 Perform 执行时栈的操作过程(该窗口的上方)以及算法 Perform 执行的结果——栈的输出序列(列出在图示窗口的右侧)。 9. 表达式求值 图示窗口的内容主要为显示表达式求值过程中操作数栈和运算符栈的变化情况以及主要操作。上方的小窗口显示在算法演示之前设定的表达式。 10. 离散事件模拟 图示窗口分成3部分:中间部分或显示客户流动情况的动画,或显示程序执行过程中事件表和4个队列的数值,上方两个按钮用以切换动画或静态数据,下方则显示客户总人数、客户逗留的累计时间以及调节动画中小人移动速度的指针。 11. 串的模式匹配 上窗口显示算法文本,下窗口显示串的匹配过程或求 next 函数的过程。 12. 稀疏矩阵 图示窗口显示矩阵的状态或其三元组的表示。 13. 求广义表的深度 图示窗口显示广义表的存储结构,图中指针 ls 指向当前所求深度的广义表,值为空时不显示。演示结束时弹出窗口显示求得的深度。 14. 复制广义表 图示窗口的上方显示已知广义表的存储结构,图示窗口的下方显示复制求得的广义表的存储结构。递归工作栈中含调用语句行号 adr、变参 nls 和值参 ls。 15. 创建广义表的存储结构 图示窗口显示广义表存储结构的建立过程和算法执行过程中参数Sub的当前值。 16. 遍历二叉树 图示窗口显示二叉树的逻辑结构和遍历结果输出的结点序列,图中指针 bt 指向当前遍历的二叉树的根结点。 17. 线索二叉树 图示窗口显示二叉树的存储结构,但结点中只含标志域,而以结点间的黑色连线表示指针,红色连线表示前驱线索,蓝色连线表示后继线索。在二叉树线索化的过程中,图中指针 p 指向当前层二叉树的根结点,指针 pre 指向当前被访问的结点的前驱。在演示线索树的插入和删除过程时,图示窗口的下方还包括“输入行”和“提示行”。 18. 按先序序列建二叉链表 图示窗口显示输入的先序序列和生成二叉链表的过程。 19. 森林和二叉树的相互转换 图示窗口在显示屏的上方,其左侧为森林,右侧为二叉树。 20. 赫夫曼树和赫夫曼编码 图示窗口显示生成的赫夫曼树的逻辑结构和每个叶子结点的编码。 21. 图的深度优先搜索 图示窗口的上半部分显示图的逻辑结构,初始状态用青色圆圈表示顶点,结点间的黑色连线表示边或弧(连线上画有箭头)。演示过程中用红色覆盖已访问的顶点和边(或弧)。窗口下方显示图的邻接表,演示过程中以红色框边表示已访问过的弧。图示窗口的下方显示遍历后输出的顶点序列。 22. 图的广度优先搜索 与深度优先不同的是,在窗口的下方增加一个队列,其左端为队头,右端为队尾。 23. 求有向图的强连通分量 图示窗口自上而下分别显示有向图的逻辑结构、存储结构和 Finished 数组在算法执行过程中的变化情况。所求得的各个强连通分量,将以不同颜色的顶点组表示。 24. 求关节点和重连通分量 图示窗口的上半部分显示无向图,下半部分自上而下分别显示 Vexnum、Vexdata、Visited、Low、Squlow(求得 low 值的顺序)和 artpoint(关节点)的信息。 25. 有向图的拓扑排序 图示窗口由5部分组成。其中左上显示有向图的邻接表;左下显示有向图,其中顶点和弧的初始状态分别为绿色和黑色,从栈中退出的顶点(i)用红色表示,分别以蓝色和红色指示当前访问的邻接点(k)和它们之间的弧(ik),灰白色表示已经输出的顶点;右下显示顶点的入度;右上显示入度为零的栈。当拓扑排序不成功时,在演示屏的中央将会弹出一个窗口,显示提示信息“网中存在自环!”,此时用户可在左下显示的有向图中由绿色顶点和黑色弧构成的子图中找到这个环。 26. 有向图的关键路径 图示窗口包含5部分信息。左上显示带入度域的邻接表;左下显示有向网的逻辑结构和顶点的入度及各顶点事件的最早发生时间和最迟发生时间;右下显示拓扑排序过程中入度为零的顶点的栈S,右上显示的栈 T 存放拓扑序列,其入栈顺序和栈 S 的出栈顺序相同,从栈顶到栈底的顶点顺序即为顶点的逆拓扑序列。算法执行结束后将弹出窗口列出全部结果,其中红色字体的弧表示关键活动。 27. 普里姆算法 图示窗口包含3部分内容。右上是邻接矩阵;左上是无向网的逻辑结构,图中顶点的初始状态为黄色,算法执行过程中,红色覆盖的顶点和边则表示已加入生成树的顶点和生成树上的边;窗口的下方则显示 closedge 数组中的值。 28. 克鲁斯卡尔算法 图示窗口的左侧为无向网,以红色标定已落在生成树上的边;右侧自上而下列出各条边的信息以及选择生成树的边的执行过程。 29. 边界标识法 图示窗口的初始状态为 64KB 的模拟存储器,演示过程中,以绿色覆盖占用块。各个存储块的头部左侧所示为该块的起始地址,头部结构或其他信息参见教科书。用户可根据弹出窗口的操作提示信息进行操作,输入请求分配的空间大小或释放块的首地址。 30. 伙伴系统 在图示窗口中,左侧为可利用空间链表的逻辑结构,右侧为存储结构,其中红色覆盖部分为占用块。弹出窗口为输入窗口,由用户输入请求分配的空间大小或释放块的首地址。 31. 紧缩无用单元 右侧显示存储空间,空白表示空闲块,其他颜色覆盖表示占用块,在存储空间不足分配时将进行空闲块压缩。左侧显示存储映像。弹出窗口为输入窗口,由用户输入请求分配的空间大小和分配或释放块的块名。 32. 静态查找 上窗口为图示窗口,演示查找过程;左下和右下分别为算法文本和变量窗口。 33. B-树和B+树 整个屏幕分为上、下两个窗口,上窗口演示插入或删除结点过程中B-树或B+ 树结构的变化状况;下窗口内显示如查找关键字、插入位置、结点分裂等操作信息。下窗口上面左侧的小窗口为编辑窗口,由用户输入待插或待删的关键字,输入之后其右侧的操作命令将由隐式状态改为显式状态。 34. 内部排序 图示窗口演示排序过程以及排序过程中关键字之间进行的比较次数和记录移动的次数。
369KB
数据结构习题答案(全部算法)严蔚敏版
2009-11-18第1章 绪论 1.1 数据结构的基本概念和术语 1.1.1 引言 1.1.2 数据结构有关概念及术语 1.1.3 数据结构和抽象数据类型(ADT) 1.2 算法描述与分析 1.2.1 什么是算法 1.2.2 算法描述工具——C语言 1.2.3 算法分析技术初步 习题一 第2章 线性表 2.1 线性表的定义及其运算 2.1.1 线性表的定义 2.1.2 各种运算简介 2.2 线性表的顺序存储结构(向量) 2.2.1 顺序存储结构(向量) 2.2.2 向量中基本运算的实现 2.3 线性表的链表存储结构 2.3.1 单链表与指针 2.3.2 单链表的基本运算 2.4 循环链表和双向链表 2.4.1 循环链表 2.4.2 双向链表 2.4.3 顺序存储结构与链表存储结构的综合分析与比较 2.5 多项式相加问题 2.5.1 多项式相加的链表存储结构 2.5.2 多项式相加的算法实现 2.6 线性表的算法实现举例 2.6.1 实现线性表顺序存储结构及运算的C语言源程序 2.6.2 单链表处理的C语言源程序 习题二 第3章 栈和队列 3.1 栈 3.1.1 栈的定义及其运算 3.1.2 栈的顺序存储结构(向量) 3.1.3 栈的链表存储结构 3.1.4 栈的应用 3.2 队列 3.2.1 队列的定义及运算 3.2.2 队列的顺序存储结构(向量) 3.2.3 队列的链表存储结构 3.3 栈和队列的算法实现举例 习题三 第4章 串 4.1 串的基本概念 4.2 串的存储结构 4.2.1 串的顺序存储 4.2.2 串的链表存储 4.2.3 串变量的存储映象 4.3 串的运算 4.3.1 串的运算简介 4.3.2 串的匹配运算 4.4 文本编辑 习题四 第5章 数组和广义表 5.1 数组的基本概念 5.1.1 数组的概念 5.1.2 数组的顺序表示 5.1.3 特殊矩阵的压缩存储 5.2 稀疏矩阵的三元组存储 5.2.1 三元组表 5.2.2 稀疏矩阵的运算 5.3 稀疏矩阵的十字链表存储 5.3.1 十字链表的组成 5.3.2 十字链表的有关算法 5.4 广义表 5.4.1 广义表的概念和特性 5.4.2 广义表的存储结构 5.4.3 求广义表的深度 5.4.4 广义表的输出 5.4.5 建立广义表的存储结构 5.5 迷宫问题 习题五 第6章 树 6.1 树的基本概念和术语 6.1.1 树的定义 6.1.2 树的常用术语 6.1.3 树的表示方法 6.2 二叉树 6.2.1 二叉树的定义 6.2.2 二叉树的重要性质 6.2.3 二叉树的存储结构 6.2.4 二叉树二叉链表的一个生成算法 6.3 遍历二叉树 6.3.1 先根遍历 6.3.2 中根遍历 6.3.3 后根遍历 6.3.4 二叉树遍历算法的应用 6.4 线索二叉树 6.4.1 线索二叉树的基本概念 6.4.2 线索二叉树的逻辑表示图 6.4.3 中根次序线索化算法 6.4.4 在中根线索树上检索某结点的前趋或后继 6.4.5 在中根线索树上遍历二叉树 6.5 二叉树、 树和森林 6.5.1 树的存储结构 6.5.2 树与二叉树之间的转换 6.5.3 森林与二叉树的转换 6.5.4 一般树或森林的遍历 6.6 树的应用 6.6.1 二叉排序树 6.6.2 哈夫曼树及其应用 6.7 二叉树的建立和遍历C语言源程序示例 习题六 第7章 图 7.1 图的基本概念和术语 7.1.1 图的基本概念 7.1.2 路径和回路 7.1.3 连通图 7.1.4 顶点的度 7.2 图的存储结构 7.2.1 邻接矩阵 7.2.2 邻接链表 7.3 图的遍历和求图的连通分量 7.3.1 图的建立 7.3.2 图的遍历 7.3.3 求图的连通分量 7.4 图的生成树 7.4.1 生成树的概念 7.4.2 最小生成树 7.4.3 普里姆(Prim)算法和克鲁斯卡尔(Kruskal)算法 7.5 最短路径 7.5.1 单源顶点最短路径问题求解 7.5.2 求有向网中每对顶点间的路径 7.6 有向无环图及应用 7.6.1 拓扑排序 7.6.2 关键路径 7.7 图的算法C语言程序实现举例 7.7.1 无向图的邻接表的建立和遍历 7.7.2 有向无环图的拓扑排序和求关键路径 习题七 第8章 查找 8.1 基本概念
949KB
数据结构动画演示
2019-05-06该资源包含了几乎所有的数据结构的动画视频,帮助我们更好的理解数据结构与算法的编程思路。 目录如下: 'B树的删除.swf', 'B树的生长过程.swf', '三元组表的转置.swf', '中序线索化二叉树.swf', '串的顺序存储.swf', '二分查找.swf', '二叉排序树的删除.swf', '二叉排序树的生成.swf', '二叉树的建立.swf', '克鲁斯卡尔算法构造最小生成树.swf', '冒泡排序.swf', '分块查找.swf', '单链表结点的删除.swf', '单链表结点的插入.swf', '图的深度优先遍历.swf', '基数排序.swf', '堆排序.swf', '头插法建单链表.swf', '寻找中序线索化二叉树指定结点的前驱.swf', '寻找中序线索化二叉树指定结点的后继.swf', '尾插法建表.swf', '希儿排序.swf', '开放定址法建立散列表.swf', '归并排序.swf', '循环队列操作演示.swf', '快速排序.swf', '拉链法创建散列表.swf', '拓扑排序.swf', '最短路径.swf', '朴素串匹配算法过程示意.swf', '构造哈夫曼树的算法模拟.swf', '构造哈夫曼树过程.swf', '栈与递归.swf', '树、森林和二叉树的转换.swf', '桶式排序法.swf', '直接插入排序.swf', '直接选择排序.swf', '邻接表表示的图的广度优先遍历.swf', '邻接表表示的图的深度优先遍历.swf', '顺序查找.swf', '顺序栈(4个存储空间).swf', '顺序栈(8个存储空间).swf', '顺序表的删除运算.swf', '顺序表的插入.swf', '顺序队列操作.swf'。 (注:.swf动画格式可直接使用播放器打开。)
945KB
数据结构和算法动画演示
2010-04-11数据结构和算法Flash动画演示 顺序查找 顺序栈(4个存储空间) 顺序栈(8个存储空间) 顺序表的删除运算 顺序表的插入 顺序队列操作 二分查找 分块查找 三元组表的转置 串的顺序存储 单链表结点的插入 单链表结点的删除 头插法建单链表 尾插法建表 循环队列操作演示 栈与递归 冒泡排序 直接插入排序 直接选择排序 规并排序 快速排序 堆排序 希儿排序 桶式排序法 基数排序 二叉树的建立 二叉排序树的生成 二叉排序树的删除 中序线索化二叉树 寻找中序线索化二叉树指定结点的前驱 寻找中序线索化二叉树指定结点的后继 构造哈夫曼树的算法模拟 构造哈夫曼树过程 树、森林和二叉树的转换 开放定址法建立散列表 拉链法创建散列表 朴素串匹配算法过程示意 图的深度优先遍历 邻接表表示的图的广度优先遍历 邻接表表示的图的深度优先遍历 拓扑排序 最短路径 克鲁斯卡尔算法构造最小生成树 B树的删除 B树的生长过程
12KB
数据结构课程设计
2021-02-20线性表 某软件公司大约有30名员工,每名员工有姓名、工号、职务等属性,每年都有员工离职和入职。 把所有员工按照顺序存储结构建立一个线性表,建立离职和入职函数,当有员工离职或入职时,修改线性表,并且打印最新的员工名单。 约瑟夫(Josephus)环问题:编号为1,2,3,…,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。一开始任选一个正整数作为报数的上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止。报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一人开始重新从1报数,如此下去,直到所有人全部出列为止。 建立n个人的单循环链表存储结构,运行结束后,输出依次出队的人的序号。 栈和队列 某商场有一个100个车位的停车场,当车位未满时,等待的车辆可以进入并计时;当车位已满时,必须有车辆离开,等待的车辆才能进入;当车辆离开时计算停留的的时间,并且按照每小时1元收费。 汽车的输入信息格式可以是(进入/离开,车牌号,进入/离开时间),要求可以随时显示停车场内的车辆信息以及收费历史记录。 某银行营业厅共有6个营业窗口,设有排队系统广播叫号,该银行的业务分为公积金、银行卡、理财卡等三种。公积金业务指定1号窗口,银行卡业务指定2、3、4号窗口,理财卡业务指定5、6号窗口。但如果5、6号窗口全忙,而2、3、4号窗口有空闲时,理财卡业务也可以在空闲的2、3、4号窗口之一办理。 客户领号、业务完成可以作为输入信息,要求可以随时显示6个营业窗口的状态。 5、4阶斐波那契序列如下:f0=f1=f2=0, f3=1,…,fi=fi-1+fi-2+fi-3+fi-4, 利用容量为k=4的循环队列,构造序列的前n+1项(f0, f1 , f2 ,… fn ),要求满足fn ≤200而fn+1 >200。 6、八皇后问题:设8皇后问题的解为 (x1, x2, x3, …,x8), 约束条件为:在8x8的棋盘上,其中任意两个xi 和xj不能位于棋盘的同行、同列及同对角线。要求用一位数组进行存储,输出所有可能的排列。 7、迷宫求解:用二维矩阵表示迷宫,自动生成或者直接输入迷宫的格局,确定迷宫是否能走通,如果能走通,输出行走路线。 8、英国人格思里于1852年提出四色问题(four colour problem,亦称四色猜想),即在为一平面或一球面的地图着色时,假定每一个国家在地图上是一个连通域,并且有相邻边界线的两个国家必须用不同的颜色,问是否只要四种颜色就可完成着色。现在给定一张地图,要求对这张地图上的国家用不超过四种的颜色进行染色。 要求建立地图的邻接矩阵存储结构,输入国家的个数和相邻情况,输出每个国家的颜色代码。 9、以下问题要求统一在一个大程序里解决。 从原四则表达式求得后缀式,后缀表达式求值,从原四则表达式求得中缀表达式,从原四则表达式求得前缀表达式,前缀表达式求值。 数组与广义表 鞍点问题: 若矩阵A中的某一元素A[i,j]是第i行中的最小值,而又是第j列中的最大值,则称A[i,j]是矩阵A中的一个鞍点。写出一个可以确定鞍点位置的程序。 稀疏矩阵转置: 输入稀疏矩阵中每个元素的行号、列号、值,建立稀疏矩阵的三元组存储结构,并将此矩阵转置,显示转置前后的三元组结构。 用头尾链表存储表示法建立广义表,输出广义表,求广义表的表头、广义表的表尾和广义表的深度。 树和二叉树 以下问题要求统一在一个大程序里解决。 按先序遍历的扩展序列建立二叉树的存储结构 二叉树先序、中序、后序遍历的递归算法 二叉树中序遍历的非递归算法 二叉树层次遍历的非递归算法 求二叉树的深度(后序遍历) 建立树的存储结构 求树的深度 图 输入任意的一个网,用普里姆(Prim)算法构造最小生成树。 要求建立图的存储结构(邻接表或邻接矩阵),输入任意的一个图,显示图的深度优先搜索遍历路径。 要求建立图的存储结构(邻接表或邻接矩阵),输入任意的一个图,显示图的广度优先搜索遍历路径。 查找 设计一个读入一串整数构成一颗二叉排序树的程序,从二叉排序树中删除一个结点,使该二叉树仍保持二叉排序树的特性。 24、设定哈希函数 H(key) = key MOD 11 ( 表长=11 ),输入一组关键字序列,根据线性探测再散列解决冲突的方法建立哈希表的存储结构,显示哈希表,任意输入关键字,判断是否在哈希表中。 排序 以下问题要求统一在一个大程序里解决。 25、折半插入排序 26、冒泡排序 27、快速排序 28、简单选择排序 29、归并排序 30、堆排序
2.35MB
数据结构动画演示学习工具SWF.zip
2019-09-03软件介绍: 通过SWF动画来演示数据结构查找,排序等原理,对于学习数据结构的同学非常有用。B-树的删除.swfB树的生成.swf查找中序线索二叉树后继.swf串的顺序存单链表结点的插入.swf单链表结点的删除.swf堆排序.swf二叉排序树的删除.swf二叉排序树的生成.swf二叉树的建立.swf二分查找.swf分块查找.swf构造哈夫曼树过程.swf构造哈弗曼算法模拟.swf规并排序.swf基数排序.swf开放定址法建立散列表.swf克鲁斯卡尔算法构造最小生成树.swf快速排序.swf拉链法创建散列表.swf邻接表表示的图的广度优先遍历.swf邻接表表示的图的深度优先遍历.swf冒泡排序.swf朴素串匹配算法过程.swf三元组表的转置.swf树、森林和二叉树的转换.swf顺序表的插入.swf顺序表的删除运算.swf顺序查找.swf顺序队列操作.swf顺序栈(4个存储空间).swf顺序栈1.swf顺序栈2.swf桶式排序法.swf头插法建立单链表.swf图的深度优先遍历.swf拓扑排序.swf尾插法建立单链表.swf希尔排序.swf销毁链表L算法演示.swf寻找中序前驱.swf循环队列操作演示.swf演示.part1.rar栈与递归.swf直接插入排序.swf直接选择排序.swf中序线索化二叉树.swf最短路径.swf
44.15MB
嵌入式系统软件设计中的数据结构
2015-08-23《嵌入式系统软件设计中的数据结构》可作为从事嵌入式系统软件设计的电子技术人员自学"数据结构"的教材,也可供高等院校电子技术类专业本科生、研究生作为教学参考书。 根据嵌入式系统软件设计需要的“数据结构”知识编写而成。书中基本内容有:常用线性数据结构在嵌入式系统中的实现和相关算法;树和图在嵌入式系统中的实现和相关算法;排序和查找算法等。 本书从嵌入式系统的实际硬件环境出发,用通俗易懂的语言代替枯燥难懂的理论解释,结合嵌入式系统的应用实例,使读者在比较轻松的条件下将“数据结构”的基本知识学到手。 本书可作为从事嵌入式系统软件设计的电子技术人员自学“数据结构”的教材,也可供高等院校电子技术类专业本科生、研究生作为教学参考书。 第1章 概述 11.1 数据结构的基本概念1 1.1.1 数据和信息1 1.1.2 数据元素1 1.1.3 数据对象2 1.1.4 数据结构2 1.2 逻辑结构2 1.2.1 线性结构2 1.2.2 树形结构3 1.2.3 图状或网状结构3 1.2.4 纯集合结构4 1.3 存储结构4 1.3.1 顺序存储4 1.3.2 链状存储4 1.3.3 索引存储5 1.3.4 散列存储6 1.4 算法7 1.4.1 算法的描述7 1.4.2 算法的特征8 1.4.3 算法的评价10 1.4.4 算法效率的衡量方法 11 1.4.5 算法的存储空间需求12 1.5 嵌入式系统软件中数据结构的特点13 第2章 线性表14 2.1 线性表的定义14 2.1.1 线性表的逻辑结构定义14 2.1.2 线性表的运算15 2.2 顺序表15 2.2.1 顺序表的定义16 2.2.2 顺序表上的基本运算16 2.3 链表22 2.3.1 单链表22 2.3.2 循环链表35 2.3.3 双链表36 2.4 线性表的应用实例39 第3章 队列44 3.1 队列的定义44 3.1.1 队列的逻辑结构定义44 3.1.2 队列的基本运算44 3.2 循环队列45 3.2.1 顺序队列45 3.2.2 循环队列的概念47 3.2.3 循环队列的运算48 3.3 链队列51 3.3.1 链队列的定义51 3.3.2 链队列的基本运算52 3.4 队列的应用实例57 第4章 堆栈60 4.1 堆栈的定义60 4.1.1 堆栈的逻辑结构定义60 4.1.2 堆栈的基本运算60 4.2 堆栈的使用61 4.2.1 顺序栈61 4.2.2 链栈65 4.3 堆栈的应用实例69 第5章 串73 5.1 串的定义73 5.1.1 串的基本概念73 5.1.2 串的存储结构74 5.2 串的主要操作76 5.3 串的应用实例85 第6章 数组86 6.1 数组的定义86 6.1.1 N维数组的定义86 6.1.2 数组的存储方式87 6.1.3 数组元素的寻址88 6.2 稀疏矩阵的压缩存储89 6.2.1 三元组顺序表90 6.2.2 十字链表93 6.3 稀疏矩阵运算的上机体验96 6.4 数组的应用实例100 第7章 树与二叉树104 7.1 树的定义104 7.1.1 树的逻辑结构定义104 7.1.2 树的逻辑表示105 7.1.3 树的基本术语106 7.2 二叉树的定义106 7.2.1 二叉树的逻辑结构定义106 7.2.2 二叉树的性质108 7.3 二叉树的遍历108 7.3.1 二叉树的存储结构108 7.3.2 二叉链表的生成与输出110 7.3.3 遍历二叉树112 7.3.4 上机体验119 7.4 树的应用实例120 第8章 图124 8.1 图的定义124 8.1.1 图的逻辑结构定义1248.1.2 图的基本术语124 8.2 图的储存126 8.2.1 邻接矩阵存储126 8.2.2 邻接表存储128 8.3 图的遍历129 8.3.1 深度优先搜索遍历129 8.3.2 广度优先搜索遍历131 8.3.3 上机体验132 8.4 图的最小生成树134 8.4.1 生成树与最小生成树1348.4.2 普里姆算法134 8.4.3 克鲁斯卡尔算法138 8.4.4 上机体验140 8.5 最短路径141 8.5.1 路径的概念141 8.5.2 从一个顶点到其余各顶点的最短路径142 8.5.3 每对顶点之间的最短路径145 8.5.4 上机体验148 8.6 图的应用实例149 第9章 排序150 9.1 插入排序150 9.1.1 排序原理150 9.1.2 程序设计151 9.1.3 算法分析1539.2 选择排序153 9.2.1 排序原理153 9.2.2 程序设计154 9.2.3 算法分析155 9.3 冒泡排序156 9.3.1 排序原理156 9.3.2 程序设计1579.3.3 算法分析158 9.4 排序操作上机体验159 9.5 排序方法的选择162 9.6 排序的应用实例163 第10章 查找167 10.1 顺序查找167 10.2 折半查找167 10.3 索引查找16910.4 查找操作上机体验171 10.5 查找的应用实例174 参考文献176
272KB
数据结构与算法全集(C源代码+详细注释)
2012-11-27全集内容结构如下: ├─图 │ ├─关键路径(有向无环图及其应用2) │ │ 1.txt │ │ ALGraph.cpp │ │ ALGraph.h │ │ CriticalPath.cpp │ │ CriticalPath.h │ │ InfoType.cpp │ │ InfoType.h │ │ LinkList.cpp │ │ LinkQueue.cpp │ │ LinkQueue.h │ │ Main.cpp │ │ SqStack.cpp │ │ SqStack.h │ │ Status.h │ │ VertexType.cpp │ │ VertexType.h │ │ │ ├─图的关节点 │ │ 1.txt │ │ ALGraph.cpp │ │ ALGraph.h │ │ FindArticul.cpp │ │ FindArticul.h │ │ InfoType.cpp │ │ InfoType.h │ │ LinkList.cpp │ │ LinkQueue.cpp │ │ LinkQueue.h │ │ main.cpp │ │ Status.h │ │ VertexType.cpp │ │ VertexType.h │ │ │ ├─图的数组表示法 │ │ InfoType.cpp │ │ InfoType.h │ │ Main.cpp │ │ MGraph.cpp │ │ MGraph.h │ │ Status.h │ │ VertexType.cpp │ │ VertexType.h │ │ │ ├─图的遍历 │ │ ALGraph.cpp │ │ ALGraph.h │ │ DEBUG.txt │ │ InfoType.cpp │ │ InfoType.h │ │ LinkList.cpp │ │ LinkQueue.cpp │ │ LinkQueue.h │ │ Main.cpp │ │ MGraph.cpp │ │ MGraph.h │ │ MTraverse.cpp │ │ MTraverse.h │ │ Status.h │ │ t1.txt │ │ t2.txt │ │ VertexType.cpp │ │ VertexType.h │ │ │ ├─图的邻接表存储结构 │ │ ALGraph.cpp │ │ ALGraph.h │ │ InfoType.cpp │ │ InfoType.h │ │ LinkList.cpp │ │ LinkQueue.cpp │ │ LinkQueue.h │ │ Main.cpp │ │ Status.h │ │ t1.txt │ │ t2.txt │ │ VertexType.cpp │ │ VertexType.h │ │ │ ├─最短路径(从某个源点到其余各顶点的的最短路径) │ │ 1.txt │ │ 2.txt │ │ InfoType.cpp │ │ InfoType.h │ │ Main.cpp │ │ MGraph.cpp │ │ MGraph.h │ │ ShortestPath_DIJ.cpp │ │ ShortestPath_DIJ.h │ │ Status.h │ │ VertexType.cpp │ │ VertexType.h │ │ │ └─最短路径(每一对顶点间的最短路径) │ 1.txt │ 2.txt │ InfoType.cpp │ InfoType.h │
928KB
数据结构和算法Flash动画演示
2013-01-01一些算法的 flash动画演示:B树的删除,B树的生长过程,三元组表的转置,中序线索化二叉树,串的顺序存储,二分查找,二叉排序树的删除,二叉排序树的生成,二叉树的建立,克鲁斯卡尔算法构造最小生成树,冒泡排序,分块查找,单链表结点的删除,单链表结点的插入,图的深度优先遍历,基数排序,堆排序,头插法建单链表,寻找中序线索化二叉树指定结点的前驱,寻找中序线索化二叉树指定结点的后继,尾插法建表,希儿排序,开放定址法建立散列表,循环队列操作演示,快速排序,拉链法创建散列表,拓扑排序,最短路径,朴素串匹配算法过程示意,构造哈夫曼树的算法模拟,构造哈夫曼树过程,栈与递归,树、森林和二叉树的转换,桶式排序法,直接插入排序,直接选择排序,规并排序,邻接表表示的图的广度优先遍历,邻接表表示的图的深度优先遍历,顺序查找,顺序栈(4个存储空间),顺序栈(8个存储空间),顺序表的删除运算,顺序队列操作。
938KB
Flash动画演示 数据结构和算法
2008-11-03B树的删除.swf B树的生长过程.swf 三元组表的转置.swf 中序线索化二叉树.swf 串的顺序存储.swf 二分查找.swf 二叉排序树的删除.swf 二叉排序树的生成.swf 二叉树的建立.swf 克鲁斯卡尔算法构造最小生成树.swf 冒泡排序.swf 分块查找.swf 单链表结点的删除.swf 单链表结点的插入.swf 图的深度优先遍历.swf 基数排序.swf 堆排序.swf 头插法建单链表.swf 寻找中序线索化二叉树指定结点的前驱.swf 寻找中序线索化二叉树指定结点的后继.swf 尾插法建表.swf 希儿排序.swf 开放定址法建立散列表.swf 循环队列操作演示.swf 快速排序.swf 拉链法创建散列表.swf 拓扑排序.swf 最短路径.swf 朴素串匹配算法过程示意.swf 构造哈夫曼树的算法模拟.swf 构造哈夫曼树过程.swf 栈与递归.swf 树、森林和二叉树的转换.swf 桶式排序法.swf 直接插入排序.swf 直接选择排序.swf 规并排序.swf 邻接表表示的图的广度优先遍历.swf 邻接表表示的图的深度优先遍历.swf 顺序查找.swf 顺序栈(4个存储空间).swf 顺序栈(8个存储空间).swf 顺序表的删除运算.swf 顺序表的插入.swf 顺序队列操作.swf
4.5MB
用c描述的数据结构演示软件
2012-07-24数据结构算法演示(Windows版) 使 用 手 册 一、 功能简介 本课件是一个动态演示数据结构算法执行过程的辅助教学软件, 它可适应读者对算法的输入数据和过程执行的控制方式的不同需求, 在计算机的屏幕上显示算法执行过程中数据的逻辑结构或存储结构的变化状况或递归算法执行过程中栈的变化状况。整个系统使用菜单驱动方式, 每个菜单包括若干菜单项。每个菜单项对应一个动作或一个子菜单。系统一直处于选择菜单项或执行动作状态, 直到选择了退出动作为止。 二、 系统内容 本系统内含84个算法,分属13部分内容,由主菜单显示,与《数据结构》教科书中自第2章至第11章中相对应。各部分演示算法如下: 1. 顺序表 (1)在顺序表中插入一个数据元素(ins_sqlist) (2)删除顺序表中一个数据元素(del_sqlist) (3)合并两个有序顺序表(merge_sqlist) 2. 链表 (1)创建一个单链表(Crt_LinkList) (2)在单链表中插入一个结点(Ins_LinkList) (3)删除单链表中的一个结点(Del_LinkList) (4)两个有序链表求并(Union) (5)归并两个有序链表(MergeList_L) (6)两个有序链表求交(ListIntersection_L) (7)两个有序链表求差(SubList_L) 3. 栈和队列 (1)计算阿克曼函数(AckMan) (2)栈的输出序列(Gen、Perform) (3)递归算法的演示 汉诺塔的算法(Hanoi) 解皇后问题的算法(Queen) 解迷宫的算法(Maze) 解背包问题的算法(Knap) (4)模拟银行(BankSimulation) (5)表达式求值(Exp_reduced) 4. 串的模式匹配 (1)古典算法(Index_BF) (2)求Next 函数值(Get_next)和按Next 函数值进行匹配 (Index_KMP(next)) (3)求 Next 修正值(Get_nextval)和按 Next 修正值进行匹配(Index_KMP(nextval)) 5. 稀疏矩阵 (1)矩阵转置 (Trans_Sparmat) (2)快速矩阵转置 (Fast_Transpos) (3)矩阵乘法 (Multiply_Sparmat) 6. 广义表 (1)求广义表的深度(Ls_Depth) (2)复制广义表(Ls_Copy) (3)创建广义表的存储结构(Crt_Lists) 7. 二叉树 (1)遍历二叉树 二叉树的线索化 先序遍历(Pre_order) 中序遍历(In_order) 后序遍历(Post_order) (2) 按先序建二叉树(CrtBT_PreOdr) (3) 线索二叉树 二叉树的线索化 生成先序线索(前驱或后继) (Pre_thre) 中序线索(前驱或后继) (In_thre) 后序线索(前驱或后继) (Post_thre) 遍历中序线索二叉树(Inorder_thlinked) 中序线索树的插入(ins_lchild_inthr)和删除(del_lchild_inthr)结点 (4)建赫夫曼树和求赫夫曼编码(HuffmanCoding) (5)森林转化成二叉树(Forest2BT) (6)二叉树转化成森林(BT2Forest) (7)按表达式建树(ExpTree)并求值(CalExpTreeByPostOrderTrav) 8. 图 (1)图的遍历 深度优先搜索(Travel_DFS) 广度优先搜索(Travel_BFS) (2)求有向图的强连通分量(Strong_comp) (3)有向无环图的两个算法 拓扑排序(Toposort) 关键路径(Critical_path) (4)求最小生成树 普里姆算法(Prim) 克鲁斯卡尔算法(Kruscal) (5)求关节点和重连通分量(Get_artical) (6)求最短路径 弗洛伊德算法(shortpath_Floyd) 迪杰斯特拉算法(shortpath_DIJ) 9. 存储管理 (1)边界标识法 (Boundary_tag_method) (2)伙伴系统 (Buddy_system) (3)紧缩无用单元 (Storage_compaction) 10. 静态查找 (1)顺序查找(Search_Seq) (2)折半查找 (Serch_Bin) (3)插值查找 (Search_Ins) (4)斐波那契查找 (Search_Fib) (5)次优查找树(BiTree_SOSTree) 11. 动态查找 (1)在二叉排序树上进行查找(bstsrch)、插入结点(ins_bstree)和删除结点(del_bstree) (2)在二叉平衡树上插入结点(ins_AVLtree) 和删除结点(del_AVLtree) (3)在 B-树上插入结点(Ins_BTree) 和 删除结点(Del_BTree) (4)在 B+树上插入结点(Ins_PBTree) 和 删除结点(Del_PBTree) 12. 内部排序 (1)简单排序法 直接插入排序(Insert_sort) 表插入排序(内含插入(Ins_Tsort) 重排(Arrange)两个算法) 起泡排序(BubbleSort) 简单选择排序(SelectSort) (2)复杂排序法 堆排序(HeapSort) 快速排序(QuickSort) 锦标赛排序(Tournament) (3)其他 快速地址排序(QkAddrst) 基数排序(RadixSort) 13. 外部排序 (1)多路平衡归并排序(K-Merge) (2)置换-选择排序(Repl_Selection) 三、 运行环境 1. 硬件:Pentium100以上PC机。 2. 软件:Windows95及以上版本的操作系统。 四、 运行 本系统的执行文件为DSDEMOW.EXE。 五、 如何使用本课件 读者可以利用鼠标移动光标选择“演示算法”或“菜单命令”来控制课件的运行过程。 1. 课件的演示算法菜单为页式菜单。第一级菜单中的各项与上述“系统内容”中各大项相对应,读者运行“算法演示课件”后, 即进入“算法选择一级菜单”画面,此时可移动光标进行选择,当光标所在菜单项改为红色时,单击鼠标即进入“算法选择二级菜单”,进行相同操作之后,或进入算法选择三级菜单(如图1所示),或进入算法演示的执行状态(如图2所示)。 图1 图2 在算法选择菜单画面中,形如 的图标意为尚有下级菜单,形如 的图标则表示将直接进入算法演示状态。此时也可直接单击一级菜单或二级菜单的标题直接返回之,注意:菜单右侧上方的“退出”按钮意为退出整个演示课件。 2. 算法演示执行状态下的屏幕分为三部分:第一行为“标题行”,第二行为“菜单命令”,以下为算法演示屏上各菜单的说明。 菜单命令中各项自左至右的功能分别为: 数据——设置算法演示的数据(数据结构)。 调用栈——察看当前函数(或过程)嵌套或递归的历程。 说明——察看算法说明。 暂停——中断演示过程。 执行——连续执行算法直至所设断点或至算法执行完毕。 单步——执行一行算法,遇到子程序调用时,连续执行完子程序。 跟踪——执行一行算法,遇到子程序调用时,进入子程序。 执行到——演示算法到当前所设最近的断点或算法窗口中的当前行。 恢复——重置屏幕为当前算法执行前的初始状态。 断点——在算法窗口的当前选择行设置断点或清除断点。 设置——设置连续演示时的速度或开/闭背景音乐(或动作音效)开关。 返回——返回算法选择菜单。 3. 断点的设置方法为:移动光标至“断点语句”所在行,点击鼠标后即出现绿色光条,之后单击“断点”菜单中的“设置断点”命令项即可,此时该断点语句所在行上将出现红色光条。 六、 算法演示屏的详细说明 本系统对屏幕设计的基本原则是集数据结构、算法和其他重要信息(如栈等)于同一屏幕。一般情况下演示屏由图示、算法和变量三个窗口组成,特殊情况下将根据演示内容适当增加。一般情况下, 左侧图示窗口显示演示数据的逻辑结构或存储结构,右侧上方窗口显示算法文本,右侧下方窗口显示当前算法中各变量的值或递归工作栈的状态。各窗口间的边界大小均可自由调节,且可按需扩大至全屏。 算法窗口显示当前演示的算法文本,并以深蓝色的光条覆盖将要执行的语句。若算法中含有函数或过程调用语句,则当光条覆盖到该过程调用语句时,随即自动隐去原算法文本而显示子过程的文本,而从此过程返回时再重新显示原算法文本。类似地,在演示递归算法执行过程时,每当执行递归调用本过程的语句时,随即隐去当前层次的算法文本而显示下一层的算法文本,并且以不同颜色的算法文本表示递归的不同层次。如第一层的算法文本为深绿色,第二层为紫色,第三层为深红色,第四层为深蓝色,第五层为浅蓝色,第六层为玫瑰红色等。 当演示递归算法执行过程中递归工作栈的变化状态时,递归工作栈显示在右侧下窗口,递归工作栈的状态和算法文本窗口中相应语句执行后的结果相对应,栈顶记录为当前递归层的参量值。每进入一层递归时,就产生一个新的工作记录(包括调用语句行号、变量参数或全程变量、数值参数和局部变量)压入栈顶;每退出一层递归时,先根据栈顶的调用语句行号返回至上层,然后在传递完变量参数的值后退栈。 各个算法演示屏的补充说明如下: 1. 顺序表和链表的插入、删除和链表的生成 算法演示屏由显示顺序表或链表的图示、算法文本及变量等三个窗口组成。在演示算法之前,需先在弹出的小窗口中输入线性表的数据元素及算法参数 i(插入或删除的位置)和 b(被插的数据元素)的值。顺序表的图示窗口在演示屏的上方,链表的图示窗口在左侧。 2. 有序表的操作 算法演示屏的状态和 1 中所述相同。 3. 汉诺塔问题 算法演示屏由4个窗口组成。右侧上方为算法文本,在算法中有4个形式参量,其中值参 n 为圆盘个数,x、y、和 z 分别表示3个塔座;右侧下方为递归工作栈,栈中每个记录包含调用语句行号 adr 及值参 n 和 x、y、z;左侧上方显示汉诺塔图形及移动操作结果;左侧下方显示移动操作的记录。 4. 迷宫问题 左侧窗口显示迷宫的逻辑结构,由 N×N 个方格组成,左上[1,1]为入口,右下[N,N]为出口,并且以红色钉子填充表示障碍,空白表示通路,红色交通灯表示已游历过的路,箭头表示继续游历的方向,演示结束时显示一条通路或迷宫不通的信息。右侧下窗口为递归工作栈,栈中每个记录含6个数据项,其中 adr 指示调用语句行号,k 指示步数,(x,y) 表示当前坐标,i 指示路径方向(起始方向为 1,顺时针方向旋转搜索)。 5. 皇后问题 左侧图示窗口包含棋盘和递归工作栈两部分,栈中记录含3个数据项,其中 adr 指示调用语句行号,k 指示列号,i 指示行号。此算法演示可求得所有可行结果,在求得每一种排布的结果之后,均会弹出一个窗口显示“找到第 j (j=1,2,…) 种排布”,单击“确定”按钮将继续进行,直至找到所有可能构成的排布。 6. 背包问题 右侧图示窗口的上方显示背包、物件及其体积。 若有解,则在求得每一组结果之后,均会弹出一个窗口提示求得一组解,单击提示窗口中的小人将继续进行。该窗口的下方为递归工作栈,栈中的记录含3个数据项,其中 adr 指示调用语句所在行号,n 指示物件个数,t 指示背包总体积。 7. 阿克曼函数 整个演示屏只有显示算法文本和显示算法执行过程中栈的状态两个窗口。在执行算法之前,首先应按照提示输入参数 m 和 n 的值。 8. 栈的输出序列 图示窗口的内容为:由算法 Gen 生成的栈的操作序列(列出在窗口的下方)、算法 Perform 执行时栈的操作过程(该窗口的上方)以及算法 Perform 执行的结果——栈的输出序列(列出在图示窗口的右侧)。 9. 表达式求值 图示窗口的内容主要为显示表达式求值过程中操作数栈和运算符栈的变化情况以及主要操作。上方的小窗口显示在算法演示之前设定的表达式。 10. 离散事件模拟 图示窗口分成3部分:中间部分或显示客户流动情况的动画,或显示程序执行过程中事件表和4个队列的数值,上方两个按钮用以切换动画或静态数据,下方则显示客户总人数、客户逗留的累计时间以及调节动画中小人移动速度的指针。 11. 串的模式匹配 上窗口显示算法文本,下窗口显示串的匹配过程或求 next 函数的过程。 12. 稀疏矩阵 图示窗口显示矩阵的状态或其三元组的表示。 13. 求广义表的深度 图示窗口显示广义表的存储结构,图中指针 ls 指向当前所求深度的广义表,值为空时不显示。演示结束时弹出窗口显示求得的深度。 14. 复制广义表 图示窗口的上方显示已知广义表的存储结构,图示窗口的下方显示复制求得的广义表的存储结构。递归工作栈中含调用语句行号 adr、变参 nls 和值参 ls。 15. 创建广义表的存储结构 图示窗口显示广义表存储结构的建立过程和算法执行过程中参数Sub的当前值。 16. 遍历二叉树 图示窗口显示二叉树的逻辑结构和遍历结果输出的结点序列,图中指针 bt 指向当前遍历的二叉树的根结点。 17. 线索二叉树 图示窗口显示二叉树的存储结构,但结点中只含标志域,而以结点间的黑色连线表示指针,红色连线表示前驱线索,蓝色连线表示后继线索。在二叉树线索化的过程中,图中指针 p 指向当前层二叉树的根结点,指针 pre 指向当前被访问的结点的前驱。在演示线索树的插入和删除过程时,图示窗口的下方还包括“输入行”和“提示行”。 18. 按先序序列建二叉链表 图示窗口显示输入的先序序列和生成二叉链表的过程。 19. 森林和二叉树的相互转换 图示窗口在显示屏的上方,其左侧为森林,右侧为二叉树。 20. 赫夫曼树和赫夫曼编码 图示窗口显示生成的赫夫曼树的逻辑结构和每个叶子结点的编码。 21. 图的深度优先搜索 图示窗口的上半部分显示图的逻辑结构,初始状态用青色圆圈表示顶点,结点间的黑色连线表示边或弧(连线上画有箭头)。演示过程中用红色覆盖已访问的顶点和边(或弧)。窗口下方显示图的邻接表,演示过程中以红色框边表示已访问过的弧。图示窗口的下方显示遍历后输出的顶点序列。 22. 图的广度优先搜索 与深度优先不同的是,在窗口的下方增加一个队列,其左端为队头,右端为队尾。 23. 求有向图的强连通分量 图示窗口自上而下分别显示有向图的逻辑结构、存储结构和 Finished 数组在算法执行过程中的变化情况。所求得的各个强连通分量,将以不同颜色的顶点组表示。 24. 求关节点和重连通分量 图示窗口的上半部分显示无向图,下半部分自上而下分别显示 Vexnum、Vexdata、Visited、Low、Squlow(求得 low 值的顺序)和 artpoint(关节点)的信息。 25. 有向图的拓扑排序 图示窗口由5部分组成。其中左上显示有向图的邻接表;左下显示有向图,其中顶点和弧的初始状态分别为绿色和黑色,从栈中退出的顶点(i)用红色表示,分别以蓝色和红色指示当前访问的邻接点(k)和它们之间的弧(ik),灰白色表示已经输出的顶点;右下显示顶点的入度;右上显示入度为零的栈。当拓扑排序不成功时,在演示屏的中央将会弹出一个窗口,显示提示信息“网中存在自环!”,此时用户可在左下显示的有向图中由绿色顶点和黑色弧构成的子图中找到这个环。 26. 有向图的关键路径 图示窗口包含5部分信息。左上显示带入度域的邻接表;左下显示有向网的逻辑结构和顶点的入度及各顶点事件的最早发生时间和最迟发生时间;右下显示拓扑排序过程中入度为零的顶点的栈S,右上显示的栈 T 存放拓扑序列,其入栈顺序和栈 S 的出栈顺序相同,从栈顶到栈底的顶点顺序即为顶点的逆拓扑序列。算法执行结束后将弹出窗口列出全部结果,其中红色字体的弧表示关键活动。 27. 普里姆算法 图示窗口包含3部分内容。右上是邻接矩阵;左上是无向网的逻辑结构,图中顶点的初始状态为黄色,算法执行过程中,红色覆盖的顶点和边则表示已加入生成树的顶点和生成树上的边;窗口的下方则显示 closedge 数组中的值。 28. 克鲁斯卡尔算法 图示窗口的左侧为无向网,以红色标定已落在生成树上的边;右侧自上而下列出各条边的信息以及选择生成树的边的执行过程。 29. 边界标识法 图示窗口的初始状态为 64KB 的模拟存储器,演示过程中,以绿色覆盖占用块。各个存储块的头部左侧所示为该块的起始地址,头部结构或其他信息参见教科书。用户可根据弹出窗口的操作提示信息进行操作,输入请求分配的空间大小或释放块的首地址。 30. 伙伴系统 在图示窗口中,左侧为可利用空间链表的逻辑结构,右侧为存储结构,其中红色覆盖部分为占用块。弹出窗口为输入窗口,由用户输入请求分配的空间大小或释放块的首地址。 31. 紧缩无用单元 右侧显示存储空间,空白表示空闲块,其他颜色覆盖表示占用块,在存储空间不足分配时将进行空闲块压缩。左侧显示存储映像。弹出窗口为输入窗口,由用户输入请求分配的空间大小和分配或释放块的块名。 32. 静态查找 上窗口为图示窗口,演示查找过程;左下和右下分别为算法文本和变量窗口。 33. B-树和B+树 整个屏幕分为上、下两个窗口,上窗口演示插入或删除结点过程中B-树或B+ 树结构的变化状况;下窗口内显示如查找关键字、插入位置、结点分裂等操作信息。下窗口上面左侧的小窗口为编辑窗口,由用户输入待插或待删的关键字,输入之后其右侧的操作命令将由隐式状态改为显式状态。 34. 内部排序 图示窗口演示排序过程以及排序过程中关键字之间进行的比较次数和记录移动的次数。 七、 用户自行输入数据指南 算法操作的对象——数据结构,或由用户自行输入,或由系统随机产生,并在获得用户的确认之前,可反复随机产生,直至用户满意,用鼠标点击“OK”按钮确认为止。 多数情况下的输入界面上有足够的提示信息,以指示用户需要进行何种操作。补充说明如下: 1. 表的数据元素为任意的单个字符。 2. 迷宫的输入界面如图3所示。图中砖墙图案表示障碍,连续点击鼠标可将光标所在位置设置成通道或者障碍,建议用户先点击“随机生成”按钮随机生成一个迷宫,然后移动鼠标调整成所需。所设迷宫可以利用“保存数据”按钮生成dat类型文件,并在需要时可以利用“取出数据”按钮读入。 图3 3. 演示背包问题的算法之前,首先需要输入物品个数,之后将出现如图4所示的输入界面,可以利用“随机生成”的按钮或各个相应的小窗口输入物品体积 wi 和背包体积 T 。背包的总体积不得超过 30 ,单个物品的体积不得超过 10 。 图4 4. “表达式求值”和“建表达式树”时的输入界面如图5所示。用户可在窗口内自行输入,并以“Enter”键为结束符;也可以连续点击左侧蓝色的表达式由系统自动生成,直至用户点击右侧的计算器表示确认为止。“求值”可实现带括弧的四则运算和幂次运算,并支持sin、cos、tan、arcsin 和 arccos 等函数计算,其操作数为实数。“建树”的表达式仅限于带括弧的四则运算,其操作数为单个字母的字符。 图5 5. 稀疏矩阵的输入界面如图6所示。用户可随意进行矩阵中任意位置元素的输入,只要将光标移动至待输入的元素位置,单击鼠标后将弹出计算器,单击数字按钮,可进行随意输入,之后点击“OK”按钮表示确认。 图6 6. 广义表的数据输入方式为自左向右顺序输入广义表的字符串。输入过程中,图7所示输入界面中的“确定”为灰色字体,只有当用户正确输入完毕时,“确定”两字才改为黑色字体,此时用户可单击此按钮表示确认。 图7 7. 图的输入界面如图8所示。之前尚需确认是否为有向图和带权图。在用户自行输入图时,首先按下“创建节点”按钮,之后可移动光标至窗口的任意位置单击鼠标创建顶点;然后单击“创建弧”按钮,可在任意两个顶点之间构建弧或边。构建弧(或边)的操作为:先将光标移动至弧尾的顶点,单击一次鼠标,然后移动光标至弧头位置,再单击一次鼠标。对于带权的图,则在构建弧(或边)的同时,在当时弹出的窗口中输入权值,权值的默认值为 1。 图8
3.16MB
数据结构演示软件
2013-06-02数据结构算法演示(Windows版) 使 用 手 册 一、 功能简介 本课件是一个动态演示数据结构算法执行过程的辅助教学软件, 它可适应读者对算法的输入数据和过程执行的控制方式的不同需求, 在计算机的屏幕上显示算法执行过程中数据的逻辑结构或存储结构的变化状况或递归算法执行过程中栈的变化状况。整个系统使用菜单驱动方式, 每个菜单包括若干菜单项。每个菜单项对应一个动作或一个子菜单。系统一直处于选择菜单项或执行动作状态, 直到选择了退出动作为止。 二、 系统内容 本系统内含84个算法,分属13部分内容,由主菜单显示,与《数据结构》教科书中自第2章至第11章中相对应。各部分演示算法如下: 1. 顺序表 (1)在顺序表中插入一个数据元素(ins_sqlist) (2)删除顺序表中一个数据元素(del_sqlist) (3)合并两个有序顺序表(merge_sqlist) 2. 链表 (1)创建一个单链表(Crt_LinkList) (2)在单链表中插入一个结点(Ins_LinkList) (3)删除单链表中的一个结点(Del_LinkList) (4)两个有序链表求并(Union) (5)归并两个有序链表(MergeList_L) (6)两个有序链表求交(ListIntersection_L) (7)两个有序链表求差(SubList_L) 3. 栈和队列 (1)计算阿克曼函数(AckMan) (2)栈的输出序列(Gen、Perform) (3)递归算法的演示 汉诺塔的算法(Hanoi) 解皇后问题的算法(Queen) 解迷宫的算法(Maze) 解背包问题的算法(Knap) (4)模拟银行(BankSimulation) (5)表达式求值(Exp_reduced) 4. 串的模式匹配 (1)古典算法(Index_BF) (2)求Next 函数值(Get_next)和按Next 函数值进行匹配 (Index_KMP(next)) (3)求 Next 修正值(Get_nextval)和按 Next 修正值进行匹配(Index_KMP(nextval)) 5. 稀疏矩阵 (1)矩阵转置 (Trans_Sparmat) (2)快速矩阵转置 (Fast_Transpos) (3)矩阵乘法 (Multiply_Sparmat) 6. 广义表 (1)求广义表的深度(Ls_Depth) (2)复制广义表(Ls_Copy) (3)创建广义表的存储结构(Crt_Lists) 7. 二叉树 (1)遍历二叉树 二叉树的线索化 先序遍历(Pre_order) 中序遍历(In_order) 后序遍历(Post_order) (2) 按先序建二叉树(CrtBT_PreOdr) (3) 线索二叉树 二叉树的线索化 生成先序线索(前驱或后继) (Pre_thre) 中序线索(前驱或后继) (In_thre) 后序线索(前驱或后继) (Post_thre) 遍历中序线索二叉树(Inorder_thlinked) 中序线索树的插入(ins_lchild_inthr)和删除(del_lchild_inthr)结点 (4)建赫夫曼树和求赫夫曼编码(HuffmanCoding) (5)森林转化成二叉树(Forest2BT) (6)二叉树转化成森林(BT2Forest) (7)按表达式建树(ExpTree)并求值(CalExpTreeByPostOrderTrav) 8. 图 (1)图的遍历 深度优先搜索(Travel_DFS) 广度优先搜索(Travel_BFS) (2)求有向图的强连通分量(Strong_comp) (3)有向无环图的两个算法 拓扑排序(Toposort) 关键路径(Critical_path) (4)求最小生成树 普里姆算法(Prim) 克鲁斯卡尔算法(Kruscal) (5)求关节点和重连通分量(Get_artical) (6)求最短路径 弗洛伊德算法(shortpath_Floyd) 迪杰斯特拉算法(shortpath_DIJ) 9. 存储管理 (1)边界标识法 (Boundary_tag_method) (2)伙伴系统 (Buddy_system) (3)紧缩无用单元 (Storage_compaction) 10. 静态查找 (1)顺序查找(Search_Seq) (2)折半查找 (Serch_Bin) (3)插值查找 (Search_Ins) (4)斐波那契查找 (Search_Fib) (5)次优查找树(BiTree_SOSTree) 11. 动态查找 (1)在二叉排序树上进行查找(bstsrch)、插入结点(ins_bstree)和删除结点(del_bstree) (2)在二叉平衡树上插入结点(ins_AVLtree) 和删除结点(del_AVLtree) (3)在 B-树上插入结点(Ins_BTree) 和 删除结点(Del_BTree) (4)在 B+树上插入结点(Ins_PBTree) 和 删除结点(Del_PBTree) 12. 内部排序 (1)简单排序法 直接插入排序(Insert_sort) 表插入排序(内含插入(Ins_Tsort) 重排(Arrange)两个算法) 起泡排序(BubbleSort) 简单选择排序(SelectSort) (2)复杂排序法 堆排序(HeapSort) 快速排序(QuickSort) 锦标赛排序(Tournament) (3)其他 快速地址排序(QkAddrst) 基数排序(RadixSort) 13. 外部排序 (1)多路平衡归并排序(K-Merge) (2)置换-选择排序(Repl_Selection) 三、 运行环境 1. 硬件:Pentium100以上PC机。 2. 软件:Windows95及以上版本的操作系统。 四、 运行 本系统的执行文件为DSDEMOW.EXE。 五、 如何使用本课件 读者可以利用鼠标移动光标选择“演示算法”或“菜单命令”来控制课件的运行过程。 1. 课件的演示算法菜单为页式菜单。第一级菜单中的各项与上述“系统内容”中各大项相对应,读者运行“算法演示课件”后, 即进入“算法选择一级菜单”画面,此时可移动光标进行选择,当光标所在菜单项改为红色时,单击鼠标即进入“算法选择二级菜单”,进行相同操作之后,或进入算法选择三级菜单(如图1所示),或进入算法演示的执行状态(如图2所示)。 图1 图2 在算法选择菜单画面中,形如 的图标意为尚有下级菜单,形如 的图标则表示将直接进入算法演示状态。此时也可直接单击一级菜单或二级菜单的标题直接返回之,注意:菜单右侧上方的“退出”按钮意为退出整个演示课件。 2. 算法演示执行状态下的屏幕分为三部分:第一行为“标题行”,第二行为“菜单命令”,以下为算法演示屏上各菜单的说明。 菜单命令中各项自左至右的功能分别为: 数据——设置算法演示的数据(数据结构)。 调用栈——察看当前函数(或过程)嵌套或递归的历程。 说明——察看算法说明。 暂停——中断演示过程。 执行——连续执行算法直至所设断点或至算法执行完毕。 单步——执行一行算法,遇到子程序调用时,连续执行完子程序。 跟踪——执行一行算法,遇到子程序调用时,进入子程序。 执行到——演示算法到当前所设最近的断点或算法窗口中的当前行。 恢复——重置屏幕为当前算法执行前的初始状态。 断点——在算法窗口的当前选择行设置断点或清除断点。 设置——设置连续演示时的速度或开/闭背景音乐(或动作音效)开关。 返回——返回算法选择菜单。 3. 断点的设置方法为:移动光标至“断点语句”所在行,点击鼠标后即出现绿色光条,之后单击“断点”菜单中的“设置断点”命令项即可,此时该断点语句所在行上将出现红色光条。 六、 算法演示屏的详细说明 本系统对屏幕设计的基本原则是集数据结构、算法和其他重要信息(如栈等)于同一屏幕。一般情况下演示屏由图示、算法和变量三个窗口组成,特殊情况下将根据演示内容适当增加。一般情况下, 左侧图示窗口显示演示数据的逻辑结构或存储结构,右侧上方窗口显示算法文本,右侧下方窗口显示当前算法中各变量的值或递归工作栈的状态。各窗口间的边界大小均可自由调节,且可按需扩大至全屏。 算法窗口显示当前演示的算法文本,并以深蓝色的光条覆盖将要执行的语句。若算法中含有函数或过程调用语句,则当光条覆盖到该过程调用语句时,随即自动隐去原算法文本而显示子过程的文本,而从此过程返回时再重新显示原算法文本。类似地,在演示递归算法执行过程时,每当执行递归调用本过程的语句时,随即隐去当前层次的算法文本而显示下一层的算法文本,并且以不同颜色的算法文本表示递归的不同层次。如第一层的算法文本为深绿色,第二层为紫色,第三层为深红色,第四层为深蓝色,第五层为浅蓝色,第六层为玫瑰红色等。 当演示递归算法执行过程中递归工作栈的变化状态时,递归工作栈显示在右侧下窗口,递归工作栈的状态和算法文本窗口中相应语句执行后的结果相对应,栈顶记录为当前递归层的参量值。每进入一层递归时,就产生一个新的工作记录(包括调用语句行号、变量参数或全程变量、数值参数和局部变量)压入栈顶;每退出一层递归时,先根据栈顶的调用语句行号返回至上层,然后在传递完变量参数的值后退栈。 各个算法演示屏的补充说明如下: 1. 顺序表和链表的插入、删除和链表的生成 算法演示屏由显示顺序表或链表的图示、算法文本及变量等三个窗口组成。在演示算法之前,需先在弹出的小窗口中输入线性表的数据元素及算法参数 i(插入或删除的位置)和 b(被插的数据元素)的值。顺序表的图示窗口在演示屏的上方,链表的图示窗口在左侧。 2. 有序表的操作 算法演示屏的状态和 1 中所述相同。 3. 汉诺塔问题 算法演示屏由4个窗口组成。右侧上方为算法文本,在算法中有4个形式参量,其中值参 n 为圆盘个数,x、y、和 z 分别表示3个塔座;右侧下方为递归工作栈,栈中每个记录包含调用语句行号 adr 及值参 n 和 x、y、z;左侧上方显示汉诺塔图形及移动操作结果;左侧下方显示移动操作的记录。 4. 迷宫问题 左侧窗口显示迷宫的逻辑结构,由 N×N 个方格组成,左上[1,1]为入口,右下[N,N]为出口,并且以红色钉子填充表示障碍,空白表示通路,红色交通灯表示已游历过的路,箭头表示继续游历的方向,演示结束时显示一条通路或迷宫不通的信息。右侧下窗口为递归工作栈,栈中每个记录含6个数据项,其中 adr 指示调用语句行号,k 指示步数,(x,y) 表示当前坐标,i 指示路径方向(起始方向为 1,顺时针方向旋转搜索)。 5. 皇后问题 左侧图示窗口包含棋盘和递归工作栈两部分,栈中记录含3个数据项,其中 adr 指示调用语句行号,k 指示列号,i 指示行号。此算法演示可求得所有可行结果,在求得每一种排布的结果之后,均会弹出一个窗口显示“找到第 j (j=1,2,…) 种排布”,单击“确定”按钮将继续进行,直至找到所有可能构成的排布。 6. 背包问题 右侧图示窗口的上方显示背包、物件及其体积。 若有解,则在求得每一组结果之后,均会弹出一个窗口提示求得一组解,单击提示窗口中的小人将继续进行。该窗口的下方为递归工作栈,栈中的记录含3个数据项,其中 adr 指示调用语句所在行号,n 指示物件个数,t 指示背包总体积。 7. 阿克曼函数 整个演示屏只有显示算法文本和显示算法执行过程中栈的状态两个窗口。在执行算法之前,首先应按照提示输入参数 m 和 n 的值。 8. 栈的输出序列 图示窗口的内容为:由算法 Gen 生成的栈的操作序列(列出在窗口的下方)、算法 Perform 执行时栈的操作过程(该窗口的上方)以及算法 Perform 执行的结果——栈的输出序列(列出在图示窗口的右侧)。 9. 表达式求值 图示窗口的内容主要为显示表达式求值过程中操作数栈和运算符栈的变化情况以及主要操作。上方的小窗口显示在算法演示之前设定的表达式。 10. 离散事件模拟 图示窗口分成3部分:中间部分或显示客户流动情况的动画,或显示程序执行过程中事件表和4个队列的数值,上方两个按钮用以切换动画或静态数据,下方则显示客户总人数、客户逗留的累计时间以及调节动画中小人移动速度的指针。 11. 串的模式匹配 上窗口显示算法文本,下窗口显示串的匹配过程或求 next 函数的过程。 12. 稀疏矩阵 图示窗口显示矩阵的状态或其三元组的表示。 13. 求广义表的深度 图示窗口显示广义表的存储结构,图中指针 ls 指向当前所求深度的广义表,值为空时不显示。演示结束时弹出窗口显示求得的深度。 14. 复制广义表 图示窗口的上方显示已知广义表的存储结构,图示窗口的下方显示复制求得的广义表的存储结构。递归工作栈中含调用语句行号 adr、变参 nls 和值参 ls。 15. 创建广义表的存储结构 图示窗口显示广义表存储结构的建立过程和算法执行过程中参数Sub的当前值。 16. 遍历二叉树 图示窗口显示二叉树的逻辑结构和遍历结果输出的结点序列,图中指针 bt 指向当前遍历的二叉树的根结点。 17. 线索二叉树 图示窗口显示二叉树的存储结构,但结点中只含标志域,而以结点间的黑色连线表示指针,红色连线表示前驱线索,蓝色连线表示后继线索。在二叉树线索化的过程中,图中指针 p 指向当前层二叉树的根结点,指针 pre 指向当前被访问的结点的前驱。在演示线索树的插入和删除过程时,图示窗口的下方还包括“输入行”和“提示行”。 18. 按先序序列建二叉链表 图示窗口显示输入的先序序列和生成二叉链表的过程。 19. 森林和二叉树的相互转换 图示窗口在显示屏的上方,其左侧为森林,右侧为二叉树。 20. 赫夫曼树和赫夫曼编码 图示窗口显示生成的赫夫曼树的逻辑结构和每个叶子结点的编码。 21. 图的深度优先搜索 图示窗口的上半部分显示图的逻辑结构,初始状态用青色圆圈表示顶点,结点间的黑色连线表示边或弧(连线上画有箭头)。演示过程中用红色覆盖已访问的顶点和边(或弧)。窗口下方显示图的邻接表,演示过程中以红色框边表示已访问过的弧。图示窗口的下方显示遍历后输出的顶点序列。 22. 图的广度优先搜索 与深度优先不同的是,在窗口的下方增加一个队列,其左端为队头,右端为队尾。 23. 求有向图的强连通分量 图示窗口自上而下分别显示有向图的逻辑结构、存储结构和 Finished 数组在算法执行过程中的变化情况。所求得的各个强连通分量,将以不同颜色的顶点组表示。 24. 求关节点和重连通分量 图示窗口的上半部分显示无向图,下半部分自上而下分别显示 Vexnum、Vexdata、Visited、Low、Squlow(求得 low 值的顺序)和 artpoint(关节点)的信息。 25. 有向图的拓扑排序 图示窗口由5部分组成。其中左上显示有向图的邻接表;左下显示有向图,其中顶点和弧的初始状态分别为绿色和黑色,从栈中退出的顶点(i)用红色表示,分别以蓝色和红色指示当前访问的邻接点(k)和它们之间的弧(ik),灰白色表示已经输出的顶点;右下显示顶点的入度;右上显示入度为零的栈。当拓扑排序不成功时,在演示屏的中央将会弹出一个窗口,显示提示信息“网中存在自环!”,此时用户可在左下显示的有向图中由绿色顶点和黑色弧构成的子图中找到这个环。 26. 有向图的关键路径 图示窗口包含5部分信息。左上显示带入度域的邻接表;左下显示有向网的逻辑结构和顶点的入度及各顶点事件的最早发生时间和最迟发生时间;右下显示拓扑排序过程中入度为零的顶点的栈S,右上显示的栈 T 存放拓扑序列,其入栈顺序和栈 S 的出栈顺序相同,从栈顶到栈底的顶点顺序即为顶点的逆拓扑序列。算法执行结束后将弹出窗口列出全部结果,其中红色字体的弧表示关键活动。 27. 普里姆算法 图示窗口包含3部分内容。右上是邻接矩阵;左上是无向网的逻辑结构,图中顶点的初始状态为黄色,算法执行过程中,红色覆盖的顶点和边则表示已加入生成树的顶点和生成树上的边;窗口的下方则显示 closedge 数组中的值。 28. 克鲁斯卡尔算法 图示窗口的左侧为无向网,以红色标定已落在生成树上的边;右侧自上而下列出各条边的信息以及选择生成树的边的执行过程。 29. 边界标识法 图示窗口的初始状态为 64KB 的模拟存储器,演示过程中,以绿色覆盖占用块。各个存储块的头部左侧所示为该块的起始地址,头部结构或其他信息参见教科书。用户可根据弹出窗口的操作提示信息进行操作,输入请求分配的空间大小或释放块的首地址。 30. 伙伴系统 在图示窗口中,左侧为可利用空间链表的逻辑结构,右侧为存储结构,其中红色覆盖部分为占用块。弹出窗口为输入窗口,由用户输入请求分配的空间大小或释放块的首地址。 31. 紧缩无用单元 右侧显示存储空间,空白表示空闲块,其他颜色覆盖表示占用块,在存储空间不足分配时将进行空闲块压缩。左侧显示存储映像。弹出窗口为输入窗口,由用户输入请求分配的空间大小和分配或释放块的块名。 32. 静态查找 上窗口为图示窗口,演示查找过程;左下和右下分别为算法文本和变量窗口。 33. B-树和B+树 整个屏幕分为上、下两个窗口,上窗口演示插入或删除结点过程中B-树或B+ 树结构的变化状况;下窗口内显示如查找关键字、插入位置、结点分裂等操作信息。下窗口上面左侧的小窗口为编辑窗口,由用户输入待插或待删的关键字,输入之后其右侧的操作命令将由隐式状态改为显式状态。 34. 内部排序 图示窗口演示排序过程以及排序过程中关键字之间进行的比较次数和记录移动的次数。 七、 用户自行输入数据指南 算法操作的对象——数据结构,或由用户自行输入,或由系统随机产生,并在获得用户的确认之前,可反复随机产生,直至用户满意,用鼠标点击“OK”按钮确认为止。 多数情况下的输入界面上有足够的提示信息,以指示用户需要进行何种操作。补充说明如下: 1. 表的数据元素为任意的单个字符。 2. 迷宫的输入界面如图3所示。图中砖墙图案表示障碍,连续点击鼠标可将光标所在位置设置成通道或者障碍,建议用户先点击“随机生成”按钮随机生成一个迷宫,然后移动鼠标调整成所需。所设迷宫可以利用“保存数据”按钮生成dat类型文件,并在需要时可以利用“取出数据”按钮读入。 图3 3. 演示背包问题的算法之前,首先需要输入物品个数,之后将出现如图4所示的输入界面,可以利用“随机生成”的按钮或各个相应的小窗口输入物品体积 wi 和背包体积 T 。背包的总体积不得超过 30 ,单个物品的体积不得超过 10 。 图4 4. “表达式求值”和“建表达式树”时的输入界面如图5所示。用户可在窗口内自行输入,并以“Enter”键为结束符;也可以连续点击左侧蓝色的表达式由系统自动生成,直至用户点击右侧的计算器表示确认为止。“求值”可实现带括弧的四则运算和幂次运算,并支持sin、cos、tan、arcsin 和 arccos 等函数计算,其操作数为实数。“建树”的表达式仅限于带括弧的四则运算,其操作数为单个字母的字符。 图5 5. 稀疏矩阵的输入界面如图6所示。用户可随意进行矩阵中任意位置元素的输入,只要将光标移动至待输入的元素位置,单击鼠标后将弹出计算器,单击数字按钮,可进行随意输入,之后点击“OK”按钮表示确认。 图6 6. 广义表的数据输入方式为自左向右顺序输入广义表的字符串。输入过程中,图7所示输入界面中的“确定”为灰色字体,只有当用户正确输入完毕时,“确定”两字才改为黑色字体,此时用户可单击此按钮表示确认。 图7 7. 图的输入界面如图8所示。之前尚需确认是否为有向图和带权图。在用户自行输入图时,首先按下“创建节点”按钮,之后可移动光标至窗口的任意位置单击鼠标创建顶点;然后单击“创建弧”按钮,可在任意两个顶点之间构建弧或边。构建弧(或边)的操作为:先将光标移动至弧尾的顶点,单击一次鼠标,然后移动光标至弧头位置,再单击一次鼠标。对于带权的图,则在构建弧(或边)的同时,在当时弹出的窗口中输入权值,权值的默认值为 1。 图8 8. 内部排序的关键字均为单个字符。
42KB
数据结构-判断题.doc
2020-04-27判断题在每小题前面打对号表示正确或打叉号表示错误 1. 数据的逻辑结构与数据元素本身的内容和形式无关对 2. 使用三元组表示稀疏矩阵中的非零元素能节省存储空间对 3. 在一棵二叉树中假定每个结点只有左子女没有右子女则对它分别进行前序遍历和按层遍历时具有相同的结果对 4. 能够在链接存储的有序表上进行折半搜索其时间复杂度与在顺序存储的有序表上相同错 5. 邻接表表示只能用于有向图的存储邻接矩阵对于有
-
下载
glspec46.core.pdf
glspec46.core.pdf
-
下载
二级C语言部分知识点以及易错题目.docx
二级C语言部分知识点以及易错题目.docx
-
下载
阿里前端开发规范.pdf
阿里前端开发规范.pdf
-
下载
yolov4-pytorch-master.zip
yolov4-pytorch-master.zip
-
下载
智慧公交方案 智慧公交信息化方案.ppt
智慧公交方案 智慧公交信息化方案.ppt
-
下载
智慧小区设计方案.ppt
智慧小区设计方案.ppt
-
下载
clusteringBaseFunction.py
clusteringBaseFunction.py
-
下载
10001003 C#中级教程学习笔记和工程.zip
10001003 C#中级教程学习笔记和工程.zip
-
下载
荔枝发卡_pass.zip
荔枝发卡_pass.zip
-
下载
c++简单饭卡管理系统.rar
c++简单饭卡管理系统.rar
