数据结构C语言版期末复习汇总.doc
数据结构(C语言版) 期末复习汇总第一章 绪论数据结构是一门研究非数值计算程序设计中的操作对象,以及这些对象之间的关系和操作的学科。数据结构是一门综合性的专业课程,是一门介于数学、计算机硬件、计算机软件之间的一门核心课程。是设计和实现编译系统、操作系统、数据库系统及其他系统程序和大型应用程序的基础。数据是客观事物的符号表示,是所有能输入到计算机中并被计算机程序处理的符号的总称。如数学计算中用到的整数和实数,文本编辑中用到的字符串,多媒体程序处理的图形、图像、声音及动画等通过特殊编码定义后的数据。数据的逻辑结构划分线、树、图算法的定义及特性算法是为了解决某类问题而规定的一个有限长的操作序列。五个特性有穷性、确定性、可行性、输入、输出评价算法优劣的基本标准(4个)正确性、可读性、健壮性、高效性及低存储量第二章 线性表线性表的定义和特点线性表由nn0个数据特性相同的元素构成的有限序列。线性表中元素个数nn0定义为线性表的长度,n0时称为空表。非空线性表或线性结构,其特点(1)存在唯一的一个被称作“第一个”的数据元素;(2)存在唯一的一个被称作“最有一个”的数据元素;(3)除第一个之外,结构中的每个数据元素均只有一个前驱;(4)除最后一个之外,结构中的每个数据元素均只有一个后继。顺序表的插入n个元素在i位插入,应移动(n-i1)位元素。顺序表存储结构的优缺点优点逻辑相邻,物理相邻;可随机存取任一元素;存储空间使用紧凑;缺点插入、删除操作需要移动大量的元素;预先分配空间需按最大空间分配,利用不充分;表容量难以扩充;线性表的应用一般线性表的合并算法2.1LA7,5,3,11 LB2,6,3合并后 LA7,5,3,11,2,6算法思想扩大线性表LA,将存在于线性表LB中而不存在于线性表LA中的数据元素插入到线性表LA中去。只要从线性表LB中依次取得每个数据元素,并依值在线性表LA中进行查访,若不存在,则插入之。有序表的合并算法2.2LA3,5,8,11 LB2,6,8,9,11,15,20则 LC2,3,5,6,8,9,11,11,15,20算法思想首先创建一个空表LC,通过比较指针pa和pb所指向的元素的值,依次从LA或LB中“摘取”元素值较小的结点插入到LC表的最后,当其中一个表变空是,说明此表的元素已归并完,则只要将另一个非空表的剩余结点依次插入在LC表的最后即可。线性链表线性链表的插入插入元素师,指针的指向变化上述指针修改用语句描述即为s-nextp-next; p-nexts;单链表的插入void insertnodelinklist head,datetype x,int i listnode * p,*q; pgetnodehead,i-1; ifpNULL errorposition error; qlistnode * mallocsizeoflistnode; qdatax; qnextpnext; pnextq; 课本中snew LNode;s-data e;s-nextp-next;p-nexts;线性链表的删除删除元素,指针的指向变化上述指针修改用语句描述即为p-nextp-next-next;单链表的删除void deletelistlinklist head, int i listnode * p, *r; pgetnodehead,i-1; ifp NULL pnext NULL return ERROR; rpnext; pnextrnext; free r ; 课本中qp-next;p-nextq-next;单链表特点它是一种动态结构,整个存储空间为多个链表共用;不需预先分配空间;指针占用额外存储空间;不能随机存取,查找速度慢。第三章 栈和队列栈的类型定义栈Stack是限制在表的一端进行插入和删除运算的线性表,通常称插入、删除的这一端为栈顶Top,另一端为栈底Bottom。当表中没有元素时称为空栈。假设栈Sa1,a2,a3,an,则a1称为栈底元素,an为栈顶元素。栈中元素按a1,a2,a3,an的次序进栈,退栈的第一个元素应为栈顶元素。即,栈的修改是按后进先出的原则进行的。因此,栈称为后进先出表(LIFO)。栈的进栈、出栈顺序例对于一个栈,给出输入项A、B、C,如果输入项序列由ABC组成,试给出所有可能的输出序列。 A进 A出 B进 B出 C进 C出 ABC A进 A出 B进 C进 C出 B出 ACB A进 B进 B出 A出 C进 C出 BAC A进 B进 B出 C进 C出 A出 BCA A进 B进 C进 C出 B出 A出 CBA不可能产生输出序列CAB栈的应用数值转换大题算法思想首先将按照上述计算过程中得到的八进制树的各位依次进栈,然后将栈中的八进制数依次出栈输出,输出结果就是该是十进制数转换得到的八进制数。NN div dd N mod d (其中div 为整除运算,mod 为求余运算)例如 13481025048,其运算过程如下N N div 8 N mod 81348 168 4168 21 021 2 52 0 2算法【此为课件算法同课本算法一致】 void conversion initstack s ;构造空栈 scanf “ ” , n; while n push s , n 8 ; n n / 8; while Stackempty s 当栈非空时 pop s , e ; printf “ d ” , e ; conversion队列的类型定义定义队列是限定只能在表的一端进行插入,在表的另一端进行删除的线性表队尾rear允许插入的一端队头front允许删除的一端队列特点先进先出 FIFO 第四章 串、数组和广义表串的类型定义串是字符串的简称。它是一种在数据元素的组成上具有一定约束条件的线性表,即要求组成线性表的所有数据元素都是字符,所以,人们经常又这样定义串串是一个有穷字符序列。串一般记作 s “a1a2.an” n0 其中,s是串的名称,用双引号(“”)括起来的字符序列是串的值;ai可以是字母、数字或其他字符;串中字符的数目n被称作串的长度。当n0时,串中没有任何字符,其串的长度为0,通常被称为空串。子串、主串串中任意连续的字符组成的子序列被称为该串的子串。包含子串的串又被称为该子串的主串。广义表的定义广义表是nn0个元素a1,a2,a3an的有限序列,其中ai或者是原子项,或者是一个广义表。通常记作LS(a1,a2,a3an。LS是广义表的名字,n为它的长度。若ai是广义表,则称它为LS的子表。广义表的结构特点1 广义表的元素可以是子表,而子表的元素还可以是子表广义表是一个多层次的结构2 广义表可为其他广义表所共享3 广义表可以是一个递归的表,即广义表也可以是其本身的一个子表广义表的两个重要运算取表头GetHeadLS,取表尾GetTailLS任何一个非空广义表 LS a1, a2, , an 均可分解为 表头 HeadLS a1 和 表尾 TailLS a2, , an 两部分。例如已知广义表LS(a,(b,c,d),c),运用GetHead和GetTail函数取出原子d的运算过程为GetHeadGetTailGetTailGetHeadGetTailLS第五章 树和二叉树数的定义 树tree是nn0个结点的有限集T,其中有且仅有一个特定的结点,称为树的根root;当n1时,其余结点可分为mm0个互不相交的有限集T1,T2,Tm,其中每一个集合本身又是一棵树,称为根的子树subtree。特点树中至少有一个结点根树中各子树是互不相交的集合线性结构与树形结构的区别线性结构树形结构第一个数据元素(无前驱) 根结点 (无前驱)最后一个数据元素(无后继) 多个叶子结点(无后继)其它数据元素(一个前驱,一个后继)其它数据元素(一个前驱、多个后继)树的基本术语结点node 表示树中的元素,包括数据元素及若干指向其子树的分支结点的度degree 结点拥有的子树数树的度 一棵树中最大的结点度数叶子leaf 度为0的结点(终端结点)孩子child 结点子树的根称为该结点的双亲parents 孩子结点的上层结点叫该结点的兄弟sibling 同一双亲的孩子子孙 以某结点为根的子树中的所有结点都被称为是该结点的祖先 从根结点到该结点路径上的所有结点堂兄弟 双亲在同一层的结点互为结点的层次level 从根结点算起,根为第一层,它的孩子为第二层深度depth 树中结点的最大层次数森林forest mm0棵互不相交的树的集合有序树、无序树 如果树中每棵子树从左向右的排列拥有一定的顺序,不得互换,则称为有序树,否则称为无序树对于课本P96树形图结点A的度3结点B的度2结点M的度0结点A的层次1结点M的层次4结点B,C,D为兄弟结点K,L为兄弟叶子K,L,F,G,M,I,J结点A的孩子B,C,D结点B的孩子E,F结点I的双亲D结点L的双亲E结点F,G为堂兄弟结点A是结点F,G的祖先树的深度4树的度3二叉树的定义二叉树是nn0个结点的有限集,它或为空树n0,或由一个根结点和两棵分别称为左子树和右子树的互不相交的二叉树构成。特点每个结点至多有二棵子树即不存在度大于2的结点;二叉树的子树有左、右之分,且其次序不能任意颠倒。二叉树的性质性质1在二叉树的第i层上最多有2i-1个结点(i1);性质2深度为K的二叉树最多有2K-1个结点 (K1);性质3 对任何一棵二叉树T,如果其终端结点数为n0,度为2的结点数为n2,则n0n21;完全二叉树定义一棵深度为h,具有n个结点的二叉树,若将它与一棵同深度的满二叉树中的所有结点按从上到下,从左到右的顺序分别进行编号,且该二叉树中的每个结点分别与满二叉树中编号为1n的结点位置一一对应,则称这棵二叉树为完全二叉树。特点叶子结点只可能在层次最大的两层上出现;对任一结点,若其右分支下子孙的最大层次为L,则其左分支下子孙的最大层次必为L或L1。性质4具有n个结点的完全二叉树的深度为log2n1。(其中,log2n 的结果是不大于log2n的最大整数。)性质5对于有n个结点的完全二叉树中的所有结点按从上到下,从左到右的顺序进行编号,则对任意一个结点i (1in),都有(1)如果i1,则结点i是这棵完全二叉树的根,没有双亲。否则其双亲结点的编号为 i/2;(2)如果2in,则结点i没有左孩子。否则其左孩子结点的编号为2i;(3)如果2i1n,则结点i没有右孩子。否则其右孩子结点的编号为2i1。 遍历二叉树先序遍历先访问根结点,然后分别先序遍历左子树、右子树【包络法】中序遍历先中序遍历左子树,然后访问根结点,最后中序遍历右子树【垂直映射法】后序遍历先后序遍历左、右子树,然后访问根结点例(1)先序遍历A.B.D.E.F.G.K.M.C.H.J 中序遍历D.B.F.E.K.A.M.G.H.C.J P105 贴纸(1)后序遍历D.F.K.M.A.E.B.H.J.C.G层次遍历A.B.C.D.E.H.J.F.G.K.M例(2)先序遍历A.B.E.F.I.G.C.D.H.J.K.L.N.O.M后序遍历E.I.F.G.B.C.J.K.N.O.L.M.H.D.A P105贴纸(2)层次遍历A.B.C.D.E.F.G.H.I.J.K.L.M.N.O赫夫曼树遍历例W 5,29,7,8,14,23,3,11 第六章 图图的定义图Graph图G是由两个集合VG和EG组成的,记为GV,E其中VG是顶点的非空有限集;EG是边的有限集合,边是顶点的无序对或有序对。有向图,无向图顶点的度无向图中,顶点的度为与每个顶点相连的边数;有向图中,顶点的度分成入度与出度入度以该顶点为头的弧的数目出度以该顶点为尾的弧的数目路径路径是顶点的序列VVi0,Vi1,Vin,满足Vij-1,Vij E 或 Vij-1,VijE,1jn路径长度沿路径边的数目或沿路径各边权值之和回路第一个顶点和最后一个顶点相同的路径叫简单路径序列中顶点不重复出现的路径叫简单回路除了第一个顶点和最后一个顶点外,其余顶点不重复出现的回路叫连通从顶点V到顶点W有一条路径,则说V和W是连通的连通图图中任意两个顶点都是连通的叫连通分量非连通图的每一个连通部分叫强连通图有向图中,如果对每一对Vi,VjV, ViVj,从Vi到Vj 和从Vj到 Vi都存在路径,则称G是邻接表深度遍历方法从图的某一顶点V0出发,访问此顶点;然后依次从V0的未被访问的邻接点出发,深度优先遍历图,直至图中所有和V0相通的顶点都被访问到;若此时图中尚有顶点未被访问,则另选图中一个未被访问的顶点作起点,重复上述过程,直至图中所有顶点都被访问为止。 图一 图二 图三 图四必须说明,若不给定存储结构,深度优先遍历的结果不唯一。因为哪个顶点是第一邻接点未确定。给定存储结构后,深度优先遍历的结果是唯一的。 广度遍历【不考,比较深度遍历记忆】方法从图的某一顶点V0出发,访问此顶点后,依次访问V0的各个未曾访问过的邻接点;然后分别从这些邻接点出发,广度优先遍历图,直至图中所有已被访问的顶点的邻接点都被访问到;若此时图中尚有顶点未被访问,则另选图中一个未被访问的顶点作起点,重复上述过程,直至图中所有顶点都被访问为止。图一中广度遍历V1 V2 V3 V4 V5 V6 V7 V8第七章 查找折半查找法(考图形过程) (1)有序表 5,16,20,27,30,36,44,55,60,67,71课本P167,例7.1 P168 图7.1(2)折半查找过程示例有序表5,13,19,21,37,56,64,75,80,88,92第八章 排序 冒泡排序排序过程将第一个记录的关键字与第二个记录的关键字进行比较,若为逆序r1.keyr2.key,则交换;然后比较第二个记录与第三个记录;依次类推,直至第n-1个记录和第n个记录比较为止第一趟冒泡排序,结果关键字最大的记录被安置在最后一个记录上对前n-1个记录进行第二趟冒泡排序,结果使关键字次大的记录被安置在第n-1个记录位置重复上述过程,直到“在一趟排序过程中没有进行过交换记录的操作”为止。课件上的算法void BubbleSortint a, int n int i, j, exchange; int tmp; for i 0; i n-1; iexchange0; for j n-1; ji; j 比较,找出最小关键字的记录 if aj aj -1 tmp aj; aj与aj-1进行交换,将最小关键字记录前移 aj aj - 1; aj -1 tmp; exchange1; if exchange0 本趟未发生交换时结束算法 return;课本上的伪码算法void BubbleSortSqList flag1;whilem0flag1flag0;flag置为0,如果本趟排序没有发生交换,则不会执行下一趟排序forj1;jm;j ifL.rj.keyL.rj1.keyflag1;flag置为1,表示本趟排序发生了交换tL.rj;L.rjL.rj1;L.rj1t;交换前后两个记录ifm;whileBubbleSortC语言冒泡排序法includestdio.hvoid mainint i,j,m, a10;printf用冒泡排序法对a数组10个数组元素从小到大进行排序。n;printfEnter the numbersn;fori0;i10;iscanfd,fori0;i9;iforj0;j10-i;jifaj1ajmaj;ajaj1;aj1m;fori0;i10;iprintf5d,ai;13