考研_计算机_数据结构_高分笔记

合集下载

数据结构高分笔记

数据结构高分笔记
1.3 数据结构和算法的基本概念. . . . . . . . . . . . . . . . . . . . . . . . . .14 1.3.1 数据结构的基本概念. . . . . . . . . . . . . . . . . . . . . . . . .14 1.3.2 算法的基本概念. . . . . . . . . . . . . . . . . . . . . . . . . . .15
本书讨论群:15945769
本书特点:
作者 qq:39826407
(1)精心挑选出适合考研的习题,并配上通俗易懂的答案供你自测和练习。
(2)总结出考研必备知识点,并且帮你把其中过于专业过于严谨的表述翻译成通俗易 懂的语言。
(3)针对于近年数据结构大题的出题风格(比如算法设计题目中的三段式题目:1.表 述算法思想。2.写出算法描述。3.计算算法的时间和空间复杂度),设计了独特的真题仿 造部分,让你在复习的过程中逐渐养成适合解决考研类型题目的习惯。
第三章 栈、队列和数组. . . . . . . . . . . . . . . . . . . . . . . ..54
3.1 栈和队列的基本概念. . . . . . . . . . . . . . . . . . . . . . . . . ..54 3.1.1 栈的基本概念. . . . . . . . . . . . . . . . . . . . . . . . . . ...54 3.1.2 队列的基本概念. . . . . . . . . . . . . . . . . . . . . . . . . . .54
接下来我详细讲解一下这本辅导书书的写作过程,请看下图:
本书讨论群:15945769
作者 qq:39826407

数据结构考研笔记整理(全)

数据结构考研笔记整理(全)

数据结构考研笔记整理(全)数据结构考研笔记整理数据结构是计算机科学中非常重要的一门课程,对于计算机专业的学生来说,考研复习过程中对数据结构的准备非常关键。

因此,我们需要系统地整理数据结构的相关知识点,以便更好地理解和掌握。

一、线性表线性表是数据结构中最基本的一种数据结构,它是一种有序的数据元素的集合。

常见的线性表有顺序表和链表。

1. 顺序表顺序表是将数据元素存放在一块连续的存储空间中,通过元素的下标来访问。

具有随机访问的特点,但插入和删除操作比较麻烦。

适用于查找操作频繁的场景。

2. 链表链表是将数据元素存放在任意的存储空间中,通过指针来连接各个元素。

具有插入和删除操作方便的特点,但不支持随机访问。

适用于插入和删除操作频繁的场景。

二、栈和队列栈和队列是特殊的线性表,它们都具有先进先出的特点。

1. 栈栈是一种特殊的线性表,只能在表的一端进行插入和删除操作,即“先进后出”。

常见的应用有函数调用的过程中的参数传递、表达式求值等。

2. 队列队列也是一种特殊的线性表,只能在表的一端进行插入操作,而在另一端进行删除操作,即“先进先出”。

常见的应用有任务调度、缓冲区管理等。

三、树树是一种非常重要的非线性数据结构,它由节点和边组成。

树具有层次结构,常见的树结构有二叉树、二叉搜索树和平衡二叉树等。

1. 二叉树二叉树是每个节点最多有两个子树的树结构,包括左子树和右子树。

二叉树的遍历方式有前序遍历、中序遍历和后序遍历。

2. 二叉搜索树二叉搜索树是一种特殊的二叉树,它的左子树中的所有节点都小于根节点,右子树中的所有节点都大于根节点。

具有快速查找和插入的特点。

3. 平衡二叉树平衡二叉树是一种特殊的二叉搜索树,它的左右子树的高度差不超过1。

通过旋转操作可以保持树的平衡性。

四、图图是一种非常复杂的非线性数据结构,它由顶点和边组成。

图可以分为有向图和无向图,常见的图算法有深度优先搜索和广度优先搜索。

1. 深度优先搜索深度优先搜索是一种用于遍历或搜索图和树的算法,它从一个节点开始,尽可能深地访问每个节点的所有子节点,直到没有子节点为止。

数据结构复习笔记

数据结构复习笔记

第一章概论1.数据:信息的载体,能被计算机识别、存储和加工处理;2.数据元素:数据的基本单位,可由若干个数据项组成,数据项是具有独立含义的最小标识单位;3.数据结构:数据之间的相互关系,即数据的组织形式;它包括:1数据的逻辑结构,从逻辑关系上描述数据,与数据存储无关,独立于计算机;2数据的存储结构,是逻辑结构用计算机语言的实现,依赖于计算机语言;3数据的运算,定义在逻辑结构上,每种逻辑结构都有一个运算集合;常用的运算:检索/插入/删除/更新/排序;4.数据的逻辑结构可以看作是从具体问题抽象出来的数学模型;数据的存储结构是逻辑结构用计算机语言的实现;5.数据类型:一个值的集合及在值上定义的一组操作的总称;分为:原子类型和结构类型;6.抽象数据类型:抽象数据的组织和与之相关的操作;优点:将数据和操作封装在一起实现了信息隐藏;7. 抽象数据类型ADT:是在概念层上描述问题;类:是在实现层上描述问题;在应用层上操作对象类的实例解决问题;8.数据的逻辑结构,简称为数据结构,有:1线性结构,若结构是非空集则仅有一个开始和终端结点,并且所有结点最多只有一个直接前趋和后继;2非线性结构,一个结点可能有多个直接前趋和后继;9.数据的存储结构有:1顺序存储,把逻辑相邻的结点存储在物理上相邻的存储单元内;2链接存储,结点间的逻辑关系由附加指针字段表示;3索引存储,存储结点信息的同时,建立附加索引表,有稠密索引和稀疏索引;4散列存储,按结点的关键字直接计算出存储地址;10.评价算法的好坏是:算法是正确的;执行算法所耗的时间;执行算法的存储空间辅助存储空间;易于理解、编码、调试;11.算法的时间复杂度Tn:是该算法的时间耗费,是求解问题规模n的函数;记为On;时间复杂度按数量级递增排列依次为:常数阶O1、对数阶Olog2n、线性阶On、线性对数阶Onlog2n、平方阶On^2、立方阶On^3、……k次方阶On^k、指数阶O2^n;13.算法的空间复杂度Sn:是该算法的空间耗费,是求解问题规模n的函数;12.算法衡量:是用时间复杂度和空间复杂度来衡量的,它们合称算法的复杂度;13. 算法中语句的频度不仅与问题规模有关,还与输入实例中各元素的取值相关;第二章线性表1.线性表:是由nn≥0个数据元素组成的有限序列;3.顺序表:把线性表的结点按逻辑次序存放在一组地址连续的存储单元里;4.顺序表结点的存储地址计算公式:Locai=Loca1+i-1C;1≤i≤n5.顺序表上的基本运算public interface List {链表:只有一个链域的链表称单链表;在结点中存储结点值和结点的后继结点的地址,data next data是数据域,next是指针域;1建立单链表;时间复杂度为On;加头结点的优点:1链表第一个位置的操作无需特殊处理;2将空表和非空表的处理统一; 2查找运算;时间复杂度为On;public class SLNode implements Node {private Object element;private SLNode next;public SLNodeObject ele, SLNode next{= ele;= next;}public SLNode getNext{return next;}public void setNextSLNode next{= next;}public Object getData {return element;}public void setDataObject obj {element = obj;}}public class ListSLinked implements List {private SLNode head; etData==ereturn p;else p = ;return null;}etData;.getNext;size--;return obj;}etNext;size--;return true;}return false;}环链表:是一种首尾相连的链表;特点是无需增加存储量,仅对表的链接方式修改使表的处理灵活方便;8.空循环链表仅由一个自成循环的头结点表示;9.很多时候表的操作是在表的首尾位置上进行,此时头指针表示的单循环链表就显的不够方便,改用尾指针rear来表示单循环链表;用头指针表示的单循环链表查找开始结点的时间是O1,查找尾结点的时间是On;用尾指针表示的单循环链表查找开始结点和尾结点的时间都是O1;10.在结点中增加一个指针域,prior|data|next;形成的链表中有两条不同方向的链称为双链表;public class DLNode implements Node {private Object element;private DLNode pre;private DLNode next;public DLNodeObject ele, DLNode pre, DLNode next{= ele;= pre;= next;}public DLNode getNext{return next;}public void setNextDLNode next{= next;}public DLNode getPre{return pre;}public void setPreDLNode pre{= pre;}public Object getData {return element;}public void setDataObject obj {element = obj;}}public class LinkedListDLNode implements LinkedList {private int size; etPrenode;node;size++;return node;}etNextnode;node;size++;return node;}etNext;.setPre;size--;return obj;}序表和链表的比较1基于空间的考虑:顺序表的存储空间是静态分配的,链表的存储空间是动态分配的;顺序表的存储密度比链表大;因此,在线性表长度变化不大,易于事先确定时,宜采用顺序表作为存储结构;2基于时间的考虑:顺序表是随机存取结构,若线性表的操作主要是查找,很少有插入、删除操作时,宜用顺序表结构;对频繁进行插入、删除操作的线性表宜采用链表;若操作主要发生在表的首尾时采用尾指针表示的单循环链表;12.存储密度=结点数据本身所占的存储量/整个结点结构所占的存储总量存储密度:顺序表=1,链表<1;第三章栈和队列1.栈是限制仅在表的一端进行插入和删除运算的线性表又称为后进先出表LIFO表;插入、删除端称为栈顶,另一端称栈底;表中无元素称空栈;2.栈的基本运算有:1initstacks,构造一个空栈;2stackemptys,判栈空;3stackfulls,判栈满;4pushs,x,进栈;5pops,退栈;6stacktops,取栈顶元素;3.顺序栈:栈的顺序存储结构称顺序栈;4.当栈满时,做进栈运算必定产生空间溢出,称“上溢”;当栈空时,做退栈运算必定产生空间溢出,称“下溢”;上溢是一种错误应设法避免,下溢常用作程序控制转移的条件;5.在顺序栈上的基本运算:public interface Stack {栈:栈的链式存储结构称链栈;栈顶指针是链表的头指针;7.链栈上的基本运算:public class StackSLinked implements Stack {private SLNode top; 列是一种运算受限的线性表,允许删除的一端称队首,允许插入的一端称队尾;队列又称为先进先出线性表,FIFO表;9.队列的基本运算:1initqueueq,置空队;2queueemptyq,判队空;3queuefullq,判队满;4enqueueq,x,入队;5dequeueq,出队;6queuefrontq,返回队头元素;10.顺序队列:队列的顺序存储结构称顺序队列;设置front和rear指针表示队头和队尾元素在向量空间的位置;11.顺序队列中存在“假上溢”现象,由于入队和出队操作使头尾指针只增不减导致被删元素的空间无法利用,队尾指针超过向量空间的上界而不能入队;12.为克服“假上溢”现象,将向量空间想象为首尾相连的循环向量,存储在其中的队列称循环队列;i=i+1%queuesize13.循环队列的边界条件处理:由于无法用front==rear来判断队列的“空”和“满”;解决的方法有:1另设一个布尔变量以区别队列的空和满;2少用一个元素,在入队前测试rear在循环意义下加1是否等于front;3使用一个记数器记录元素总数;14.循环队列的基本运算:public interface Queue {队列:队列的链式存储结构称链队列,链队列由一个头指针和一个尾指针唯一确定;16.链队列的基本运算:public class QueueSLinked implements Queue {private SLNode front;private SLNode rear;private int size;public QueueSLinked {front = new SLNode;rear = front;size = 0;}etData;}}第四章串1.串:是由零个或多个字符组成的有限序列;包含字符的个数称串的长度;2.空串:长度为零的串称空串;空白串:由一个或多个空格组成的串称空白串;子串:串中任意个连续字符组成的子序列称该串的子串;主串:包含子串的串称主串;子串的首字符在主串中首次出现的位置定义为子串在主串中的位置;3.空串是任意串的子串;任意串是自身的子串;串常量在程序中只能引用但不能改变其值;串变量取值可以改变;4.串的基本运算1intstrlenchars;求串长;2charstrcpycharto,charfrom;串复制;3charstrcatcharto,charfrom;串联接;4intstrcmpchars1,chars2;串比较;5charstrchrchars,charc;字符定位;5.串的存储结构:1串的顺序存储:串的顺序存储结构称顺序串;按存储分配不同分为:1静态存储分配的顺序串:直接用定长的字符数组定义,以“\0”表示串值终结;definemaxstrsize256typedefcharseqstringmaxstrsize;seqstrings;不设终结符,用串长表示;Typedefstruct{Charchmaxstrsize;Intlength;}seqstring;以上方式的缺点是:串值空间大小是静态的,难以适应插入、链接等操作;2动态存储分配的顺序串:简单定义:typedefcharstring;复杂定义:typedefstruct{charch;intlength;}hstring;2串的链式存储:串的链式存储结构称链串;链串由头指针唯一确定;类型定义:typedefstructnode{chardata;structnodenext;}linkstrnode;typedeflinkstrnodelinkstring;linkstrings;将结点数据域存放的字符个数定义为结点的大小;结点大小不为1的链串类型定义:definenodesize80typedefstructnode{chardatanodesize;structnodenext;}linkstrnode;6.串运算的实现1顺序串上的子串定位运算;1子串定位运算又称串的模式匹配或串匹配;主串称目标串;子串称模式串; 2朴素的串匹配算法;时间复杂度为On^2;比较的字符总次数为n-m+1m; Intnaivestrmatchseqstringt,seqstringp{inti,j,k;intm=;intn=;fori=0;i<=n-m;i++{j=0;k=i;whilej<m&&k==j{j++;k++;}ifj==mreturni;}return–1;}2链串上的子串定位运算;时间复杂度为On^2;比较的字符总次数为n-m+1m;LinkstrnodelilnkstrmatchlinkstringT,linkstringP {linkstrnodeshift,t,p;shift=T;t=shift;p=P;whilet&&p{ift->data==p->data{t=t->next;p=p->next;}else{shift=shift->next;t=shift;p=P;}}ifp==NULLreturnshift;elsereturnNULL;}第五章多维数组和广义表1.多维数组:一般用顺序存储的方式表示数组;2.常用方式有:1行优先顺序,将数组元素按行向量排列;2列优先顺序,将数组元素按列向量排列;3.计算地址的函数:LOCAij=LOCAc1c2+i-c1d2-c2+1+j-c2d4.矩阵的压缩存储:为多个非零元素分配一个存储空间;对零元素不分配存储空间;1对称矩阵:在一个n阶的方阵A中,元素满足Aij=Aji0<=i,j<=n-1;称为对称矩阵;元素的总数为:nn+1/2;设:I=i或j中大的一个数;J=i或j中小的一个数;则:k=II+1/2+J;地址计算:LOCAij=LOCsak=LOCsa0+kd=LOCsa0+II+1/2+Jd2三角矩阵:以主对角线划分,三角矩阵有上三角和下三角;上三角的主对角线下元素均为常数c;下三角的主对角线上元素均为常数c;元素总数为:nn+1/2+1;以行优先顺序存放的Aij与SAk的关系:上三角阵:k=i2n-i+1/2+j-i;下三角阵:k=ii+1/2+j;3对角矩阵:所有的非零元素集中在以主对角线为中心的带状区域,相邻两侧元素均为零;|i-j|>k-1/2以行优先顺序存放的Aij与SAk的关系:k=2i+j;5.稀疏矩阵:当矩阵A中有非零元素S个,且S远小于元素总数时,称为稀疏矩阵;对其压缩的方法有顺序存储和链式存储;1三元组表:将表示稀疏矩阵的非零元素的三元组行号、列号、值按行或列优先的顺序排列得到的一个结点均是三元组的线性表,将该表的线性存储结构称为三元组表;其类型定义:definemaxsize10000typedefintdatatype;typedefstruct{inti,j;datatypev;}trituplenode;typedefstruct{trituplenodedatamaxsize;intm,n,t;}tritupletable;2带行表的三元组表:在按行优先存储的三元组表中加入一个行表记录每行的非零元素在三元组表中的起始位置;类型定义:definemaxrow100typedefstruct{tritulpenodedatamaxsize;introwtabmaxrow;intm,n,t;}rtritulpetable;6.广义表:是线性表的推广,广义表是n个元素的有限序列,元素可以是原子或一个广义表,记为LS;7.若元素是广义表称它为LS的子表;若广义表非空,则第一个元素称表头,其余元素称表尾;8.表的深度是指表展开后所含括号的层数;9.把与树对应的广义表称为纯表,它限制了表中成分的共享和递归;10.允许结点共享的表称为再入表;11.允许递归的表称为递归表;12.相互关系:线性表∈纯表∈再入表∈递归表;13.广义表的特殊运算:1取表头headLS;2取表尾tailLS;第六章树1.树:是n个结点的有限集T,T为空时称空树,否则满足:1有且仅有一个特定的称为根的结点;2其余结点可分为m个互不相交的子集,每个子集本身是一棵树,并称为根的子树;2.树的表示方法:1树形表示法;2嵌套集合表示法;3凹入表表示法;4广义表表示法;3.一个结点拥有的子树数称为该结点的度;一棵树的度是指树中结点最大的度数;4.度为零的结点称叶子或终端结点;度不为零的结点称分支结点或非终端结点5.根结点称开始结点,根结点外的分支结点称内部结点;6.树中某结点的子树根称该结点的孩子;该结点称为孩子的双亲;7.树中存在一个结点序列K1,K2,…Kn,使Ki为Ki+1的双亲,则称该结点序列为K1到Kn的路径或道路;8.树中结点K到Ks间存在一条路径,则称K是Ks的祖先,Ks是K的子孙;9.结点的层数从根算起,若根的层数为1,则其余结点层数是其双亲结点层数加1;双亲在同一层的结点互为堂兄弟;树中结点最大层数称为树的高度或深度;10.树中每个结点的各个子树从左到右有次序的称有序树,否则称无序树;11.森林是m棵互不相交的树的集合;12.二叉树:是n个结点的有限集,它或为空集,或由一个根结点及两棵互不相交的、分别称为该根的左子树和右子树的二叉树组成;13.二叉树不是树的特殊情况,这是两种不同的数据结构;它与无序树和度为2的有序树不同;14.二叉树的性质:1二叉树第i层上的结点数最多为2^i-1;2深度为k的二叉树至多有2^k-1个结点;3在任意二叉树中,叶子数为n0,度为2的结点数为n2,则n0=n2+1;15.满二叉树是一棵深度为k的且有2^k-1个结点的二叉树;16.完全二叉树是至多在最下两层上结点的度数可以小于2,并且最下层的结点集中在该层最左的位置的二叉树;17.具有N个结点的完全二叉树的深度为log2N取整加1;18.二叉树的存储结构1顺序存储结构:把一棵有n个结点的完全二叉树,从树根起自上而下、从左到右对所有结点编号,然后依次存储在一个向量b0~n中,b1~n存放结点,b0存放结点总数;各个结点编号间的关系:1i=1是根结点;i>1则双亲结点是i/2取整;2左孩子是2i,右孩子是2i+1;要小于n3i>n/2取整的结点是叶子;4奇数没有右兄弟,左兄弟是i-1;5偶数没有左兄弟,右兄弟是i+1;2链式存储结构结点的结构为:lchild|data|rchild;相应的类型说明:typedefchardata;typedefstructnode{datatypedata;structnodelchild,rchild;}bintnode;typedefbintnodebintree;19.在二叉树中所有类型为bintnode的结点和一个指向开始结点的bintree类型的头指针构成二叉树的链式存储结构称二叉链表;20.二叉链表由根指针唯一确定;在n个结点的二叉链表中有2n个指针域,其中n+1个为空;21.二叉树的遍历方式有:前序遍历、中序遍历、后序遍历;时间复杂度为On;22.线索二叉树:利用二叉链表中的n+1个空指针域存放指向某种遍历次序下的前趋和后继结点的指针,这种指针称线索;加线索的二叉链表称线索链表;相应二叉树称线索二叉树;23.线索链表结点结构:lchild|ltag|data|rtag|rchild;ltag=0,lchild是指向左孩子的指针;ltag=1,lchild是指向前趋的线索;rtag=0,rchild是指向右孩子的指针;rtag=1,rchild是指向后继的线索;24.查找p在指定次序下的前趋和后继结点;算法的时间复杂度为Oh;线索对查找前序前趋和后序后继帮助不大;25.遍历线索二叉树;时间复杂度为On;26.树、森林与二叉树的转换1树、森林与二叉树的转换1树与二叉树的转换:1}所有兄弟间连线;2}保留与长子的连线,去除其它连线;该二叉树的根结点的右子树必为空;2森林与二叉树的转换:1}将所有树转换成二叉树;2}将所有树根连线;2二叉树与树、森林的转换;是以上的逆过程;27.树的存储结构1双亲链表表示法:为每个结点设置一个parent指针,就可唯一表示任何一棵树;Data|parent2孩子链表表示法:为每个结点设置一个firstchild指针,指向孩子链表头指针,链表中存放孩子结点序号;Data|firstchild;3双亲孩子链表表示法:将以上方法结合;Data|parent|firstchild4孩子兄弟链表表示法:附加两个指向左孩子和右兄弟的指针;Leftmostchild|data|rightsibling28.树和森林的遍历:前序遍历一棵树等价于前序遍历对应二叉树;后序遍历等价于中序遍历对应二叉树;29.最优二叉树哈夫曼树:树的路径长度是从树根到每一结点的路径长度之和;将树中的结点赋予实数称为结点的权;30.结点的带权路径是该结点的路径长度与权的乘积;树的带权路径长度又称树的代价,是所有叶子的带权路径长度之和;31.带权路径长度最小的二叉树称最优二叉树哈夫曼树;32.具有2n-1个结点其中有n个叶子,并且没有度为1的分支结点的树称为严格二叉树;33.哈夫曼编码34.对字符集编码时,要求字符集中任一字符的编码都不是其它字符的编码前缀,这种编码称前缀码;35.字符出现频度与码长乘积之和称文件总长;字符出现概率与码长乘积之和称平均码长;36.使文件总长或平均码长最小的前缀码称最优前缀码37.利用哈夫曼树求最优前缀码,左为0,右为1;编码平均码长最小;没有叶子是其它叶子的祖先,不可能出现重复前缀;第七章图1.图:图G是由顶点集V和边集E组成,顶点集是有穷非空集,边集是有穷集;中每条边都有方向称有向图;有向边称弧;边的始点称弧尾;边的终点称弧头;G中每条边都没有方向的称无向图;3.顶点n与边数e的关系:无向图的边数e介于0~nn-1/2之间,有nn-1/2条边的称无向完全图;有向图的边数e介于0~nn-1之间,有nn-1条边的称有向完全图;4.无向图中顶点的度是关联与顶点的边数;有向图中顶点的度是入度与出度的和;所有图均满足:所有顶点的度数和的一半为边数;5.图GV,E,如V’是V的子集,E’是E的子集,且E’中关联的顶点均在V’中,则G’V’,E’是G的子图;6.在有向图中,从顶点出发都有路径到达其它顶点的图称有根图;7.在无向图中,任意两个顶点都有路径连通称连通图;极大连通子图称连通分量;8.在有向图中,任意顺序两个顶点都有路径连通称强连通图;极大连通子图称强连通分量;9.将图中每条边赋上权,则称带权图为网络;10.图的存储结构:1邻接矩阵表示法:邻接矩阵是表示顶点间相邻关系的矩阵;n个顶点就是n阶方阵;无向图是对称矩阵;有向图行是出度,列是入度;2邻接表表示法:对图中所有顶点,把与该顶点相邻接的顶点组成一个单链表,称为邻接表,adjvex|next,如要保存顶点信息加入data;对所有顶点设立头结点,vertex|firstedge,并顺序存储在一个向量中;vertex保存顶点信息,firstedge保存邻接表头指针;11.邻接矩阵表示法与邻接表表示法的比较:1邻接矩阵是唯一的,邻接表不唯一;2存储稀疏图用邻接表,存储稠密图用邻接矩阵;3求无向图顶点的度都容易,求有向图顶点的度邻接矩阵较方便;4判断是否是图中的边,邻接矩阵容易,邻接表最坏时间为On;5求边数e,邻接矩阵耗时为On^2,与e无关,邻接表的耗时为Oe+n;12.图的遍历:1图的深度优先遍历:类似与树的前序遍历;按访问顶点次序得到的序列称DFS序列;对邻接表表示的图深度遍历称DFS,时间复杂度为On+e;对邻接矩阵表示的图深度遍历称DFSM,时间复杂度为On^2;2图的广度优先遍历:类似与树的层次遍历;按访问顶点次序得到的序列称BFS序列;对邻接表表示的图广度遍历称BFS,时间复杂度为On+e;对邻接矩阵表示的图广度遍历称BFSM,时间复杂度为On^2;13.将没有回路的连通图定义为树称自由树;14.生成树:连通图G的一个子图若是一棵包含G中所有顶点的树,该子图称生成树;有DFS生成树和BFS生成树,BFS生成树的高度最小;非连通图生成的是森林;15.最小生成树:将权最小的生成树称最小生成树;是无向图的算法1普里姆算法:1确定顶点S、初始化候选边集T0~n-2;formvex|tovex|lenght2选权值最小的Ti与第1条记录交换;3从T1中将tovex取出替换以下记录的fromvex计算权;若权小则替换,否则不变;4选权值最小的Ti与第2条记录交换;5从T2中将tovex取出替换以下记录的fromvex计算权;若权小则替换,否则不变;6重复n-1次;初始化时间是On,选轻边的循环执行n-1-k次,调整轻边的循环执行n-2-k;算法的时间复杂度为On^2,适合于稠密图;2克鲁斯卡尔算法:1初始化确定顶点集和空边集;对原边集按权值递增顺序排序;2取第1条边,判断边的2个顶点是不同的树,加入空边集,否则删除;3重复e次;对边的排序时间是Oelog2e;初始化时间为On;执行时间是Olog2e;算法的时间复杂度为Oelog2e,适合于稀疏图;16.路径的开始顶点称源点,路径的最后一个顶点称终点;17.单源最短路径问题:已知有向带权图,求从某个源点出发到其余各个顶点的最短路径;18.单目标最短路径问题:将图中每条边反向,转换为单源最短路径问题;19.单顶点对间最短路径问题:以分别对不同顶点转换为单源最短路径问题;20.所有顶点对间最短路径问题:分别对图中不同顶点对转换为单源最短路径问题;21.迪杰斯特拉算法:1初始化顶点集Si,路径权集Di,前趋集Pi;2设置Ss为真,Ds为0;3选取Di最小的顶点加入顶点集;4计算非顶点集中顶点的路径权集;5重复3n-1次;算法的时间复杂度为On^2;22.拓扑排序:对一个有向无环图进行拓扑排序,是将图中所有顶点排成一个线性序列,满足弧尾在弧头之前;这样的线性序列称拓扑序列;1无前趋的顶点优先:总是选择入度为0的结点输出并删除该顶点的所有边;设置各个顶点入度时间是On+e,设置栈或队列的时间是On,算法时间复杂度为On+e;2无后继的顶点优先:总是选择出度为0的结点输出并删除该顶点的所有边;设置各个顶点出度时间是On+e,设置栈或队列的时间是On,算法时间复杂度为On+e;求得的是逆拓扑序列;第八章排序1.文件:由一组记录组成,记录有若干数据项组成,唯一标识记录的数据项称关键字;2.排序是将文件按关键字的递增减顺序排列;3.排序文件中有相同的关键字时,若排序后相对次序保持不变的称稳定排序,否则称不稳定排序;4.在排序过程中,文件放在内存中处理不涉及数据的内、外存交换的称内排序,反之称外排序;5.排序算法的基本操作:1比较关键字的大小;2改变指向记录的指针或移动记录本身;6.评价排序方法的标准:1执行时间;2所需辅助空间,辅助空间为O1称就地排序;另要注意算法的复杂程度;7.若关键字类型没有比较运算符,可事先定义宏或函数表示比较运算;8.插入排序1直接插入排序算法中引入监视哨R0的作用是:1保存Ri的副本;2简化边界条件,防止循环下标越界;关键字比较次数最大为n+2n-1/2;记录移动次数最大为n+4n-1/2;算法的最好时间是On;最坏时间是On^2;平均时间是On^2;是一种就地的稳定的排序;2希尔排序实现过程:是将直接插入排序的间隔变为d;d的取值要注意:1最后一次必为1;2避免d 值互为倍数;关键字比较次数最大为n^;记录移动次数最大为^;算法的平均时间是On^;是一种就地的不稳定的排序;9.交换排序1冒泡排序实现过程:从下到上相邻两个比较,按小在上原则扫描一次,确定最小值,重复n-1次;关键字比较次数最小为n-1、最大为nn-1/2;记录移动次数最小为0,最大为3nn-1/2;算法的最好时间是On;最坏时间是On^2;平均时间是On^2;是一种就地的稳定的排序;2快速排序实现过程:将第一个值作为基准,设置i,j指针交替从两头与基准比较,有交换后,交换j,i;i=j时确定基准,并以其为界限将序列分为两段;重复以上步骤;关键字比较次数最好为nlog2n+nC1、最坏为nn-1/2;算法的最好时间是Onlog2n;最坏时间是On^2;平均时间是Onlog2n;辅助空间为Olog2n;是一种不稳定排序;10.选择排序1直接选择排序实现过程:选择序列中最小的插入第一位,在剩余的序列中重复上一步,共重复n-1次;关键字比较次数为nn-1/2;记录移动次数最小为0,最大为3n-1;算法的最好时间是On^2;最坏时间是On^2;平均时间是On^2;是一种就地的不稳定的排序;2堆排序。

湖北省考研计算机复习资料数据结构与算法重点知识点解析

湖北省考研计算机复习资料数据结构与算法重点知识点解析

湖北省考研计算机复习资料数据结构与算法重点知识点解析数据结构与算法是计算机科学与技术领域中非常重要的基础知识,对于考研计算机专业的学生来说尤为关键。

本文将对湖北省考研计算机复习资料中数据结构与算法的重点知识点进行解析,帮助考生更好地理解和掌握相关内容。

一、线性表1. 数组数组是一种最简单的数据结构,它由相同类型的元素组成,并按一定的顺序排列。

在计算机科学中,数组是一种连续存储结构,可以通过下标来访问其中的元素。

在算法设计中,数组的访问时间复杂度为O(1),是非常高效的数据结构之一。

2. 链表链表是一种线性表的存储结构,它由节点组成,每个节点包含一个数据元素和一个指向下一个节点的指针。

链表的特点是插入和删除操作非常高效,时间复杂度为O(1),但是访问操作的时间复杂度较高,为O(n)。

3. 栈和队列栈和队列是常用的数据结构,它们都属于线性表的特殊形式。

栈是一种后进先出(LIFO)的数据结构,只允许在表尾进行插入和删除操作。

栈可以用数组或链表来实现,常见的操作包括入栈(push)和出栈(pop)。

队列是一种先进先出(FIFO)的数据结构,允许在表的一端进行插入操作,另一端进行删除操作。

队列可以用数组或链表来实现,常见的操作包括入队(enqueue)和出队(dequeue)。

二、树与二叉树1. 树的基本概念树是一种非线性的数据结构,由节点和边组成。

树的每个节点可以有零个或多个子节点,其中有且仅有一个节点称为根节点。

树常用于表示层次结构,例如文件系统和组织结构等。

2. 二叉树二叉树是一种特殊的树结构,每个节点最多有两个子节点,分别称为左子树和右子树。

二叉树常用于解决递归问题,例如二叉查找树和平衡二叉树等。

3. 堆和二叉堆堆是一种特殊的二叉树结构,它满足堆特性:对于任意节点i,其父节点的值小于等于子节点的值。

堆常常用于实现优先队列和排序算法。

二叉堆是一种完全二叉树结构,可以用数组来表示。

在二叉堆中,每个节点的值都大于等于其子节点的值,称为最大堆;或者每个节点的值都小于等于其子节点的值,称为最小堆。

数据结构详细笔记

数据结构详细笔记

第1章绪论◆基本概念:数据、数据元素、数据对象、数据结构、数据类型、抽象数据类型。

数据——所有能被计算机识别、存储和处理的符号的集合。

数据元素——是数据的基本单位,具有完整确定的实际意义。

数据对象——具有相同性质的数据元素的集合,是数据的一个子集。

数据结构——是相互之间存在一种或多种特定关系的数据元素的集合,表示为:Data_Structure=(D, R)数据类型——是一个值的集合和定义在该值上的一组操作的总称。

抽象数据类型——由用户定义的一个数学模型与定义在该模型上的一组操作,它由基本的数据类型构成。

◆算法算法:是指解题方案的准确而完整的描述。

算法不等于程序,也不等计算机方法,程序的编制不可能优于算法的设计。

算法的基本特征:是一组严谨地定义运算顺序的规则,每一个规则都是有效的,是明确的,此顺序将在有限的次数下终止。

特征包括:(1)可行性;(2)确定性,算法中每一步骤都必须有明确定义,不充许有模棱两可的解释,不允许有多义性;(3)有穷性,算法必须能在有限的时间内做完,即能在执行有限个步骤后终止,包括合理的执行时间的含义;(4)拥有足够的情报。

算法的基本要素:一是对数据对象的运算和操作;二是算法的控制结构。

指令系统:一个计算机系统能执行的所有指令的集合。

基本运算和操作包括:算术运算、逻辑运算、关系运算、数据传输。

算法的控制结构:顺序结构、选择结构、循环结构。

算法基本设计方法:列举法、归纳法、递推、递归、减斗递推技术、回溯法。

算法复杂度:算法时间复杂度和算法空间复杂度。

算法时间复杂度是指执行算法所需要的计算工作量。

算法空间复杂度是指执行这个算法所需要的内存空间。

for ( i = 1 , i < = 10 , i++ ) x=x+c; =>O(1)for ( i = 1 , i < = n , i++ ) x=x+n; =>O(n)多嵌套一个for,则为=>O(n^2) 以此类推真题难点:i = 1,while(i < = n)i = i * 3;=>O(log3^n)i = i * 2;=>O(log2^n) 以此类推数据的逻辑结构有以下两大类:线性结构:有且仅有一个开始结点和一个终端结点,且所有结点都最多只有一个直接前驱和一个直接后继。

考研数据结构学习笔记

考研数据结构学习笔记

考研数据结构学习笔记第一章绪论一、基本问题问答:1、什么叫数据结构?如何理解“数据结构”?如何树立数据结构的学习体系?广义上的数据结构指的是:逻辑结构和物理结构。

狭义上的数据结构专指逻辑结构,就是元素间的逻辑关系,主要类型有:集合型,线性结构,树型,图型!整个数据结构的课程就是围绕着以上几种数据类型展开的,加上基于这些结构的基本操作:插入,删除,查找,取元素,取长度等等。

另外,还有基于这些数据结构的较为复杂的算法:查找和排序。

在严老师和其他很多的数据结构教材中都把查找和排序作为了一个独立的部分,这一部分实际上主要在探讨算法,而不在是结构本身了。

算法的概念将在后面提到。

2、数据的物理结构和逻辑结构定义数据结构,当计算机程序运行时,程序就按照定义给这些数据分配了空间。

而数据定义,是在定义其逻辑结构。

以链表为列,在实际定义时,一个个的结点,由于其指针域可以指向另一个结点,那么依靠这种指向关系,就可在逻辑上建立起一条链状结构!但是,在实际的程序执行时,是不会有这样的一条链的,而是通过在一个结点空间的某个空间内填入了下一个结点的地址!这样的每个有数据和地址的结点,才是其物理结构。

3、算法的概念、分析,算法时间复杂度的含义及分析算法就是解决问题的方法或策略。

一个算法好与坏的评价标准是:正确,可读,健壮,效率高,空间省!设计算法时,应该按照严教材上关于类C(或类P)语言的描述来作,格式为:status fun_name{//算法说明for{ .... };//典型功能及复杂语句后加注释}//fun_name注意写好注释!不求多,但求精!时间复杂度:分析算法效率的重要工具。

主要是靠推算语句执行次频度而得来的。

时间复杂度考查的是“某数量级”的概念,即:T(n)=O(f(n))中,存在正的常数C和n0,使得当n>=n0时,0<=T(N)<=C*F(N)当空间复杂度为O(1)时,称算法为就地工作(原地工作)。

数据结构高分笔记

数据结构高分笔记

数据结构高分笔记
数据结构是计算机科学中非常重要的一个领域,其目的是使计算机能够高效地处理数据。

数据结构包括数据的存储结构和数据之间的关系,其中数据的存储结构是指数据在计算机中的表现形式,而数据之间的关系则是指数据之间的关联和相互作用。

在数据结构中,常见的数据结构包括线性表、栈、队列、树、图等等。

其中,线性表是一种常见的数据结构,它的特点是支持常见的操作,如插入、删除、查找等等。

栈和队列是线性表的特殊形式,它们支持一些特殊的操作,如入栈、出栈、前驱、后继等等。

树和图则是更加复杂的数据结构,它们可以用来表示各种类型的数据,如层次结构、图形等等。

数据结构的学习需要扎实的数学基础和敏锐的逻辑思考能力。

在学习数据结构的过程中,不仅要掌握数据结构和算法的基本概念和原理,还需要熟练掌握一些经典的算法和数据结构,如二叉树、排序算法、哈希表等等。

同时,还需要不断地实践和探索,通过不断地练习和实践,加深对数据结构和算法的理解。

数据结构是计算机科学中非常重要的一个领域,对于从事计算机科学和软件开发等领域的学生和从业者来说,掌握数据结构和算法是非常重要的。

通过不断地学习和实践,才能够更好地理解和应用数据结构和算法,提高编程效率和代码质量。

云南省考研计算机科学与技术复习资料数据结构与算法重点知识点梳理

云南省考研计算机科学与技术复习资料数据结构与算法重点知识点梳理

云南省考研计算机科学与技术复习资料数据结构与算法重点知识点梳理一、数据结构基础知识1. 算法与数据结构的关系- 算法的定义与特性- 数据结构的定义与分类2. 线性表- 线性表的概念- 顺序表与链表的实现与比较- 线性表的应用场景二、树结构1. 树的基本概念- 树的定义与性质- 二叉树的基本概念2. 二叉树的遍历- 前序遍历、中序遍历、后序遍历的定义与实现- 二叉树遍历的应用3. 平衡二叉树- 平衡二叉树的概念与性质- AVL树与红黑树的实现与比较三、图结构1. 图的基本概念- 图的定义与表示方法- 有向图与无向图的区别与应用场景2. 图的遍历- 深度优先遍历与广度优先遍历的实现与比较 - 图的遍历应用举例3. 最短路径算法- Dijkstra算法的原理与实现- Floyd算法的原理与应用四、排序与查找算法1. 排序算法- 冒泡排序、插入排序、选择排序的原理与实现 - 快速排序、归并排序的原理与比较2. 查找算法- 顺序查找、二分查找的原理与实现 - 散列查找的概念与应用场景五、高级数据结构1. 堆与优先队列- 堆的定义与性质- 优先队列的实现与应用举例2. 并查集- 并查集的基本操作与实现- 并查集的应用场景3. 字典树- 字典树的原理与实现- 字典树的应用举例六、动态规划1. 动态规划的基本概念- 状态、状态转移方程的定义- 最优子结构与重叠子问题的性质2. 动态规划算法的实现步骤- 划分阶段、确定状态、状态转移方程的推导3. 动态规划的应用举例- 背包问题、最长公共子序列等七、算法复杂度分析1. 算法时间复杂度的概念与计算- 大O表示法的介绍与使用2. 算法空间复杂度的概念与计算- 内存占用量的估算方法3. 算法复杂度的性能比较与选择- 最优算法的选择原则与实例八、应试技巧与备考建议1. 考研数据结构与算法的特点与重要性2. 复习方法与备考策略3. 常见考点与解题技巧的总结以上是云南省考研计算机科学与技术复习资料中数据结构与算法的重点知识点梳理,希望对你的复习有所帮助。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第一章绪论作者的话:大部分同学在学习数据结构时,想必对数据结构课本里的伪代码多多少少有点不是很清楚,特别是自己在动手编写算法的时候,明明知道算法的思路,但是编写出来的程序就是不标准,可能在考试的时候就会吃大亏。

所以在开始数据结构的旅程之前,我觉得有必要将一些基本功提前告知你们,掌握了这些东西,在本章以后的章节中,才能以此为基础来修炼更高深的武功。

本章概略▲针对考研数据结构的C&C++语言基础以及代码书写规范对于考研数据结构,需要C与C++语言作为基础,但是又不需要太多,因此此处讲解有针对性。

现在我们面临的是研究生考试,要在答题纸上写代码,代码的评判者是阅卷老师,而不是TC,VC6.0等编译器。

如果之前你只熟悉在这些编译器下写代码,那你要看看这一部分,这里教你怎么快速的写出能让阅卷老师满意的代码。

▲算法的时间复杂度分析基础为什么要特别注重这一块的讲解?在09年批阅数据结构算法那道题的时候,由于当时阅卷的标准答案是教育部给出的,并且明确说明以此为标准答案,但是教育部给出的算法时间复杂度太大,对于算法有研究的同学,可以很轻松的写出一个算法,并且时间复杂度远远小于标准答案。

教育部就是权威,没有办法,只能按照教育部的答案改,这样就导致了算法牛人写出更完美的算法,却得了最低的分。

也许是为了避免这种不公平的再次出现,10年的考试要求终于改了,考生必须对自己写的算法给出时间复杂度和空间复杂度,并以此来作为评分的依据。

所以这已经成为数据结构45分里面的必考内容,这一点的考察在图、排序、查找这三章内体现的尤为明显,因此我会在本章先总体讲一下算法时间复杂度分析的基本方法,并在以后章节中以题目的形式讲一些具体分析思路,这样考生逐渐的就会掌握考研要求的算法复杂度分析方法。

▲数据结构和算法的基本概念这一部分介绍一些贯穿于整本书的基本概念。

1.1针对考研数据结构的代码书写规范以及C&C++语言基础1.1.1考研综合应用题中算法设计部分的代码书写规范要在答题纸上快速的写出能让阅卷老师满意的代码,是有些技巧的,这与写出能在编译器上编译通过的代码有所不同。

为了说明这一点我们首先看一个例题:设将n(n>1)个整数存放到一维数组R中。

设计一个算法,将R中的序列循环左移P(0<P<n)个位置,即将R中的数据由{X0,X1......X n-1}变换为{X p,X p-1,......,X n-1,X0,X1...X p-1}。

要求:写出本题的算法描述。

分析:本题不难,要实现R中序列循环左移P个位置,只需先将R中前P个元素逆置,再将剩下的元素逆置,最后将R中所有的元素再整体做一次逆置操作即可。

本题算法描述如下:#include<iostream>//1#define N50//2using namespace std;//3void Reverse(int R[],int l,int r)//4{//5int i,j;//6int temp;//7for(i=l,j=r;i<j;i++,j--)//8{//9temp=R[i];//10R[i]=R[j];//11R[j]=temp;//12}//13}//14void RCR(int R[],int n,int p)//15{//16if(p<=0||p>=n)//17cout<<"ERROR"<<endl;//18else//19{//20Reverse(R,0,p-1);//21Reverse(R,p,n-1);//22Reverse(R,0,n-1);//23}//24}//25int main()//26{//27int L,i;//28int R[N],n;//29cin>>L;//30cin>>n;//31for(i=0;i<=n-1;i++)//32cin>>R[i];//33RCR(R,n,L);//34for(i=0;i<=n-1;i++)//35cout<<R[i]<<"";//36cout<<endl;//37return0;//38}//39以上程序段,是一段完整的可以在编译器下编译运行的程序,程序比较长,对于考试答卷,完全没有必要这么写。

第1和3句,在我们大学里写的程序中,几乎都要用到,是耳熟能详的,研究生考试这种选拔考试不会用这种东西来区分学生的优劣,因此答题过程中没必要写,去掉。

第2句,定义了一个常量,如果你的题目中要用一个常量,在你用到的地方加上一句注释,说明某某常量之前已经定义即可。

而没必要再跑到前边去补上一句#define XX XX,因为试卷的答题纸,不是编译器,插入语句不是那么方便,为了考试的时候节省时间且使得试卷整洁,这是最好的解决办法,因此第2句去掉。

第26到第39是主函数部分,你之前声明的函数(第4到第25句)在这里调用。

在答题中,我们只需要写出自己的函数说明(4到25句),写清楚函数的接口(何为接口,下边会细致讲解)即可,答卷老师就知道你已经做好了可以解决这个题目的工具(即函数)并且说明了工具的使用方法(即函数接口),这样别人就会用这个工具来解决问题,而没必要你把它用给别人看(主函数中的调用,就是用这个函数解决问题的过程),因此第26到第39句可以去掉。

经过以上删减,就是以下程序段了,看着是不是简洁了很多?void Reverse(int R[],int l,int r)//1{//2int i,j;//3int temp;//4for(i=l,j=r;i<j;i++,j--)//5{//6temp=R[i];//7R[i]=R[j];//8R[j]=temp;//9}//10}//11void RCR(int R[],int n,int p)//12{//13if(p<=0||p>=n)//14cout<<"ERROR"<<endl;//15else//16{//17Reverse(R,0,p-1);//18Reverse(R,p,n-1);//19Reverse(R,0,n-1);//20}//21}//22这里来说一下函数的接口。

假如上述函数是一台机器,可以用原材料来加工成成品。

那么接口就可以理解成原材料的入口,或成品的出口。

比如上述成序语段的第12句:RCR(intR[],int n,int p)就包含一个接口,它是原材料的一个入口。

括号里所描述的就是原材料类型以及名称,是将来函数被调用的时候所要放进去的东西;是在告诉别人,我要三个原材料,第一个是个int型的数组;第二个是一个int型的变量;第三个也是一个int型的变量。

第15句,cout<<"ERROR"<<endl;也是一个接口,它会在输出设备上打印出一个ERROR,用来提示用户这里出错了,这算是成品的出口,这里的成品就是一个提示。

同时,第1句中传入int型数组的地方也可以理解为一个产品的出口,因为从这里传入的数组的内容,将在函数执行完后被加工成我们想要的内容。

通过以上说明我们可以把接口理解为用户和函数打交道的地方,通过接口,用户输入了自己的数据,得到了自己想要的结果。

到这里我们可以知道考研综合应用中算法设计题中的代码部分重点需要写哪些内容了,即只需写出一个或多个可以解决问题的有着清楚接口描述的函数即可。

1.1.2考研中的C&C++语言基础杂谈之所以这个标题是C&C++语言,而不是单一的一种,是因为本书有些程序的书写包含了两者的语法。

对于考试答题来说,C++不因为它是C语言的升级版就能取代C。

C和C++是各有所长的,我们从两者中挑选出来对考研答卷有利的部分,组合起来应用。

下边就来具体介绍针对考研数据结构的C和C++语言基础。

1.数据类型对于基本的数据类型,例如:整型int,long,……(考研中涉及到处理整数的题目如果没有特别要求用int足够了),字符型char,浮点型float,double……(对于处理小数的问题,题目没有特殊要求的请况下用float就足够了)。

这些大家大都了解,就不再具体讲解,这里主要讲解的是结构型和指针型。

所谓结构型,说的通俗点就是用户自己制作的数据类型。

其实我们常用的数组也是用户自己制作的数据类型,数组是多个相同数据类型的变量组合起来的,比如下边这句int a[MAX];//MAX是已经定义的常量就定义了一个数组,名字为a。

其实就是连续申请了MAX个整型变量摆在一起,其中各整型变量之间的位置关系通过数组下标来反映,这不难理解。

如果我想制作一个这样的数组,第一个变量是整形变量,第二个变量是字符型变量,第三个变量是浮点型变量,怎么办呢?这里就用到结构体了,结构体就是系统提供给程序员制作新的数据类型的一种机制,即可以用系统已经有的不同的基本数据类型或用户定义的结构型,组合成用户需要的复杂数据类型。

比如上边提到的要制作一个由不同类型的变量组成的数组可以这么构造:typedef struct{int a;char b;float c;}TypeA;上边的语句制造了一个新的数据类型,TypeA型。

int b[3];申请了一个数组,名字为b,由3个整形的分量组成。

而TypeA a;同样可以认为申请了一个数组,名为a,只不过组成a数组的3个分量是不同类型的。

对于数组b,b[0],b[1],b[2]分别代表数组中第一,第二,第三个元素的值。

而对于结构体a,a.a,a.b,a.c分别对应于结构体变量a中第一,第二,第三个元素的值,两者十分相似。

再看这样一个定义TypeA a[3];这句定义了一个数组,由三个TypeA型的元素组成。

前边我们知道TypeA是结构型,它含有3个分量(其实应该叫做结构体的成员,这里为了类比,将它叫做分量),因此a数组中的每个元素都是结构型且每个元素都有3个分量,它可以类比为哪一种数组呢?显然我们可以把它类比成一个二维数组,比如int b[3][3];定义了一个名字为b的二维数组。

二维数组可以看成其数组元素是一维数组的一维数组,如果把b看成一个一维数组的话,其中的每个数组元素都有3个分量,与a数组不同的地方在于,b中每个元素的3个分量是相同类型的,而a数组中每个元素的三个分量是不同数据类型的。

b数组取第一个元素的第一个分量的值的写法为b[0][0],对应到a数组则为a[0].a。

上边的类比关系可以通过图 1.1来形象的说明。

图 1.1结构体与数组的类比指针型和结构型一样,是比较难理解的部分。

相关文档
最新文档