收藏 分销(赏)

计算机二级公共基础知识全.doc

上传人:天**** 文档编号:9887860 上传时间:2025-04-12 格式:DOC 页数:79 大小:117.54KB
下载 相关 举报
计算机二级公共基础知识全.doc_第1页
第1页 / 共79页
计算机二级公共基础知识全.doc_第2页
第2页 / 共79页
点击查看更多>>
资源描述
1.1 算法 考点1 算法的根本概念   计算机解题的过程实际上是在实施某种算法,这种算法称为计算机算法。   算法(algorithm)是一组严谨地定义运算顺序的规那么,并且每一个规那么都是有效的,同时是明确的;此顺序将在有限的次数后终止。算法是对特定问题求解步骤的一种描述,它是指令的有限序列,其中每一条指令表示一个或多个操作。   1算法的根本特征     (1)可行性(effectiveness):针对实际问题而设计的算法,执行后能够得到满意的结果。     (2)确定性(definiteness):算法中的每一个步骤都必须有明确的定义,不允许有模棱两可的解释与多义性。    (3)有穷性(finiteness):算法必需在有限时间内做完,即算法必需能在执行有限个步骤之后终止。   (4)拥有足够的情报:要使算法有效必需为算法提供足够的情报当算法拥有足够的情报时,此算法才最有效的;而当提供的情报不够时,算法可能无效。   2算法的根本要素   (1)算法中对数据的运算与操作:每个算法实际上是按解题要求从环境能进展的所有操作中选择适宜的操作所组成的一组指令序列。   计算机可以执行的根本操作是以指令的形式描述的。一个计算机系统能执行的所有指令的集合,称为该计算机系统的指令系统。计算机程序就是按解题要求从计算机指令系统中选择适宜的指令所组成的指令序列在一般的计算机系统中,根本的运算与操作有以下4类:    ①算术运算:主要包括加、减、乘、除等运算;    ②逻辑运算:主要包括“及〞、“或〞、“非〞等运算;    ③关系运算:主要包括“大于〞、“小于〞、“等于〞、“不等于〞等运算;   ④数据传输:主要包括赋值、输入、输出等操作。   (2)算法的控制构造:一个算法的功能不仅仅取决于所选用的操作,而且还及各操作之间的执行顺序有关。算法中各操作之间的执行顺序称为算法的控制构造。   算法的控制构造给出了算法的根本框架,它不仅决定了算法中各操作的执行顺序,而且也直接反映了算法的设计是否符合构造化原那么。描述算法的工具通常有传统流程图、N-S构造化流程图、算法描述语言等。一个算法一般都可以用顺序、选择、循环3种根本控制构造组合而成。    (3)算法设计的根本方法   计算机算法不同于人工处理的方法,下面是工程上常用的几种算法设计,在实际应用时,各种方法之间往往存在着一定的联系。    (1)列举法   列举法是计算机算法中的一个根底算法。列举法的根本思想是,根据提出的问题,列举所有可能的情况,并用问题中给定的条件检验哪些是需要的,哪些是不需要的。   列举法的特点是算法比拟简单。但当列举的可能情况较多时,执行列举算法的工作量将会很大。因此,在用列举法设计算法时,使方案优化,尽量减少运算工作量,是应该重点注意的。    (2)归纳法   归纳法的根本思想是,通过列举少量的特殊情况,经过分析,最后找出一般的关系。从本质上讲,归纳就是通过观察一些简单而特殊的情况,最后总结出一般性的结论。    (3)递推    递推是指从的初始条件出发,逐次推出所要求的各中间结果与最后结果。其中初始条件或是问题本身已经给定,或是通过对问题的分析及化简而确定。递推本质上也属于归纳法,工程上许多递推关系式实际上是通过对实际问题的分析及归纳而得到的,因此,递推关系式往往是归纳的结果。对于数值型的递推算法必须要注意数值计算的稳定性问题。    (4)递归   人们在解决一些复杂问题时,为了降低问题的复杂程度(如问题的规模等),一般总是将问题逐层分解,最后归结为一些最简单的问题。这种将问题逐层分解的过程,实际上并没有对问题进展求解,而只是当解决了最后那些最简单的问题后,再沿着原来分解的逆过程逐步进展综合,这就是递归的根本思想。   递归分为直接递归及间接递归两种。    (5)减半递推技术   实际问题的复杂程度往往及问题的规模有着密切的联系。因此,利用分治法解决这类实际问题是有效的。工程上常用的分治法是减半递推技术。   所谓“减半〞,是指将问题的规模减半,而问题的性质不变;所谓“递推〞,是指重复“减半〞的过程。   (6)回溯法   在工程上,有些实际问题很难归纳出一组简单的递推公式或直观的求解步骤,并且也不能进展无限的列举。对于这类问题,一种有效的方法是“试〞。通过对问题的分析,找出一个解决问题的线索,然后沿着这个线索逐步试探,假设试探成功,就得到问题的解,假设试探失败,就逐步回退,换别的路线再逐步试探。   4算法设计的要求   通常一个好的算法应到达如下目标: (l)正确性(correctness)   正确性大体可以分为以下4个层次:    ①程序不含语法错误;    ②程序对于几组输入数据能够得出满足规格说明要求的结果;    ③程序对于精心选择的典型、苛刻而带有刁难性的几组输入数据能够得出满足规格说明要求的结果;   ④程序对于一切合法的输入数据都能产生满足规格说明要求的结果。   (2)可读性(readability)   算法主要是为了方便入的阅读及交流,其次才是其执行。可读性好有助于用户对算法的理解;晦涩难懂的程序易于隐藏较多错误,难以调试与修改。    (3)强健性(robustness)   当输入数据非法时,算法也能适当地做出反响或进展处理,而不会产生莫名其妙的输出结果。   (4)效率及低存储量需求   效率指的是程序执行时,对于同一个问题如果有多个算法可以解决,执行时间短的算法效率高;存储量需求指算法执行过程中所需要的最大存储空间 考点2 算法的复杂度   1算法的时间复杂度   算法的时间复杂度,是指执行算法所需要的计算工作量。同一个算法用不同的语言实现,或者用不同的编译程序进展编译,或者在不同的计算机上运行,效率均不同。这说明使用绝对的时间单位衡量算法的效率是不适宜的。撇开这些及计算机硬件、软件有关的因素,可以认为一个特定算法“运行工作量〞的大小,只依赖于问题的规模(通常用整数n表示),它是问题的规模函数。即    算法的工作量=f(n)   例如,在N×N矩阵相乘的算法中,整个算法的执行时间及该根本操作(乘法)重复执行的次数n3成正比,也就是时间复杂度为n3,即 f(n)=O(n3)   在有的情况下,算法中的根本操作重复执行的次数还随问题的输入数据集不同而不同。例如在起泡排序的算法中,当要排序的数组a初始序列为自小至大有序时,根本操作的执行次数为氏当初始序列为自大至小有序时,根本操作的执行次数为n(n-  1)/2。对这类算法的分析,可以采用以下两种方法来分析。    (1)平均性态(Average Behavior)   所谓平均性态是指各种特定输入下的根本运算次数的加权平均值来度量算法的工作量。   设x是所有可能输入中的某个特定输入,p(x)是x出现的概率(即输入为x的概率),t(x)是算法在输入为x时所执行的根本运算次数,那么算法的平均性态定义为 其中Dn表示当规模为n时,算法执行的所有可能输入的集合。    (2)最坏情况复杂性(Worst-case Complexity)   所谓最坏情况分析,是指在规模为n时,算法所执行的根本运算的最大次数。 2算法的空间复杂度   算法的空间复杂度是指执行这个算法所需要的内存空间。   一个算法所占用的存储空间包括算法程序所占的空间、输入的初始数据所占的存储空间以及算法执行中所需要的额外空间。其中额外空间包括算法程序执行过程中的工作单元以及某种数据构造所需要的附加存储空间。如果额外空间量相对于问题规模来说是常数,那么称该算法是原地(in place)工作的。在许多实际问题中,为了减少算法所占的存储空间,通常采用压缩存储技术,以便尽量减少不必要的额外空间。 考点3 数据构造的定义   数据构造(data structure)是指相互之间存在一种或多种特定关系的数据元素的集合,即数据的组织形式。   数据构造作为计算机的一门学科,主要研究与讨论以下三个方面:    (l)数据集合中个数据元素之间所固有的逻辑关系,即数据的逻辑构造;    (2)在对数据元素进展处理时,各数据元素在计算机中的存储关系,即数据的存储构造;    (3)对各种数据构造进展的运算。   讨论以上问题的日的是为了提高数据处理的效率,所谓提高数据处理的效率有两个方面:   (l)提高数据处理的速度;    (2)尽量节省在数据处理过程中所占用的计算机存储空间。   数据(data):是对客观事物的符号表示,在计算机科学中是指所有能输入到计算机中并被计算机程序处理的符号的总称。   数据元素(data element):是数据的根本单位,在计算机程序中通常作为一个整体进展考虑与处理。   数据对象(data object):是性质一样的数据元素的集合,是数据的一个子集。   在一般情况下,在具有一样特征的数据元素集合中,各个数据元素之间存在有某种关系(即连续),这种关系反映了该集合中的数据元素所固有的一种构造。在数据处理领域中,通常把数据元素之间这种固有的关系简单地用前后件关系(或直接前驱及直接后继关系)来描述。   前后件关系是数据元素之间的一个根本关系,但前后件关系所表示的实际意义随具体对象的不同而不同。一般来说,数据元素之间的任何关系都可以用前后件关系来描述。   1数据的逻辑构造   数据构造是指反映数据元素之间的关系的数据元素集合的表示。更通俗地说,数据构造是指带有构造的数据元素的集合。所谓构造实际上就是指数据元素之间的前后件关系。   一个数据构造应包含以下两方面信息:    (1)表示数据元素的信息;    (2)表示各数据元素之间的前后件关系。 数据的逻辑结果是对数据元素之间的逻辑关系的描述。它可以用一嘎数据元素的集合与定义在此集合中的假设干关系来表示。 数据的逻辑构造包括集合、线性构造、树型构造与图形构造四种。 线性构造:数据元素之间构成一种顺序的线性关系。 树型构造:数据元素之间形成一种树型的关系 数据的逻辑构造有两个要素:一是数据元素的集合,通常记为D; 二是D上的关系,它反映了数据元素之间的前后件关系,通常记为R。一个数据构造可以表示成B=〔C,R〕 其中B表示数据构造。为了反映D中各元素之间的前后件关系,一般用二元组来表示。 例如,复数是一种数据构造,在计算机科学中,复数可取如下定义: B=〔C,R〕 其中,C是含有两个实数的集合{c1,c2};R是定义在集合C上的一种关系{<c1,c2>},其中有序偶{<c1,c2>}表示c1是复数的实部,c2是复数的虚部。 2数据的存储构造 数据的逻辑构造在计算机存储空间中的存放形式,称为数据的存储构造〔也称为数据的物理构造〕。 由于数据元素在计算机存储空间中的位置关系可能及逻辑关系不同,因此,为了表示存放在计算机存储空间中的各数据元素之间的逻辑关系〔即前后件关系〕,在数据的存储构造中,不仅要存放各数据元素的信息,还需要存放各数据元素之间的前后件关系的信息。 一种数据的逻辑构造根据需要可以表示成多种存储构造,常用的构造有顺序、链接、索引等存储构造而采用不同的存储构造,其数据处理的效率是不同的。因此,在进展数据处理是,选择适宜的存储构造是很重要的。 考点4 数据构造的图形表示   数据构造除了用二元关系表示外,还可以直观地用图形表示。   在数据构造的图形表示中,对于数据集合D中的每一个数据元素用中间标有元素值的方框表示,一般称之为数据结点,并简称为结点;为了进一步表示各数据元素之间的前后件关系,对于关系R中的每一个二元组,用一条有向线段从前件结点指向后件结点。     在数据构造中,没有前件的结点称为根结点;没有后件的结点称为终端结点(也称为叶子结点)。   一个数据构造中的结点可能是在动态变化的。根据需要或在处理过程中,可以在一个数据构造中增加一个新结点(称为插入运算),也可以删除数据构造中的某个结点(称为删除运算)。插入及删除是对数据构造的两种根本运算。除此之外,对数据构造的运算还有查找、分类、合并、分解、复制与修改等。 考点5 线性构造及非线性构造   如果在一个数据构造中一个数据元素都没有,那么称该数据构造为空的数据构造。   根据数据构造中各数据元素之间前后件关系的复杂程度,一般将数据构造分为两大类型:线性构造及非线性构造。   非空数据构造满足:   (l)有且只有一个根结点;   (2)每一个结点最多有一个前件,也最多有一个后件。   那么称该数据构造为线性构造。线性构造又称为线性表。一个线性表是n个数据元 素的有限序列。至于每个元素的具体含义,在不同的情况下各不一样,它可以是一个数或一个符号,也可以是一页书,甚至其他更复杂的信息。如果一个数据构造不是线性构造,称之为非线性构造。线性构造及非线性构造都可以是空的数据构造。对于空的数据构造,如果对该数据构造的运算是按线性构造的规那么来处理的,那么属于线性构造;否那么属于非线性构造。 1.3 线性表及顺序存储构造 考点6 线性表的定义   线性表是n(n≥0)个元素构成的有限序列(a1,a2,…,an)。表中的每一个数据元素,除了第一个外,有且只有一个前件,除了最后一个外,有且只有一个后件。即线性表是一个空表,或可以表示为 (a1,a2,…,an)   其中ai(i=1,2,…,n)是属于数据对象的元素,通常也称其为线性表中的一个结点。   其中,每个元素可以简单到是一个字母或是一个数据,也可能是比拟复杂的由多个数据项组成的。在复杂的线性表中,由假设干数据项组成的数据元素称为记录(record),而由多个记录构成的线性表又称为文件(file)。在非空表中的每个数据元素都有一个确定的位置,如a1是第一个元素,an是最后一个数据元素,ai是第i个数据元素,称i为数据元素ai在线性表中的位序。非空线性表有如下一些构造特征: (1)有且只有一个根结点a1,它无前件; (2)有且只有一个终端结点an,它无后件; (3)除根结点及终端结点外,其他所有结点有且只有一个前件,也有且只有一个后件。线性表中结点的个数n称为线性表的长度。当n=0时称为空表。 考点7 线性表的顺序存储构造   线性表的顺序表指的是用一组地址连续的存储单元依次存储线性表的数据元素。   线性表的顺序存储构造具备如下两个根本特征:  (l)线性表中的所有元素所占的存储空间是连续的; (2)线性表中各数据元素在存储空间中是按逻辑顺序依次存放的。   假设线性表的每个元素需要占用k个存储单元,并以所占的存储位置ADR(ai+1)与第i个数据元素的存储位置ADR(ai)之间满足以下关系:   ADR(ai+1)=ADR(ai)+k   线性表第i个元素ai的存储位置为   ADR(ai)=ADR(a1)+(i-1)×k   式中ADR(ai)是线性表的第一个数据元素a,的存储位置,通常称做线性表的起始位置或基址。   线性表的这种表示称做线性表的顺序存储构造或顺序映像,这种存储构造的线性表为顺序表。表中每一个元素的存储位置都与线性表的起始位置相差一个与数据元素在线性表中的位序成正比例的常数。如图1-4所示。由此只要确定了存储线性表的起始位置,线性表中任一数据元素都可以随机存取,所以线性表的顺序存储构造是一种随机存取的存储构造。 在程序设计语言中,通常定义一个一维数组来表示线性表的顺序存储空间。在用一维数组存放线性表时,该一维数组的长度通常要定义得比线性表的实际长度大一些,以便对线性表进展各种运算,特别是插入运算。在线性表的顺序存储构造下,可以对线性表做以下运算: (l)在线性表的指定位置处参加一个新的元素(即线性表的插入); (2)在线性表中删除指定的元素(即线性表的删除); (3)在线性表中查找某个(或某些)特定的元素(即线性表的查找); (4)对线性表中的元素进展整序(即线性表的排序); (5)按要求将一个线性表分解成多个线性表(即线性表的分解); (6)按要求将多个线性表合并成一个线性表(即线性表的合并); (7)复制一个线性表(即线性表的复制); (8)逆转一个线性表(即线性表的逆转)等。 考点8 顺序表的插入运算   线性表的插入运算是指在表的第i(1≤i≤n+l)个位置上,插入一个新结点x,使长度为n的线性表   (a1,…,ai-1,ai,…,an)   变成长度为n+1的线性表 (a1,…,ai-1,x,ai,…,an)   现在分析算法的复杂度。这里的问题规模是表的长度,设它的值为n。该算法的时间主要花费在循环结点后移语句上,该语句的执行次数(即移动结点的次数)是n-i+1。由此可看出,所需移动结点的次数不仅依赖于表的长度,而且还及插入位置有关。   当i=n+1时,由于循环变量的终值大于初值,结点后移语句将不进展;这是最好情况,其时间复杂度O(1);   当i=1时,结点后移语句,将循环执行n次,需移动表中所有结点,这是最坏情况,其时间复杂度为O(n)。   由于插入可能在表中任何位置上进展,因此需分析算法的平均复杂度。 在长度为n的线性表中第i个位置上插入一个结点,令Eis ( n )表示移动结点的期望值(即移动的平均次数),那么在第i个位置上插入一个结点的移动次数为n-i+1。故 不失一般性,假设在表中任何位置(1≤i≤n+1)上插入结点的时机是均等的,那么 p1=p2=p3=…=pn+1=1/(n+1) 因此,在等概率插入的情况下, 也就是说,在顺序表上做插入运算,平均要移动表上一半的结点。当表长n较大时,算法的效率相当低。虽然Eis ( n )中n的的系数较小,但就数量级而言,它仍然是线性级的。因此算法的平均时间复杂度为O(n)。 考点9 顺序表的删除运算   线性表的删除运算是指将表的第i(1≤i≤n)个结点删除,使长度为n的线性表:   (a1,…,ai-1,ai,ai+1,…,an)   变成长度为n-l的线性表   (a1,…,ai-1,ai+1,…,an)   该算法的时间分析及插入算法相似,结点的移动次数也是由表长n与位置i决定。假设i=n,那么由于循环变量的初值大于终值,前移语句将不执行,无需移动结点;假设i=1,那么前移语句将循环执行n一1次,需移动表中除开场结点外的所有结点。这两种情况下算法的时间复杂度分别为O(1)与O(n)。   删除算法的平均性能分析及插入算法相似。在长度为n的线性表中删除一个结点,令Ede(n)表示所需移动结点的平均次数,删除表中第i个结点的移动次数为n-i,故   式子中,pi表示删除表中第i个结点的概率。在等概率的假设下, p1=p2=p3=…=pn=1/n 由此可得:   即在顺序表上做删除运算,平均要移动表中约一半的结点,平均时间复杂度也是O(n)。 1.4 栈与队列 考点10 栈及其根本运算   1什么是栈   栈实际也是线性表,只不过是一种特殊的线性表。栈(Stack)是只能在表的一端进展插入与删除运算配线性表,通常称插入、删除的这一端为栈顶(Top),另一端为栈底(Bottom)。当表中没有元素时称为空栈(栈顶元素总是后被插入的元素,从而也是最先被删除的元素;栈底元素总是最先被插入的元素,从而也是最后才能被删除的元素。   假设栈S=(al,a2,a3,…,an),那么a1,称为栈底元素,an为栈顶元素。栈中元素按a1,a2,a3,…,an的次序进栈,退栈的第一个元素应为栈顶元素。换句话说,栈的修改是按后进先出的原那么进展的。因此,栈称为先进后出表(FILO,First In Last Out),或“后进先出〞表(LIFO,Last In First Out),如图1-7所示。   2栈的顺序存储及其运算    (l)入栈运算:入栈运算是指在栈顶位置插入一个新元素。首先将栈顶指针加一(即top加1),然后将元素插入到栈顶指针指向的位置。当栈顶指针已经指向存储空间的最后一个位置时,说明栈空间已满,不可能再进展入栈操作。这种情况称为栈“上溢〞错误。如图1-8所示。    (2)退栈运算:退栈是指取出栈顶元素并赋给一个指定的变量。首先将栈顶元素(栈顶指针指向的元素)赋给一个指定的变量,然后将栈顶指针减一(即t叩减1)。当栈顶指针为。时,说明栈空,不可进展退栈操作。这种情况称为栈的“下溢〞错误。    (3)读栈顶元素:读栈顶元素是指将栈顶元素赋给一个指定的变量。这个运算不删除栈顶元素,只是将它赋给一个变量,因此栈顶指针不会改变。当栈顶指针为0时,说明栈空,读不到栈顶元素。 考点11 队列及其根本运算   1什么是队列    队列(queue)是只允许在一端删除,在另一端插入的顺序表,允许删除的一端叫做队头(front),允许插入的一端叫做队尾(rear),   当队列中没有元素时称为空队列。在空队列中依次参加元素a1,a2,…,an之后,a1是队头元素,an是队尾元素。显然退出队列的次序也只能是a1,a2,…,an也就是说队列的修改是依先进先出的原那么进展的。因此队列亦称作先进先出(FIFO,First In First Out)的线性表,或后进后出(LILO,Last In Last Out)的线性表。往队列队尾插入一个元素称为入队运算,从队列的排头删除一个元素称为退队运算,如图1-10所示。   一个队列币。删除个儿素后的队列间插入元素E后的队列   2循环队列及其运算   在实际应用中,队列的顺序存储构造一般采用循环队列的形式。所谓循环队列,就是将队列存储空间的最后一个位置绕到第一个位置,形成逻辑上的环状空间   在循环队列中,用队尾指针rear指向队列中的队尾元素,用排头指针front指向排头元素的前一个位置。因此,从排头指针front指向的后一个位置直到队尾指针rear指向的位置之间所有的元素均为队列中的元素。   可以将向量空间想象为一个首尾相接的圆环,如图1-12所示,并称这种向量为循环向量,存储在其中的队列称为循环队列( Cireular Queue)。在循环队列中进展出队、入队操作时,头尾指针仍要加1,朝前移动。只不过当头尾指针指向向量上界(Queuesize-l)时,其加1操作的结果是指向向量的下界0。   由于入队时尾指针向前追赶头指针,出队时头指针向前追赶尾指针,故队空与队满时头尾指针均相等。因此,我们无法通过front=rear来判断队列“空〞还是“满〞。   在实际使用循环队列时,为了能区分队列满还是队列空,通常还需增加一个标志、,、值的定义如下:当s=0时表示队列空;当s=1时表示队列非空。    (l)入队运算   入队运算是指在循环队列的队尾参加一个新元素。首先将队尾指针进一(即rear=rear+1),并当rear=m+l时置rear=1;然后将新元素插入到队尾指针指向的位置。当循环队列非空(s=l)且队尾指针等于队头指针时,说明循环队列已满,不能进展入队运算,这种情况称为“上溢〞。 (2)退队运算   退队运算是指在循环队列的队头位置退出一个元素并赋给指定的变量。首先将队头指针一进一(即from=front +1),并当front = m+1时,置front=1然后将排头指针指向的元素赋给指定的变量。当循环队列为空(s =0)时,不能进展退队运算,这种情况称为“下溢〞。转贴于:计算机二级考试_考试大【责编:daiy 纠错】 1.5 线性链表 考点12 线性单链表的构造及其根本运算    1什么是线性链表    (l)线性表顺序存储的缺点    ①在一般情况下,要在顺序存储的线性表中插入一个新元素或删除一个元素时,为了保证插入或删除后的线性表仍然为顺序存储,那么在插入或删除过程中需要移动大量的数据元素。因此采用顺序存储构造进展插入或删除的运算效率很低;    ②当为一个线性表分配顺序存储空间后,如果出现线性表的存储空间已满,但还需要插入新的元素时栈会发生“上溢〞错误;    ③计算机空间得不到充分利用,并且不便于对存储空间的动态分配。   (2)线性表链式的根本概念   在定义的链表中,假设只含有一个指针域来存放下一个元素地址,称这样的链表为单链表或线性链表。   在链式存储方式中,要求每个结点由两局部组成:一局部用于存放数据元素值,称为数据域;另一局部用于存放指针,称为指针域。其中指针用于指向该结点的前一个或后一个结点(即前件或后件)。如图1-13所示。   2线性单链表的存储构造   用一组任意的存储单元来依次存放线性表的结点,这组存储单元既可以是连续的,也可以是不连续的,甚至是零散分布在内存中的任意位置上的。因此,链表中结点的逻辑次序与物理次序不一定一样。为了能正确表示结点间的逻辑关系,在存储每个结点值的同时,还必须存储指示其后件结点的地址(或位置)信息,这个信息称为指针(pointer)或链(link)。这两局部组成了链表中的结点构造,   链表正是通过每个结点的链域将线性表的n个结点按其逻辑次序链接在一起。由于上述链表的每一个结点只有一个链域,故将这种链表称为单链表(Single Linked)。   显然,单链表中每个结点的存储地址是存放在其前驱结点Next域中,而开场结点无前驱,故应设头指针HEAD指向开场结点。同时,由于终端结点无后件,故终端结点的指针域为空,即NULL。   3带链的栈及队列   (1)栈也是线性表,也可以采用链式存储构造。在实际应用中,带链的栈可以用来收集计算机存储空间中所有空闲的存储结点,这种带链的栈称为可利用栈 (2)队列也是线性表,也可以采用链式存储构造, 考点13 线性链表的根本运算   线性链表的运算主要有以下几个:   (l)在线性链表中包含指定元素的结点之前插入一个新元素;   (2)在线性链表中删除包含指定元素的结点;   (3)将两个线性链表按要求合并成一个线性表;    (4)将一个线性链表按要求进展分解;    (5)逆转线性链表;    (6)复制线性链表;    (7)线性链表的排序;    (8)线性链表的查找。   1在线性镬表中查找指定元素   在对线性链表进展插入或删除的运算中,总是首先需要找到插入或删除的位置,这就需要对线性链表进展扫描查找,在线性链表中寻找包含指定元素的前一个结点。   在线性链表中,即使知道被访问结点的序号a,也不能像顺序表中那样直接按序号i访问结点,而只能从链表的头指针出发,顺链域Next逐个结点往下搜索,直到搜索到第i个结点为止。因此,链表不是随机存取构造。   在链表中,查找是否有结点值等于给定值x的结点,假设有的话,那么返回首次找到的其值为x的结点的存储位置;否那么返回NULL。查找过程从开场结点出发,顺着链表逐个将结点的值与给定值x作比拟。   2线性链表的插入   线性链表的插入是指在链式存储构造下的线性链表中插入一个新元素。   插入运算是将值为X的新结点插入到表的第i个结点的位置上,即插入到ai-1,及ai之间。因此,我们必须首先找到ai-1的存储位置p,然后生成一个数据域为x的新结点*p,并令结点,p的指针域指向新结点,新结点的指针域指向结点ai   由线性链表的插入过程可以看出,由于插入的新结点取自于可利用栈,因此,只要可利用栈不空,在线性链表插入时总能取到存储插入元素的新结点,不会发生“上溢〞的情况。而且,由于可利用栈是公用的,多个线性链表可以共享它,从而很方便地实现了存储空间的动态分配。另外,线性链表在插入过程中不发生数据元素移动的现象,只要改变有关结点的指针即可,从而提高了插入的效率。   3多线性链表的删除   线性链表的删除是指在链式存储构造下的线性链表中删除包含指定元素的结点。   删除运算是将表的第i个结点删去。因为在单链表中结点a的存储地址是在其直接前趋结点ai-1,的指针域Next中,所以我们必须首先找到ai-1的存储位置p。然后令p->Next指向ai的直接后件结点,即把ai从链上摘下。最后释放结点a的空间。   从线性链表的删除过程可以看出,从线性链表中删除一个元素后,不需要移动表中的数据元素,只要改变被删除元素所在结点的前一个结点的指针域即可。另外,由于可利用栈是用于收集计算机中所有的空闲结点,因此,当从线性链表中删除一个元素后,该元素的存储结点就变为空闲,应将空闲结点送回到可利用栈。 考点14 线性双向链表的构造及其根本运算   1什么是双向链表   在单链表中,从某个结点出发可以直接找到它的直接后件,时间复杂度为O(1),但无法直接找到它的互接前件;在单循环链表中,从某个结点出发可以直接找到它的直接后件,时间复杂度仍为O(1),直接找到它的直接前件,时间复杂度为O(n)。有时,希望能快速找到一个结点的直接前件,这时,可以在单链表中的结点中增加一个指针域指向它的直接前件,这样的链表,就称为双向链表(一个结点中含有两个指针)。如果每条链构成一个循环链表,那么会得到双向循环链表   2双向链表的根本运算   (l)插入:在HEAD为头指针的双向链表中,在值为Y的结点之后插入值为X的结点,插入结点的指针变化。如图1-20所示(假设改为在值为Y的结点之前插入值为X的结点,可以做类似分析)。 (2)删除:在以HEAD为头指针的双向链表中删除值为X的结点,删除算法的指针变化,如图1-21所示。 考点15 循环链表的构造及其根本运算   单链表上的访问是一种顺序访问,从其中的某一个结点出发,可以找到它的直接后件,但无法找到它的直接前件。   在前面所讨论的线性链表中,其插入及删除的运算虽然比拟方便,但还存在一个问题,在运算过程中对于空表与对第一个结点的处理必须单独考虑,使空表及非空表的运算不统一。   因此,我们可以考虑建立这样的链表,具有单链表的特征,但又不需要增加额外的存贮空间,仅对表的链接方式稍做改变,使得对表的处理更加方便灵活。从单链表可知,最后一个结点的指针域为NULL,表示单链表已经完毕。如果将单链表最后一个结点的指针域改为存放链表中头结点(或第一个结点)的地址,就使得整个链表构成一个环,又没有增加额外的存储空间 循环链表具有以下两个特点:   (1)在循环链表中增加了一个表头结点,其数据域为任意或者根据需要来设置,指针域指向线性表的第一个元素的结点。循环链表的头指针指向表头结点;   (2)循环链表中最后一个结点的指针域不是空,而是指向表头结点。即在循环链表中,所有结点的指针构成了一个环状链。   在循环链表中,只要指出表中任何一个结点的位置,就可以从它出发访问到表中其他所有的结点,而线性单链表做不到这一点。   由于在循环链表中设置了一个表头结点,因此,在任何情况下,循环链表中至少有一个结点存在,从而使空表的运算统一。 1.6 树及二叉树 考点16 树的定义   树是由n( n≥0)个结点组成的有限集合。假设n =0,称为空树;假设n>0,那么:    (1)有一个特定的称为根(root)的结点。它只有直接后件,但没有直接前件;    (2)除根结点以外的其他结点可以划分为m(m≥0)个互不相交的有限集合T0,T1,…,Tm-1,每个集合Ti(i=0,1,…,m-l)又是一棵树,称为根的子树,每棵子树的根结点有且仅有一个直接前件,但可以有0个或多个直接后件。   树型构造具有如下特点:    (1)助每个结点只有一个前件,称为父结点,没有前件的结点只有一个,称为树的根结点,简称为树的根;    (2)每一个结点可以有多个后件,它们都称为该结点的子结点。没有后件的结点称为叶子结点;    (3)一个结点所拥有的后件个数称为树的结点度;    (4)树的最大层次称为树的深度。   在计算机中,可以用树构造来表示算术表达式,用树来表示算术表达式的原那么是:    (1)表达式中的每一个运算符在树中对应一个结点,称为运算符结点;    (2)运算符的每一个运算对象在树中为该运算符结点的子树(在树中的顺序为从左到右);    (3)运算对象中的单变量均为叶子结点。   树在计算机中通常用多重链表表示。 考点17 二叉树的定义及其根本性质   1什么是二叉树   二叉树(binary tree)是由n(≥0)个结点的有限集合构成,此集合或者为空集,或者由一个根结点及两棵互不相交的左右子树组成,并且左右子树都是二叉树。二叉树可以是空集合,根可以有空的左子树或空的右子树。二叉树不是树的特殊情况,它们是两个概念。   二叉树具有如下两个特点:    (1)非空二叉树只有一个根结点;    (2)每一个结点最多有两棵子树,且分别称为该结点的左子树及右子树。   二叉树的每个结点最多有两个孩子,或者说,在二叉树中,不存在度大于2的结点,并且二叉树是有序树(树为无序树),其子树的顺序不能颠倒,因此,二叉树有5种不同的形态   在二叉树中,一个结点可以只有左子树而没有右子树,也可以只有右子树而没有左子树。当一个结点既没有左子树也没有右子树时,该结点即是叶子结点)   2二叉树的根本性质   性质1:在二叉树的第入层上至多有2k-1个结点(k≥1)。   性质2:深度为m的二叉树至多有2m-1个结点。   深度为m的二叉树的最大的结点数是为二叉树中每层上的最大结点数之与,由性质1得到最大结点数。   性质3:对任何一棵二叉树,度为0的结点(即叶子结点)总是比度为2的结点多一个。   如果叶子结点n0,度为2的结点数为n2,那么n0=n2+l。   设二叉树中度为1的结点数为n1,二叉树中总结点数为N,因为二叉树中
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传
相似文档                                   自信AI助手自信AI助手

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服