数据结构对象的基本概念cngn.docx
《数据结构对象的基本概念cngn.docx》由会员分享,可在线阅读,更多相关《数据结构对象的基本概念cngn.docx(32页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、目录目录1第一章 绪论3一、内容提要3二、学习重点3三、例题解析3第二章 线性表5一 、内容提要5二 、学习重点5三、例题解析5第三章 栈和队列8一、内容提要8二、学习重点8三、例题解析8第四章 串12一、内容提要12二、学习重点12三、例题解析12第五章 数组和广义表14一、 内容提要14二、学习重点14三、例题解析14第六章 树和二叉树16一 、内容提要16二、学习重点16三、例题及分析16第七章 图19一、内容提要19二、学习重点19三、例题解析20第八章 动态存储管理22一、内容提要22二、学习重点22三、例题解析22第九章 查找24一、内容提要24二、学习重点24三、例题解析25第十
2、章 内部排序27一、内容提要27二、学习要点27二、例题解析27第十一章 外部排序30一、内容提要30二、学习要点30三、习题解析30第十二章 文件32一、内容提要32二、学习重点32第一章 绪论一、内容提要1 数据结构研究的内容。2 基本概念:数据、数据元素、数据对象、数据结构、数据类型、抽象数据类型、多形数据类型。3 算法的定义及五个特征。4 算法描述:类PASCAL语言。5 算法设计要求。6 算法分析。二、学习重点1 数据结构的“三要素”:逻辑结构、物理(存储)结构及在这种结构上所定义的操作(运算) 。2 抽象数据类型的定义、表示和实现方法。3 类PASCAL书写规范,过程(函数)中值参
3、和变参的差别,过程调用规则。4 用计算语句频度来估算算法的时间复杂度。三、例题解析1 写出以下各语句执行次数(左边括号内数字为语句序号)(1) FOR i:=1 TO n DO(2) FOR j:=1 to n DO(3) cI,j := 0;(4) FOR k:=1 TO n DO(5) cI,j:=cI,j+aI,k*bk,j 答案:各语句执行次数(频度)分别为n+1,n(n+1), n2 , n2(n+1), n3 分析:最容易发生的错误,是将第一个语句的执行次数答成n。2 编写最优算法,从小到大依次输出顺序读入的三个整数PROC asscending;本算法对读入的三个整数进行排序,然
4、后按从小到大输出算法中核心语句如下 read(a,b,c); IF ab THEN t:=a; a:=b; b:=t; a,b按正序排序 IF bc THEN t:=c; c:=b; c为最大 IF at THEN b:=t b为中间值 ELSE b:=a; a:=t a,b正序 WRITELN(a:4,b:4,c:4); ENDP; assending分析:本题正确算法有多种,但上面是最优算法:最好情况下只经过两次比较且无数据移动,而在最坏情况下,也只是经过三次比较,七个赋值语句就完成了排序。在本课程教学中,强调“好”的算法, 不仅仅是结果正确, 而且是最优的算法。这与PASCAL语言教学中
5、的要求有很大不同。 算法是供人来阅读的,必须牢记这一点。算法中语句的书写格式采用缩进规则,保留字用大写,其余标识符小写,提高了算法的易读性。第二章 线性表一 、内容提要1线性表是元素间约束力最强的一类数据结构。 2线性表的逻辑结构定义,对线性表定义的操作。3线性表的存储结构:顺序存储结构和链式存储结构。4线性表的操作在两种存储结构中的实现。5一元多项式的线性表表示方法,及高次(稀疏)多项式的抽象数据类型定义、表示和加法的实现。二 、学习重点1 1 线性表的逻辑结构,指线性表的数据元素间存在着线性关系。在顺序存储结构中,元素存储的先后位置反映出这种线性关系,而在链式存储结构中,是靠指针来反映这种
6、关系的。2 2 顺序存储结构用向量(一维数组)表示,给定下标,可以存取相应元素,属于随机存取的存储结构。3 3 尽管“只要知道某结点的指针就可以存取该元素”,但因链表的存取都需要从头指针开始,顺链而行,故链表不属于随机存取结构。4 4 链表是本章学习的重点和难点。要理解头结点,首元结点和元素结点的差别。理解头结点是为了在插入、删除等操作时,为了算法的统一而设立的(若无头结点,则在第一元素前插入元素或删除第一元素时,链表的头指针总在变化)。掌握通过画出结点图来进行链表的生成、插入、删除、遍历等操作。5 5 链表操作中应注意不要使链意外“断开”。因此,若在某结点前插入一个元素,或删除某元素,必须知
7、道该元素的前驱结点的指针。6 6 从时间和空间复杂度的角度综合比较线性表在顺序和链式两种存储结构下的特点。7 7 静态链表是又一重点和难点。应和链表进行比较、理解。例如,在有头结点的链表情况下,第一元素是p:=la.next,而在静态链表中则i:=sa0.next;相对p:=p.next,有i:=sai.next来找到第i个元素的后继。三、例题解析设线性表以顺序存储结构存于a(1.n)中,试编写算法将该线性表就地逆置。【分析】向量逆置有几种方法,如逆向读入到另一数组中,在正向对应赋值,即:FOR i:=n DOWNTO 1 DO bn-i+1:=ai; FOR i:=1TO n DO ai:=
8、bi;这里要求“就地逆置”,即不能另用一数组空间。【算法】PROC invert(VAR a:arr; n:integer); a是存储线性表的一维数组,有n 个元素,本算法将a逆置。FOR i:=1TO (n DIV 2) DO aian-i+1;endp;【讨论】将n个元素的一维数组逆置,为什么循环控制变量用n div 2,而不用n?编写在单链表上进行排序的算法【分析】这里使用插入排序。链表中插入元素要知道待插入元素位置的前驱,以pre表示之。结束的条件是链表为空。 【算法】PROC insertsort(VAR la:linklist); la是带头结点的单链表的指针,本算法将链表中元素
9、正序排序。算法的基本思想是先假定第一个元素有序,然后从第二个元素开始,依次插入到有序的表中,直到全部元素插入完为止p:= la.next.next;假定链表非空,即至少有一个结点la.next.next:=nil;设有序链表中当前只有一个结点 found:=false;WHILE (pnil)AND NOT found DO s:=p.next;记住下一个结点pre:=la; q:=la.next; found:=false; WHILE(qnil)AND NOT found DO IF q.datap.data THEN pre:=q; q:=q.next ELSE found:=true;
10、p.next:=q;pre.next:=p;p结点插入p:=s;取下一个结点ENDP; insertsort【讨论】算法中found为一布尔变量,为的是在链表到尾前,如找到p的插 入位置,即可退出WHILE循环。这里循环条件未写成: (pnil)AND (q.data0,n0),分别存于一维数组a和b中,且a 的存储空间足够大。试编写算法将两线性表合并成一线性表,结果仍是非递减有序,要求算法的时间复杂度是o(m+n)。 【分析】 两个有序线性表合并成一个有序表,教材中已有讨论,算法非常简单。本算法要求复杂度为O(m+n),这是着重点。题目叙述中有“a的空间足够大”,暗示出若将m+n个元素合并到
11、a中,不会溢出。为使数据移动次数最少,应先将两表中最大元素置于m+n的位置上,然后相应指针减1,再比较之,直到两表中有一个指针减到0,则结束,否则,将b中剩余元素传到a中相应位置即可。 【算法】 PROC union(VAR a:seqlisttp;b:seqlisttp); a,b是两个非递减有序表,顺序存储结构存储,各有m和n个元素,本算法将两表合并到a中,仍为有序表,算法时间复杂度为O(m+n) i:=m; j:=n ;k:=m+n; i,j,k分别为表a,b和结果表的指针 WHILE (i0) AND (j0) DO IF aibj THEN ak:=ai; i:=i-1; k:=k-
12、1 ELSE ak:=bj; j:=j-1; k:=k-1; WHILE (j0) DO ak:=bj; j:=j-1; k:=k-1; 若b表中尚有元素,则传至a中相应位置【讨论】 本算法至多比较m+n次,往a中赋值m+n次。最好情况是比较n次,往a中赋值n次,该种情况是b中最小元素不小于a中最大元素。问题:为什么在退出第一个WHILE循环后,不讨论(即没有)WHILE i0的情况? 第三章 栈和队列 一、内容提要1 1从数据结构角度讲,栈和队列也是线性表,其操作是线性表操作的子集,属操作受限的线性表。但从数据类型的角度看,它们是和线性表大不相同的重要抽象数据类型。2 2栈的定义及操作。栈是
13、只准在一端进行插入和删除操作的线性表,该端称为栈的顶端。3 3栈的顺序和链式存储结构,及在这两种结构下实现栈的操作。4 4栈的应用:表达式求值,递归过程及消除递归。5 5队列的定义及操作,队列的删除在一端(尾),而插入则在队列的另一端(头)。因此在两种存储结构中,都需要队头和队尾两个指针。6 6链队列空的条件是首尾指针相等,而循环队列满的条件的判定,则有队尾加1等于队头和设标记两种方法。 二、学习重点 1栈和队列操作在两种存储结构下的实现。 2中缀表达式转成前缀、后缀表达式并求值。3用递归解决的问题:定义是递归的,数据结构是递归的,及问题的解法是递归的, 掌握典型问题的算法。 4 4 链队列删
14、除时为空的处理(令队尾指针指向队头)。特别是仅设尾指针的循环链队 列的各种操作的实现。5 5 循环队列队空定义为队头指针等于队尾指针,队满则可用一个单元(教材中所示) 及设标记办法(下面例题)。这里特别注意取模运算。 6 6 在后续章节中要注意栈和队列的应用,如串中心对称的判定,二叉树遍历的递归 和非递归算法,图的深度优先遍历等都用到栈,而树的层次遍历、图的宽度优先遍 历等则用到队列。三、例题解析1 1两栈共享一向量空间,编写入栈和出栈算法。 TYPE TwoWayStack=RECORD 双栈共享一向量空间 elem:ARRAY1.m OF elemtype; top:ARRAY0.1 OF
15、 0.m+1; 两个栈顶指针 END; PROC inistack(VAR tws:TwoWayStack); 初始化 初始化双向栈tws为空 tws.top0:=0; 左端栈指针 tws.top1:=m+1; 右端栈指针ENDP; inistack PROC PUSH(VAR tws:TwoWayStack;i:0.1; x:elemtype;VAR ofw:boolean); 若双向栈tws不满,则将x插入到i端,成功时ofw为true,失败为false IF(tws.top1-tws.top0)1 THEN 栈未满 CASE i OF 0:tws.top0:=tws.top0+1;tws
16、.elemtws.top0:=x;ofw:=true 1:tws.top1:=tws.top1-1;tws.elemtws.top1:=x;ofw:=true ENDC ELSE ofw:=false;( 栈满) ENDP; pushPROC POP(VAR tws:TwoWayStack;i:0.1;VAR x:elemtype;VAR underflow:boolean); 若双向栈tws非空,则将i端退栈,栈空时underflow为true CASE i OF 0:IF tws.top0=0 栈空 THENunderflow:=true;return(underflow) ELSE tw
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 对象 基本概念 cngn
限制150内