数据结构(C语言)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2、transpose算法:考虑到b.data中的行就是a.data中的列,要想得到b.data中行号为0的三元组元素,可对a.data扫描一遍,找出a.data中列号为0的元素,为后再找列号为其它的元素。
广义表
由一个大的表像数组中一样存储元素,但内部的元素可以使结构不一样的,或者是所谓的子广义表。(树和有向图也可以用广义表来表示)

树的存储结构:
1、双亲表示法(用一组连续的存储空间(一维数组)存储树中的各个结点,数组中的一个元素表示树中的一个结点,数组元素为结构体类型,其中包括结点本身的信息以及结点的双亲结点在数组中的序号,但是这样并不能反映出孩子结点之间的兄弟关系来,所以,得利用一些手法来区别兄弟,可在结点结构中增设存放第一个孩子的域和存放第一个右兄弟的域,就能较方便地实现上述操作了,在实际存储的时候,第一列是序号,第二列是数据的具体内容,第三列则是通过固定的数字关系来反映这是第几代父母,第一代也就是根结点,其为-1,一下慢慢变大。这种存储方法比较适应存储数据和查找父结点。)
队列也是一种特殊的线性表。它所有的插入操作均限定在表的一端进行,而所有的删除操作则限定在表的另一端进行。允许删除元素的一端称为队头,允许插入元素的一端称为队尾,删除元素称为出队,插入元素称为进队。(假如是一个循环队列是会出现队满和队空的情况)
队列的顺序存储结构:利用连续的存储单元存储队列。
队列的链式存储结构:利用地址对队列中的数据进行连接,但存储的数据不一定连续。
数据组织(数据、数据元素、数据项)的三个层次:数据可由若干个数据元素构成,而数据元素又可以由一个或若干个数据项组成。
四种基本的数据结构:集合、线性结构、树形结构、图状结构。
顺序存储的特点是在内存中开辟一组连续的空间来存放数据,数据元素之间的逻辑关系通过元素在内存中存放的相对位置来确定。
链式存储的特点是通过指针反映数据元素之间的逻辑关系。
2、孩子表示法:分为多重链表法和孩子链表表示法。(比较适宜孩子操作多的应用。)
多重链表法(可以令每个结点包括一个结点信息域(即数据)与多个指针域,每个指针域指向该结点的一个孩子结点,通过各个指针域值反映出树中各结点之间的逻辑关系,具体指针域的多少视具体的数组决定,主要是看最多有几个孩子结点。)
孩子链表表示法(其主体是一个与结点个数一样大小的一维数组,数组的每一个元素由两个域组成,一个域用来存放结点信息,另一个用来存放指针,该指针指向由该结点孩子组成的单链表的首位置。单链表的结构也由两个域组成,一个存放孩子结点在一维数组中的序号,另一个是指针域,指向下一个孩子。也就是第一列存放序号,这些序号是对各个数据的编号以在指针中比较容易表示,第二列是数据的具体信息,第三列是指向其下的孩子结点,兄弟关系则是按照从左到右顺序来排的。)
其存储方式一般为链式存储结构,因为其大小不定。
递归
若一个对象部分地包含它自己,或用它自己给自己定义,则称这个对象是递归的;若一个过程直接或间接地调用自己,则称这个过程为递归的过程。如阶乘(定义)、单链表(数据结构)、汉诺塔(过程)。
在递归程序的运行过程中,系统内部设立了一个栈(也就是分配存储空间),用于存放每次函数调用与返回所需的各种数据,主要包括:函数调用执行完成时的返回地址、函数的返回值、每次函数调用的实在参数和局部变量。
图的存储结构
在一个图的信息中,有两个信息需要存储,即图中顶点的信息以及描述顶点之间的关系——边或者弧的信息。
存储方式:
1、邻接矩阵的存储结构,就是用一个一维数组存储图中顶点的信息,用矩阵表示图中各顶点之间的邻接关系。(去年学的用矩阵表示各顶点之间的关系。)
2、邻接链表的存储结构是图的一种顺序存储与链式存储结合的存储方法。一种是顶点表的节点结构,它由顶点域和指向第一条邻接边表头指针构成,另一种是边表结点,它由邻接点域和指向下一条邻接边的指针域构成。(注:对于网图的边表需再增设一个存储边上信息(如权值等)的域。)
队列最典型的一个实例就是计算机CPU的分时系统。
其它线性数据结构
串(串一般不作删除和插入的操作,所以一般都是用顺序存储结构的)
串是字符串的简称,串是一种在数据元素的组成上具有一定约束条件的线性表,即要求组成线性表的所有数据元素都是字符,串即是由零个或多个字符组成的有限序列。
串的顺序存储包括顺序定长存储和堆分配存储。
图的遍历
图的遍历是指从图中的任一顶点出发,对图中的所有顶点访问一次且只访问一次。有两种方式:深度优先搜索和广度优先搜索。
深度优先搜索(类似于树的先根遍历):假设初始状态是图中所有顶点未曾被访问,则深度优先搜索可从图中某个顶点v出发,访问此顶点,然后依次从v的未被访问的邻接点出发深度优先遍历图,直至图中所有和v有路径相通的顶点都被访问到;若此时图中尚有顶点未被访问,则另选图中一个未被访问的顶点作起始点,重复上述过程,直至图中所有顶点都盖被访问到为止。
weight:结点的权值;
lchild:结点的左孩子结点在数组中的序号;
rchild:结点的右孩子结点在数组中的序号;
parent:结点的父结点在数组中的序号。
注:哈夫曼树(具有最小带权路径长度的二叉树)。

图式由非空的顶点的集合和一个描述顶点之间关系——边(或者弧)的集合组成。(即以前在离散函数中学的那些图的知识。),包括有向图与无向图。
串的顺序存储:用一组地址连续的存储单元存储串的字符序列。
堆分配存储:仍以一组地址连续的存储单元存放串的字符队列,但其存储空间是在算法执行过程中动态分配得到的。
多维数组(数组一般不作删除和插入的操作,所以一般都是用顺序存储结构的)
二维数组的向量存储结构(顺序),行列的存储规则:一、先行后列,也就是先把第一行存储完,再存储第二行,就是实现二维数组的存储;二、先列后行,与上面的相类似。
4、孩子兄弟表示法(在树中,每个结点除其信息域外,再增加两个分别指向该结点的第一个孩子结点和下一个兄弟结点的指针。其链式结构的一个个体中第一个地方的是指针域,指向第一个孩子结点,第二个是信息域(即数据),第三个是指针域,指向下一个兄弟结点。)
二叉树的存储:顺序存储结构、链式存储结构。
1、顺序存储结构:用一组连续的单元存放二叉树中的结点。一般是按照二叉树结点从上至下、从左到右的顺序存储。这样结点在存储位置上的前驱后继关系并不一定就是它们在逻辑上的邻接关系,只有通过一些方法确定某结点在逻辑上的前驱结点和后继结点,这种存储才有意义。完全二叉树和满二叉树采用顺序存储比较合适,一般二叉树不适宜用这种存储方法。
遍历二叉树
遍历二叉树:按照某种顺序访问二叉树中的每个结点,使每个结点被访问一次且仅被访问一次。
遍历方式:先序遍历(先遍历根结点,再遍历根结点的左子树,左后遍历根结点的右子树)、中序遍历(先遍历根结点的左子树,再遍历根结点,最后遍历根结点的右子树)、后序遍历(先遍历根结点的左子树,再遍历根结点的右子树,左后遍历根结点)、层次遍历(从二叉树的第一层(根结点)开始,从上至下逐层遍历,在同一层中,则按从左到右的顺序对结点逐个访问。)(注:上述的先,中,后序遍历是一个递归概念,在一个树中的递归概念,实际操作时要注意在每个树的节点上推广这几个概念才能得到正确的答案。
数据类型:原子类型、结构类型。
线性表
定义:线性表是n个数据元素的有限序列。
线性表的顺序存储结构:表中相邻的元素a和b所对应的存储地址A和B也是相邻的。(也就是数据都是按照表中情况进行连续存储的情况)
线性表的链式存储结构:该线性表中的数据元素可以用任意的存储单元来存储。表中的各个相邻的数据(元素)是通过一个指针地址来进行链接的,以找到下一个数据(元素)在哪。其形式一般为:数据 地址
生成树(如有向连通图和无向连通图)略
AOV网
AOV网:所有的工程或者某种流程可以分为若干个小的工程或阶段,这些小的工程或阶段称为活动。若以图中的顶点来表示活动,有向边表示活动之间的优先关系,则这样的活动在顶点上的有向图称为AOV网。
2、链式存储结构:
一、二叉链表中每个结点由三个域组成,除了数据域外,还有两个指针域,分别用来给出该结点左孩子和右孩子所在的链接点的存储地址。结点的存储的结构为:左孩子的指针 数据的具体内容 右孩子的指针 ;
二、三叉链表中每个结点由四个域组成,只是在上述结构的基础上,在第四个的结构上有了指出其父结点地址的指针。
广度优先搜索遍历:假设从图中顶点v出发,在访问了v之后依次访问v的各个未曾访问过的邻接点,然后分别从这些邻接点出发依次访问它们的邻接点,并使“先被访问的顶点的邻接点”先于“后被访问的顶点的邻接点”被访问,直至图中所有已被访问的顶点的邻接点都被访问到。若此时图中尚有顶点未被访问,则另选图中一个未曾访问的顶点作起始点,重复上述过程,直至图中所有顶点都被访问到为止。
二叉树与树、森林之间的转换
一棵树转换为二叉树的方法:
1、树中所有相邻兄弟之间加一条连线;
2、对树中的每个结点,只保留它与第一个孩子结点之间的连线,删去它与其他孩子结点之间的连线;
3、以树的根结点为轴心,将整棵树顺时针转动一定的角度,使之结构层次分明。
森林转换为二叉树的方法:
1、将森林中的每棵树转换成相应的二叉树;
2、第一棵二叉树不动,从第二棵二叉树开始,依次把后一棵二叉树的根结点作为前一棵二叉树根结点的右孩子,当所有的二叉树连起来后,此时所得到的二叉树就是由森林转换得到的二叉树。
二叉树转换为森林和树,其方法正好是与上述的方法相反,也就是逆过程。
哈夫曼树的结构形式:weight lchild rchild pare相同,但规模较小的子问题,并建立原问题与子问题解之间的递推关系,不断修改这些变量的值,使之成为更大子问题的解的过程;当得到原问题解时,递推过程便可结束了。
复杂递归问题在求解的过程中无法保证求解动作一直向前,往往需要设置一些回溯点,当求解无法进行下去或当前处理的工作已经完成时,必须退回到所设置的回溯点,继续问题的求解。故此时使用非递归程序的算法时需经常使用栈来记录和管理所设置的回溯点。
栈和队列
栈是限定在表的同一端进行插入或删除操作的线性表,即进栈、出栈。(特殊的线性表)
栈的顺序存储结构:利用一组地址连续的存储单元依次从栈底到栈顶存放数据元素,栈底位置固定不变,可将栈底设在向量低下标的一端。
栈的链式存储结构:用单链表作为存储结构的栈称为链栈,链表的最后一个结点表示栈底,第一个结点表示栈顶。
稀疏矩阵的压缩存储:稀疏矩阵的压缩就是只对元素中非零的元素进行存储,也就达到压缩的目的了。每一个非零元素可以用一个三元组来唯一确定,其中,a,b是非零元素在矩阵中对应的行号和列号,c是非零元素的值。
稀疏矩阵的转置算法(将行编成列,列变成行):
1、一般插入算法:对a.data扫描一遍,扫描过程中依次取出a.data中的每一个三元组元素,将对应的行号和列号对换,放入另一个准备替换a.data的b.data的数组中,放在其对应的位置上。为保证b.data具有三元组存放元素的规律,需在放入前和前面的元素按行及列比较,插在对应位置上。
3、双亲孩子表示法(其仍将各结点的孩子结点分别组成单链表,同时用一维数组顺序存储树中的各结点,数组元素除了包括结点本身的信息和该结点的孩子结点链表的头指针之外,还增设一个域,存储该结点双亲结点在数组中的序号。该方法与上述的孩子链表表示法相类似,只不过多了一个在第三列之前有一个表示父结点的序号,与开始的双亲表示法的父结点的序号表示相类似。)
线性表的顺序和链式存储结构的比较:在线性表的长度变化比较大,预先难以确定的情况下,最好采用动态链表作为存储结构。当线性表的长度变化不大时,采用顺序存储结构比较节省存储空间。在顺序表结构的线性表上主要进行查找、读取而很少做插入和删除的操作。链式结构的线性表中比较适应做插入和删除的操作。
一元多项式的加减法运算可先将一元多项式进行了改变存储之后再进行运算比较适宜,将一元多项式转换为用在内存中的前一项表示阶数,后一项表示对应该阶数的系数。然后利用这种形式进行加减运算。
相关文档
最新文档