数据结构复习要点.doc
《数据结构复习要点.doc》由会员分享,可在线阅读,更多相关《数据结构复习要点.doc(13页珍藏版)》请在课桌文档上搜索。
1、-A熟练掌握 B理解 C了解第一章:绪论1. 根本概念:包括数据的逻辑构造、数据的存储构造和数据的相关运算。C四类数据组织构造:集合、线性表、树形、图状构造 C数据的存储方式:顺序存储和链式存储。B2.算法和分析算法的特征、时间复杂度的分析和常见的时间复杂度增长率排序、空间复杂度B本章重点:分析算法时间复杂度例1. 下面关于算法说法错误的选项是 A算法最终必须由计算机程序实现B.为解决*问题的算法同为该问题编写的程序含义是一样的C. 算法的可行性是指指令不能有二义性 D. 以上几个都是错误的D例2.以下那一个术语与数据的存储构造无关? A栈 B. 哈希表 C. 线索树 D. 双向链表A例3.求
2、下段程序的时间复杂度:void mergesort(int i, int j)int m;if(i!=j)m=(i+j)/2;mergesort(i,m);mergesort(m+1,j);merge(i,j,m);其中mergesort()用于对数组an归并排序,调用方式为mergesort(0,n-1);,merge()用于两个有序子序列的合并,是非递归函数,时间复杂度为。解:分析得到的时间复杂度的递归关系:为merge所需的时间,设为c为常量。因此令 ,有有第二章:线性表1.线性表的根本运算:. C2.线性表的顺序存储利用静态数组或动态存分配。相应的表示与操作 A3.线性表的链式存储。相
3、应的表示与操作。包括循环链表、双向链表。 A4.顺序存储与链式存储的比拟:基于时间的考虑-分别适用于静态的和动态的操作:比方静态查找和插入删除;基于空间的考虑-. B这也适用于后面用两种方式存储的其他数据构造。*本章重点:很熟悉顺序表,单链表、双链表,循环链表的根本操作;并学会在各种链表上进展一些算法设计与根本操作类似的操作或组合,请仔细复习。例4假设有两个按元素值递增次序排列的线性表,均以单链表形式存储。请编写算法将这两个单链表归并为一个按元素值递减次序排列的单链表,并要求利用原来两个单链表的结点存放归并后的单链表。 题目分析因为两链表已按元素值递增次序排列,将其合并时,均从第一个结点起进展
4、比拟,将小的链入链表中,同时后移链表工作指针。该问题要求结果链表按元素值递减次序排列。故在合并的同时,将链表结点逆置。void Union(LinkList la, LinkList lb)la,lb分别是带头结点的两个单链表的头指针,链表中的元素值按递增序排列,本算法将两链表合并成一个按元素值递减次序排列的单链表。 pa=la-ne*t; pb=lb-ne*t;pa,pb分别是链表la和lb的工作指针 la-ne*t=null;la作结果链表的头指针,先将结果链表初始化为空。 while(pa!=null & pb!=null) 当两链表未访问完毕 if(pa-datadata) q=pa-
5、ne*t;将pa 的后继结点暂存于q。 pa-ne*t=la-ne*t;将pa结点链于结果表中,同时逆置。la-ne*t=pa;pa=q;恢复pa为当前待比拟结点。elseq=pb-ne*t; 将pb 的后继结点暂存于q。pb-ne*t=la-ne*t; 将pb结点链于结果表中,同时逆置。la-ne*t=pb;pb=q; 恢复pb为当前待比拟结点。while(pa!=null) 将la表的剩余局部链入结果表,并逆置。 q=pa-ne*t; pa-ne*t=la-ne*t; la-ne*t=pa; pa=q; while(pb!=null) q =pb-ne*t; pb-ne*t=la-ne*t
6、; la-ne*t=pb; pb=q; 算法Union完毕。注意:1此处q用作暂存后继结点,操作后pa或pb还回原指向位置;这与我们原来不改变pa或pb的指向,增加一个q=pa或pb作为摘取结点进展添加操作起到的作用一样。2 此处要完成逆序插入操作故用头插法基于头指针la或lb,注意尾插法附设一个尾指针,基于该指针插入的可完成顺序插入。注意:逆序另一种方式也要掌握!练习:练习题2 编程167.判断带头结点双向循环链表L是否对称相等.8. 设计一个算法判断单链表带头结点是否是递增的注意比排序算法应该简单,链表排序也要会实现9. 设计一个算法判断有序表A是否是有序表B的子集即表A中的元素在B中。思
7、考:如果递归程序怎么写?第三章:栈与队列1.两种特殊线性表:分别有后进先出、先进先出的特性。 B2.栈的顺序表示与实现利用静态数组或动态存分配 A 注意栈顶指针的初始位置不同,进出栈,栈空栈满的实现语句有差异!举例:假设定义typedef struct SElemType *base; SElemType *top; int stacksize;/当前栈能使用的最大容量 SqStack; SqStack s;top的初始值指向栈底,即top=base;栈空条件:s. top =s. base 此时不能出栈栈满条件:s.top-s.base=s.stacksize进栈操作:*s.top+=e;
8、或*s.top=e; s.top+;退栈操作:e=*-s.top;或s.top-; e=*s.top假设定义:typedef struct SElemType baseMA*SIZE; int top; SqStack; SqStack s;top的初始值为0时: 栈空条件:s. top =0此时不能出栈栈满条件:s.top = MA*SIZE进栈操作:s.bases.top+=e; 退栈操作:e=s.base-s.toptop的初始值为-1时: 栈空条件:s. top = -1此时不能出栈栈满条件:s.top = MA*SIZE-1进栈操作:s.base+s.top=e; 退栈操作:e=s.
9、bases.top-3.栈的链式表示与实现B (比照顺序栈,实质不带头结点的链表在头指针处插入和删除)4.队列的顺序表示与实现循环队列 A设两个指针:Q.front 指向队列头元素;Q.rear 指向队列尾元素的下一个位置注意队中假设Q.rear 指向队列尾元素,进出队,实现语句有差异!初始状态空队列:Q.front = Q.rear=0队头指针进1: Q.front = (Q.front + 1)% MA*SIZE队尾指针进1: Q.rear = (Q.rear + 1)% MA*SIZE;队列初始化: Q.front = Q.rear = 0;队空条件: Q.front = Q.rear;
10、队满条件:(Q.rear + 1) % MA*SIZE = Q.front 队列长度:(Q.rear-Q.front+MA*SIZE)%MA*SIZE6.队列的链式表示与实现 B本章重点:顺序栈的初始条件、操作,循环队列的初始条件、操作本章难点:栈的设计与使用,队列的设计与使用主要结合后面树和图中的应用复习例5链栈与顺序栈比起来优势在于。没有预设容量的限制例6计算算术表达式的值时,可用两个栈作辅助工具。对于给出的一个表达式,从左向右扫描它的字符,并将操作数放入栈S1中,运算符放入栈S2中,但每次扫描到运算符时,要把它同S2的栈顶运算符进展优先级比拟,当扫描到的运算符的优先级不高于栈顶运算符的优
11、先级时,取出栈S1的栈顶和次栈顶的两个元素,以及栈S2的栈顶运算符进展运算将结果放入栈S1中得到的结果依次用T1、T2等表示。为方便比拟,假设栈S2的初始栈顶为运算符的优先级低于加、减、乘、除中任何一种运算。现假设要计算表达式: A-B*C/D+E/F。写出栈S1和S2的变化过程。步骤栈S1栈S2输入的算术表达式按字符读入初始A-B*C/D+E/F1AA-B*C/D+E/F2A-B*C/D+E/F3AB-B*C/D+E/F4AB-*C/D+E/F5ABC-*C/D+E/F6AT1注:T1=B*C-/D+E/F7AT1D-/D+E/F8AT2注:T2=T1/DT3 注:T3=A-T2-+E/F9
12、T3E+E/F10T3E+/F11T3EF+/F12T3T4注:T4=E/FT5注:T5= T3+ T4+例7将两个栈存入数组V1.m应如何安排最好?这时栈空、栈满的条件是什么?,入栈和出栈的操作是什么?分析:为了增加存空间的利用率和减少溢出的可能性,由两个栈共享一片连续的空间时,应将两栈的栈底分别设在存空间的两端,这样只有当两栈顶指针相邻即值之差的绝对值为1时才产生溢出。设栈S1和栈S2共享向量V1.m,初始时,栈S1的栈顶指针top0=0,栈S2的栈顶指针top1=m+1,当top0=0为栈S1空,top1=m+1为栈S2空;当top0=0并且top1=m+1时为两栈全空。当top1-to
13、p0=1时为栈满。 入栈核心操作 S1: V+top0=*1; S2: V-top1=*2 出栈核心操作 S1: *1=Vtop0-; S2: *2=Vtop1+例8如果用一个循环数组base0.MA*-1表示队列时,该队列只有一个队列头指针front,不设队列尾指针rear,而改置计数器count用以记录队列中结点的个数。1编写实现队列的三个根本运算:判空、入队、出队2队列中能容纳元素的最多个数是多少typedefstruct ElemType baseMA*;int front,count; /front是指向队头元素针,count是队列中元素个数。CQueue; /定义类型标识符。(1)
14、判空:int Empty(CQueue q) /q是CQueue类型的变量 if(q.count=0) return(1);elsereturn(0); /空队列入队: int EnQueue(CQueue q,ElemType *)if(q.count=MA*)printf(“队满n);e*it(0); q.base(q.front+q.count)%MA*=*; /*入队 q.count+; return(1); /队列中元素个数增加1,入队成功。出队: int DelQueue(CQueue q, ElemType &*)if (q.count=0)printf(“队空n);return
15、(0);*=q.baseq.front;q.front=(q.front+1)%MA*; /计算新的队头指针q.count-;return(1);(2) 队列中能容纳的元素的个数为MA*。第四章:串1.串的根本概念C2.串的顺序表示与实现两种存储方式A 特别的模式匹配算法之KMP算法 B本章重点:串的定长顺序存储和堆分配存储、掌握一些常规的串操作自己会用和会编写本章难点:串的模式匹配快速算法KMP例9. 串的定长顺序存储缺点在于存在情况。截断例10u=*y*y*y*y*y;t=*y;ASSIGNs,u;ASSIGNv,SUBSTRs,INDE*s,t,LENt+1;ASSIGNm,ww求REP
16、LACE,m= _。 *y*y*ywwy例1114设字符串S=aabaabaabaac,P=aabaac1给出S和P的ne*t值和ne*tval值; 2假设S作主串,P作模式串,试给出利用BF算法和KMP算法的匹配过程。11p的ne*t与ne*tval值分别为012123和002003。 2利用BF算法的匹配过程: 第一趟匹配: aabaabaabaac aabaac(i=6,j=6) 第二趟匹配: aabaabaabaac aa(i=3,j=2) 第三趟匹配: aabaabaabaac a(i=3,j=1) 第四趟匹配: aabaabaabaac aabaac(i=9,j=6)第五趟匹配:
17、aabaabaabaac aa(i=6,j=2)第六趟匹配: aabaabaabaac a(i=6,j=1)第七趟匹配: aabaabaabaac 利用KMP算法的匹配过程: 第一趟匹配:aabaabaabaac aabaac(i=6,j=6,ne*tval(j)=3) 第二趟匹配:aabaabaabaac (aa)baac (i=9,j=6) 第三趟匹配:aabaabaabaac (成功) (aa)baac(i=13,j=7)例12一般串定位函数Inde*(S,T,pos), 设S的串长为n,T的串长为m,则最坏时间复杂度 ;而改良的Inde*_KMP(S,T,pos) 时间复杂度为。第五章
18、:数组和广义表1.数组的存储构造:以行为主序、以列为主序的地址映像函数 B2矩阵的压缩存储:1特殊阵:包括对称阵、三角阵、带状阵利用其特性压缩存储到一维数组B2稀疏阵 利用的是三元组顺序表来表示 B 用十字链表表示C本次考试不做要求3.广义表定义与存储表示 B本次考试不做要求本章重点:地址映像函数的计算包括数组和特殊矩阵例13n阶下三角矩阵A即当ij时,有aij=0,按照压缩存储的思想,可以将其主对角线以下所有元素(包括主对角线上元素 )依次存放于一维数组B中,请写出从第一列开场采用列序为主序分配方式时在B中确定元素aij的存放位置的公式。答:n阶下三角矩阵元素Aij1=i,j=j。第1列有n
19、个元素,第j列有n-j+1个元素,第1列到第j-1列是等腰梯形,元素数为(n+(n-j+2)(j-1)/2,而aij在第j列上的位置是为i-j+1。所以n阶下三角矩阵A按列存储,其元素aij在一维数组B中的存储位置k与i和j的关系为:k=(n+(n-(j-1)+1)(j-1)/2+(i-j+1)=(2n-j)(j-1)/2+i第六章:二叉树与树1.二叉树的定义和性质: B 几个特殊的二叉树:满二叉树、完全二叉树、二叉排序树、平衡二叉树 B2.二叉树的顺序存储: C3.二叉树的链式存储: 用二叉链表表示与实现 A4.二叉树的遍历:先中、后序遍历及应用,相应递归算法和非递归算法 A5.线索化二叉树
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 复习 要点

链接地址:https://www.desk33.com/p-7617.html