数据结构总复习资料(完整版).doc
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《数据结构总复习资料(完整版).doc》由用户(四川三人行教育)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 复习资料 完整版 下载 _各科综合_高中
- 资源描述:
-
1、2018数据结构总复习 第一章概论 1.1 数据结构的定义和分类 1.数据结构的定义 数据结构是一门研究非数值计算的程序设计问题中计算机的操作对象以及它们之间的关系和操作的 学科。 2.数据结构包括的内容 (1)逻辑结构 :数据元素之间的逻辑关系。 (2)存储结构 :数据元素及其关系在计算机存储器内的表示。 (3)操作 :数据的运算(检索、排序、插入、删除、修改)。 1.2 为什么学习数据结构 1.学习数据结构的作用 (1)计算机内的数值运算依靠方程式,而非数值运算(如表、树、图等)则要依靠数据结构。 (2)同样的数据对象,用不同的数据结构来表示,运算效率可能有明显的差异。 (3)程序设计的实
2、质是对实际问题选择一个好的数据结构,加之设计一个好的算法。而好的算法在 很大程度上取决于描述实际问题的数据结构。 2.电话号码查询问题 (1)要写出好的查找算法,取决于这张表的结构及存储方式。 (2)电话号码表的结构和存储方式决定了查找(算法)的效率。 1.3 算法的概念和特点 1.算法的概念和特点 算法是由若干条指令组成的有穷序列,具有以下特点: (1)输入 :具有 0 个或多个输入的外界量。 (2)输出 :至少产生1 个输出。 (3)有穷性 :每一条指令的执行次数必须是有限的。 (4)确定性 :每条指令的含义都必须明确,无二义性。 (5)可行性 :每条指令的执行时间都是有限的。 2.算法与
3、程序的区别 (1)一个程序 不一定 满足有穷性,但算法一定。 (2)程序中的指令必须 是机器可执行的,而算法无此限制。 (3)一个算法若用机器可执行的语言来描述,则它就是一个程序。 1 / 62 1.4 算法分析 1.时间复杂度 算法中基本操作重复执行的次数是问题规模n 的某个函数,用T(n) 表示,若有某个辅助函数f(n) , 使得当 n 趋近于无穷大时,T(n) / f(n)的极限值为不等于零的常数,则称f(n) 是 T(n) 的同数量级函数。 记作T(n)=O(f(n),称 O(f(n)为算法的渐近时间复杂度,简称时间复杂度。算法效率的度量,采用时 间复杂度。 常见函数的时间复杂度按数量
4、递增排列及增长率: 常数阶O(1) 对数阶O(log2n) 线性阶O(n) 线性对数阶O(nlog2n) 平方阶O(n 2) 立方阶O(n 3) k 次方阶O(n k) 指数阶O(2 n) 2.空间复杂度 空间复杂度是指算法在计算机内执行时所需存储空间的度量,记作:S(n) = O(f(n)。 3.算法分析的目的 目的在于选择合适 算法和改进算法 1.5 例题 例 1: for (i=1; in; i+ ) y = y+1;/语句 1 for (j=0; j=(2*n); j+) x+;/语句 2 解:语句1 频度为(n-1) ;语句 2 频度为(n-1)*(2n+1)=2n2-n-1,因此时
5、间复杂度T(n)=2n2-2=O(n2)。 例 2: i=1;/语句 1 while (i=n) i=i*2;/语句 2 解:语句1 频度为1;设语句2 频度为f(n) ,则有 2f(n)=n ,即 f(n)=log2n,去极大值,f(n)=log2n, 因此时间复杂度T(n)=1+log2n=O(log2n)。 2 / 62 第二章线性表 2.1 线性表的概念和运算 1.线性表的概念 线 性 表 是n (n 0) 个类型相同 的数据元素组成的有限序列 。其中数据元素的个数n 为线 性 表 的 长度, 当 n=0 时称为空表。 2.线性表的特点 对 于 非 空 的 线性表,有且仅有一个开始结点
6、 和一个终端结点 ;开始结点 没有 直接前趋,有且仅有一个 直接后继;终端结点没有 直接后继,有且仅有一个直接前趋;其余任何结点有且仅有一个直接前趋和一个 直接后继。 3.线性表的计算 (1)置空表 SETNULL(L) :将线性表L 置为空表。 (2)求长度 LENGTH(L) :返回是线性表L中结点的个数。 (3)取结点 GET(L,i ):当 1 iLENGTH(L)时,返回线性表L 中的第 i个结点,否则返回 NULL。 (4)定位 LOCATE(L, x) :当线性表L 中存在一个值为x的结点时,结果是该结点的位置;若表L 中 存在多个值为x 的结点,则返回首次找到的结点位置;若表L
7、 中不存在值为 x 的结点,则返回一个特殊值 表示值为 x的结点不存在。 (5)插入 INSERT(L,x, i): 在 线性表 L的第 i 个位置插入一个值为 x 的新结点。这里 1 in+1 , n是原表 L的长度。 (6)删除 DELETE(L,i):删除线性表L 的第 i 个结点。这里1 in ,n 是原表 L 的长度。 2.2 线性表的存储结构 1.顺序存储: (1)定义:把逻辑 上 相 邻的数据元素存储在物理上相邻的存储单 元 中 的 存 储结 构 。 简言之,逻辑上 相邻,物理上也相邻。 (2)顺序存储方法:用一组地址连续 的 存 储单 元 依 次 存 储线性表的元素,可通过数组
8、来实现。 (3)地址计算:设首元素a1 的存放地址为LOC(a1)(称为首地址 ) , 设每个元素占用存储空间(地址 长 度 ) 为L字节,则地址计算公式:LOC(ai)= LOC(a1) + (i-1)*L。 (4)结构定义: #define MAXSIZE1024/线性表的最大长度 typedef int datatype;/线性表数据元素类型 typedef struct datatype dataMAXSIZE; int last;/指示线性表的终端结点在表中的下标值 sequenlist; 2.链式存储: 3 / 62 (1)特点:用一组任意 的存储单元存储线性表的数据元素,利用指针
9、 实现了用不相邻的存储单元存 放逻辑上相邻的元素,每个数据元素ai ,除存储本身信息外,还需存储其直接后继的信息。 (2)头指针、头节点、开始节点 头指针 是指向链表中 第一个 结点(或为头结点或开始结点)的指针, 单链表可由一个头指针唯一确定。 头结点 是在链表的 开始结点之前附设的一个结点;数据域内只放空表标志和表长等信息; 开始结点 是指链表中存储线性表第一个数据元素a1 的结点。 (3)空表的表示 无头结点时,当 头指针的值为空时表示空表; 有头结点时,当 头结点的指针域为空时表示空表。 (4)结构定义 typedef int datatype;/ 线性表数据元素类型 typedef
10、struct node datatypedata;/数据域 struct node *next;/指针域 linklist; 3.存储结构比较 (1)优缺点 顺序存储的 优点 是存储密度大(1),存储空间利用率高。缺点 是插入或删除元素时不方便。适合做 查找这样的静态操作。 链式存储的 优点 是插入或删除元素时很方便,使用灵活。 缺点 是存储密度小(1),存储空间利用率低。 适合做做插入、删除这样的动态操作。 (2)线性表的顺序存储与链式存储对线性表的运算比较 顺序存储 时,相邻数据元素的存放地址也相邻(逻辑与物理统一);要求内存中可用存储单元的地址 必须是连续的。 链式存储 时,相邻数据元素
11、可随意存放,但所占存储空间分两部分,一部分存放结点值,另一部分存 放表示结点间关系的指针。 (3)时间复杂度和存储密度比较 顺序存储存储密度=1,链式存储 next; while(t!=NULL if(t-data = x) printf(成功找到 n); else printf(没有找到 n); (2)插入 void insert(Linklist*head,int x) 4 / 62 Linklist *t,*p; p = (Linklist*)malloc(sizeof(Linklist); p-data = x; t = head; while(t-next !=NULL if(t =
12、 head) p-next= head-next; head-next =p; else if(t-next =NULL) t-next= p; p-next= NULL; else p-next= t-next; t-next= p; (3)删除 void dele(Linklist *head) Linklist p ,q; p=head; while (p-next !=NULL) if (p-data!=p-next-data) p=p-next; else q=p-next;p-next=q-next; free(q); (4)逆置 void reverse(Linklist*hea
13、d) Linklist *s,*t,*p; p = head; s= p-next; while(s-next != NULL) t = s-next; s-next= p; p= s; s= t; s-next = p; head-next-next = NULL; head-next = s; 5 / 62 2.3 例题 例 1:一个一维数组M ,下标的范围是0到 9,每个数组元素用相邻的5 个字节存储。存储器按字节编 址 , 设存储数组元素MO的第一个字节的地址是98,则M3的第一个字节的地址是113。 例 2:在一个长度为n 的顺序表中向第i 个元素(1 i n+1)之前插入一个新元素
14、时,需要向后移动n-i+1 个元素(或删除第i 个元素,需要向前移动n-i个元素)。 例 3:在单链 表 中 , 若*p 结点不是末尾结点,在其前或后插入*s 结点或删除结点的操作是? 解:在其前插入*s 结点: s-next= p-next; p-next=s; t=p-data; p-data=s-data ; s-data= t ; 在其后插入 *s 结点: s-next=p-next;p-next=s; 删 除 其 前 结点:需要利用遍历 删 除 其 后 结点:q = p-next;p-next=q-next;free(q); 删 除 自 身 接 结点:q=p-next; p-data
15、= q-data ; p-next=q-next; free(q); 例 4:在线性表的下列存储结 构 中 , 读取指定序号的元素花费时间最少的是顺序结构。 第三章栈和队列 3.1 栈和队列的基本概念 1.栈的概念 栈 是 只 允 许在同一端进行 插入 和删除 操作的线性表。允许进 行 插 入 和 删除的一端叫栈顶(top) ,另一 端叫栈底 (bottum),栈中无数据元素时,称为空栈。具有 先进后出 ( FILO)或 后进先出 (LIFO)的特点。 2.栈的定义 (1)顺序栈(2)链栈 typedef int datatype;typedef int datatype; #define M
16、AXSIZE100typedefstruct node typedefstructdatatype data; datatype dataMAXSIZE;struct node *next; int top;linkstack; seqstack;linkstack *top; seqstack *s;top是栈顶指针,它唯一地确定一个链栈。 top=NULL 时,该链栈为空栈。链栈 中 的 结点是动态 产 生 的 , 无需考虑上溢问题 。 3.顺序栈操作 (1)判断栈空 int EMPTY(seqstack *s) return(!s top=0); 6 / 62 (2)置空栈 void S
17、ETNULL(seqstack*s) s top=-1; (3)判断栈满 int FULL(seqstack *s) return(stop=MAXSIZE-1); (4)进栈 seqstack * PUSH(seqstack *s,datatype x) if (FULL(s) printf(“stack overflow”);return NULL; stop+; s datas top=x; return s; (5)出栈 datatype POP(seqstack *s) if (EMPTY(s) printf(“stack underflow”); return NULL; stop
18、-; return(sdatas top+1); (6)取栈顶 datatype TOP(seqstack *s) if (EMPTY(s) printf(“stack isempty”); return NULL; return (sdatas top); 4.链栈操作 (1)进栈 linkstack *PUSHLSTACK(linkstack*top, datatype x) linkstack*p; p(linkstack*)malloc(sizeof(linkstack); p-data x; p-next top; return p; /*返回新栈顶指针*/ (2)出栈 linkst
19、ack *POPLSTACK(linkstack *top, datatype *datap) 7 / 62 linkstack*p; if (top=NULL) printf(“under flow”);return NULL; datap top-data; /*栈顶结点数据存入*datap */ p=top; top top-next; free(p); return top; /*返回新栈顶指针*/ 5.队列的概念 队列(Queue)也是一种 运算受限 的线性表。只允许在表的一端进行插入 ,而在另一端进行删除 。允许 删除的一端称为队头(front),允许插入的一端称为队尾 (rear
20、)。具有 先进先出 (FIFO)的特点。 6.队列的定义 (1)顺序队列(2)链式队列 #define MAXSIZE100typedef struct queuenode typedef structdatatype data; datatype dataMAXSIZE;struct queuenode *next; int front;QueueNode; int rear;typedefstruct sequeue;QueueNode *front; sequeue * sq;QueueNode *rear; LinkQueue; 7.循环队列 (1)假上溢 在入队和出队的操作中,头尾指
21、针只增加不减小,致使被删除元素的空间永远无法重新利用。尽管队 列中实际的元素个数远远小于 向量空间的规模,但也可能由于尾指针巳超出向量空间的上界而不能做入队 操作,该现象称为假上溢 。 (2)循环队列 为了解决假上溢问题,引入了循环队列的概念。在循环队列中进行出队 、入队 操作时,头尾指针仍要 加 1,朝前移动。只不过当头尾指针指向向量上界 ( MaxSize-1 )时,其加1操作的结果是指向向量的下界 0。 (3)队空队满问题 入队时: 尾指针向前追赶头指针,出队时: 头指针向前追赶尾指针,故队空和队满时头尾指针均相等, 无法通过sq-front= =sq- rear来判断队列“空”还是“满
22、”。 解决此问题的方法至少有两种: 1、另设一个布尔变量以区别队列的空和满; 2、少用一个元素空间为代价,入队前,测试尾指针sq-rear+1=sq-front,若相等则认为队满。 (4)常用操作 队空判断 :sq-front = sq- rear 队满判断 :sq- front =(sq-rear + 1) % maxSize 入队 :sq- rear= (sq-rear + 1) %maxSize 8 / 62 出队 :sq- front = (sq-front + 1) % maxSize 求队长 :(sq-rear - sq- front+maxSize)%maxSize 8.循环队列
23、操作 (1)入队 检查队列是否已满,若队满,则进行溢出错误处理。 将队尾指针后移一个位置(即加1),指向下一单元。 将新元素赋给队尾指针所指单元。 Status EnQueue (SqQueue *Q,ElemType e) if ( (Q-rear+1)%MAXQSIZE = Q-front ) return(ERROR);/队满上溢 Q-rear=(Q-rear+1)%MAXQSIZE; Q-dataQ-rear=e; return(True); (2)出队 检查队列是否为空,若队空,则进行下溢错误处理。 将队首指针后移一个位置(即加1) 。 取队首元素的值。 Status DeQueue
24、 (SqQueue*Q) if (Q-rear= Q-front) return(NULL);/队空下溢 Q-front=(Q-front+1)%MAXQSIZE; return(Q-dataQ-front); (3)置空队 Q-front=Q-rear= MAXQSIZE-1; (4)取队头 datatype GetHead(SqQueue *Q) if (Q-front=Q-rear) return(NULL);/队空 return (Q-data(Q-front+1)%MAXQSIZE ); (5)判断队空 int QueueEmpty(SqQueue *Q ) if (Q-front=
25、Q-rear) return (True); else return (False); 9.链式队列操作 (1)置空 void InitQueue(LinkQueue *Q) Q.front=Q.rear=(queuenode *)malloc(sizeof(queuenode ); 9 / 62 Q.front-next=Q.rear-next=NULL; (2)判断队空 int QueueEmpty(LinkQueue *Q) return (Q.front-next= =NULL (3)入队 void EnQueue(LinkQueue *Q,datatype x) QueueNode
展开阅读全文