数据结构n学习.pptx
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《数据结构n学习.pptx》由会员分享,可在线阅读,更多相关《数据结构n学习.pptx(112页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、2.1 2.1 数据结构概述逻辑结构(逻辑结构(4 4种)种)集合结构集合结构、线性结构线性结构(1(1对对1)1)、树型结构、树型结构(1(1对多对多)、图、图/网结构网结构(多对多多对多)存储结构(4种)顺序(连续存储单元)、链接(用指针链接元素)、索引(包含索引表和子表)、散列存储(由散列函数得存储地址)运算 运算是定义在数据的逻辑结构上的,但运算的具体实现要在存储结构上进行。每种逻辑结构都有一个运算集合。常用的运算有检索、插入、删除、更新、排序等。第1页/共112页2.2 2.2 线性表和数组一、线性表的定义线性表的逻辑结构是n个数据元素的有限序列:(a1,a2,a3,an)n为线性表
2、的长度(n0),n=0的表称为空表数据元素呈线性关系.必存在唯一的称为“第一个”的数据元素;必存在唯一的称为“最后一个”的数据元素;除第一个元素外,每个元素都有且只有一个前驱元素;除最后一个元素外,每个元素都有且只有一个后继元素。所有数据元素ai在同一个线性表中必须是相同的数据类型第2页/共112页2.2 2.2 线性表和数组线性表的基本运算主要有:求表长度检索插入删除修改归并线性表按其存储结构可分为顺序表和链表。用顺序存储结构存储的线性表称为顺序表;用链式存储结构存储的线性表称为链表 数组是一种典型的顺序表第3页/共112页2.2 2.2 线性表和数组二、数组1 1、数组的特点均匀性:每个元
3、素占据相同大小的存储空间。静态分配空间,必须预先定义大小。随机存取:下标与值一一对应,每个元素由下标确定位置。2 2、数组的顺序分配 n维数组A=l1u1,l2u2,lnun 元素个数:一维数组存储同构的线性表,要存储n维数组,需将n维下标映射为计算机存储的一维地址第4页/共112页2.2 2.2 线性表和数组n维数组的存储行主排列法:按下标由外至里变化的顺序依次存放于内存(外先变)列主排列法:按下标由里至外变化的顺序依次存放于内存例:二维数组A=1m,1n行主序:列主序:第5页/共112页2.2 2.2 线性表和数组地址计算公式(P44)一维数组二维数组三维数组n维数组三、顺序表(数组)的运
4、算(1 1)插入)插入,在线性表(a1,a2,ai,ai+1,an)的第i个位置插入元素x,算法如下:第6页/共112页2.2 2.2 线性表和数组int sq_insert(list,npt,i,maxn,x)int*list,/线性表首结点指针 *npt,/记录线性表结点数的变量的指针 i,/插入位置 maxn,/线性表可以存储的最大数据元素个数 x;/插入结点值 int k;if(i*npt)return 1;/不合理的插入位置 if(*npt=maxn)return 2;/存储线性表的数组已满 for(k=*npk;ki;k-)listk=listk-1;/第n结点至第i结点后移1个位
5、置 listi=x;/新结点插入 +*npt;/线性表结点数加1 return 0;/插入成功第7页/共112页2.2 2.2 线性表和数组(2 2)删除)删除:在表长为n的线性表(a1,a2,ai-1,a a a ai i i i,ai+1an)中删除第i个数据元素,通常还需将第i+1个至第n个元素向前推动一个位置,即(a1,a2,,ai-1,ai+1,an),其算法描述如下:int sq_delete(list,npt,i)int*list,/线性表首结点指针 *npt,/记录线性表结点数的变量的指针 i,/删除位置 int k;if(i*npt)return 1;/不合理的删除位置 if
6、(*npt=0)return 2;/线性表已空 for(k=i+1;km或top=maxn)return 1;/栈满,进栈失败返回1 *toppt+;stack*toppt=x;/完成进栈 return 0;/进栈成功返回0int pop(NODE stack,int*toppt,NODE*cp)/弹栈函数 if(*toppt=0)return 1;/栈空,弹栈失败返回1 *cp=stack*toppt;/完成弹栈 *toppt-;return 0;/弹栈成功返回0第12页/共112页2.3 2.3 栈和队列3 3、栈的应用子程序的调用及返回调用时,下一语句地址压栈;返回时,弹栈,获得返回后的
7、执行语句的地址第13页/共112页2.3 2.3 栈和队列表达式计算参数传递递归过程的实现第14页/共112页2.3 2.3 栈和队列二、队列1 1、定义 是一种只许在队首删除元素,在队尾插入元素的先进先出(FIFO)的线性表。2 2、顺序存储队列(1)顺序队列队尾指示器rear指示队尾元素,队头指示器front指示队头元素的前一位置,即队头指针所指的位置是空的。第15页/共112页2.3 2.3 栈和队列入队时,rear+1,加入数据元素;出队时,取出数据元素,front+1;当front=rear时,队列空。存在问题:随着进队和出队操作,front和rear数组尾端,会出现前端空着,而队列
8、空间已用完的情况。为此,引入循环队列。(2)循环队列(见下页图)将实现队列的数组的首元与末元连接起来。当rear=Maxsize时,如果q1有空,下一个元素将加入q1。p判断队空、队满的条件rear赶上front:队满front赶上rear:队空 第16页/共112页第17页/共112页2.3 2.3 栈和队列判断条件同为rear=frontrear=front,怎么办?区别方法:只剩一个空结点时就认为队满。(rear+1)MOD Maxsize=front,即少用一个单元区别两种情况。循环队列的运算判空(front=rear)入队 判断是否队满如未满调整队尾指示器rear把数据元素插入队尾出
9、队 判断是否队空如未空调整队首指示器front取出数据元素。第18页/共112页2.3 2.3 栈和队列int en_queue(NODE q,int maxn,int*tpt,int*hpt,NODE x)/入队函数/设队列结点的数据类型为NODE,用能存储maxn个结点的数组实现 *tpt=(*tpt+1)%maxn;/*tpt队尾位置 if(*tpt=*hpt)/队满,*hpt队首位置 *tpt=(*tpt-1+maxn)%maxn;/恢复队尾位置*tpt return 1;/进队失败 q*tpt=x;return 0;int de_queue(NODE q,int maxn,int*t
10、pt,int*hpt,NODE*cp)/出队函数 if(*hpt=*tpt)return 1;/队空 *hpt=(*hpt+1)%maxn;*cp=q*hpt;return 0;第19页/共112页2.3 2.3 栈和队列队列的应用队列的应用多道程序中的多道程序中的CPUCPU管理管理在只有一个CPU和内存的条件下,多用户同时使用计算机,需要在他们之间合理分配计算机资源。多用户队列在实现合理分配CPU中起重要作用。缓冲区的设计缓冲区的设计计算机向外设传送数据时,先把数据送到缓冲区,然后外设依次从缓冲区取数据进行具体操作。第20页/共112页2.4 2.4 链表链接存储的特点:动态分配存储空间;
11、增删操作不需移动大量元素,不要求连续存储。p链表的分类:按链(指针)个数:单链表、双链表、多重链表按指针方向:双向链表、循环链表一、单链表 1 1、定义 链式存储的线性表。第21页/共112页2.4 2.4 链表结点除信息域外还含有一个指针域,用来指出其后继结点的位置最后一个结点没有后继结点,指针它的指针域为空(记为NIL 或)。另外还需要设置一个指针head,指向单链表的第一个结点第22页/共112页2.4 2.4 链表2 2、单链表的操作插插 入入 删删 除除第23页/共112页单链表的算法插入算法三种插入位置分析插入表头:空表,非空表统一修改头指针中间结点或尾结点前:修改中间结点链域尾结
12、点后:修改尾结点链域后两种操作统一第24页/共112页单链表删除算法删除第i个结点,i为0n1三种删除位置分析删除表头结点:修改头指针删除中间结点或尾结点:修改中间结点链域时间复杂度O(n),用于沿链找删除结点第25页/共112页2.4 2.4 链表void insertList(nodetype*l,nodetype*np,char e)/在单链表的某给定字符节点e后插入新结点,如找不到则查在尾部;np是插入的新结点指针 nodetype*p;/if(*l=NULL)/如链表为空,则把插入结点作为头结点 np-lp=*l;/把np的指针域设为NULL*l=np;/把np设为头指针else p
13、=*l;/取头指针while(p-lp!=NULL&p-elem!=e)/从头指针开始查找ep=p-lp;/向后查找np-lp=p-lp;/把np指针域指向p的下一节点p-lp=np;/把p的指针域指向np第26页/共112页2.4 2.4 链表(2)删除算法 void deleteList(nodetype*l,char e)/l为链表头指针的指针 if(*l=NULL)return;/空链表,返回nodetype*p,*q;p=*l;/p用于判断比较q=NULL;/q用于指向当前结点的前驱结点while(p!=NULL&p-elem!=e)q=p;p=p-lp;/向后查找并保存前一结点指针
14、if(p!=NULL)/如果找到e,进行删除操作;如未找到,无操作 if(p=*l)*l=p-lp;/如果删除的是首结点,需修改链表指针 else q-lp=p-lp;/将欲删除结点的链接字段赋给前一结点 delete p;/回收被删除结点的空间第27页/共112页2.4 2.4 链表删除算法需要2个检测指针,才能完成删除。一个用来判断比较(p),一个用来指向当前结点的前驱结点(q)。3 3、存储池 是由若干可用结点组成的链表。需要的时候,从表的首部取走一个即可,返归的时候也只要将其链接在首部。第28页/共112页2.4 2.4 链表p它是OS存储管理的部分,OS采用某些方式将内存中空闲的部分
15、管理起来。当应用程序申请动态分配存储空间时,存储管理从存储池中分配给用户,当用完后,应用程序释放动态存储空间,由存储管理将其归还存储池中。存储池图中,av是一个全局变量,它指向存储池的第一个可用节点。第29页/共112页2.4 2.4 链表4、循环链表 循环链表和单链表的差别仅在于链表中最后一个结点的指针域不为“NIL”,而是指向头一个结点,成为一个由链指针链结的环。p可达性:从表中任一结点出发都可以找到其他结点,使查找更加灵活,单链表无此特性。第30页/共112页2.4 2.4 链表5、双向链表单链表只能查找后继结点,不能向前找前驱结点;即使循环链表也是通过先找后继结点才找到前驱结点,为克服
16、这一缺点,引入双向链表。它设有一个指向后继结点的指针和一个指向前驱结点的指针,可方便的直接向前或向后查找。第31页/共112页2.5 2.5 字符串一、定义 字符的有限序列,记为s=s1s2sn。其中n为串长,当n=0时,s称为空串,记为NULL。二、串基本运算求长度len(s)联结concat(s,t)取子串substr(s,i,j)/从s中取从i到j的子串l均以子串和串为单位进行运算,不同于线性表以单个元素为操作对象。第32页/共112页2.5 2.5 字符串三、串存储方式1、顺序存储将串中字符依次存放在连续的存储空间。几种方式:(1)字节方式(字节编址):按字节编址的计算机,8位机,一个
17、字节存放一个字符,以特殊字符标志字符串结束,如。(2)紧缩格式(字编址):以字为存取单位,一个字中放多个字符,节省空间,但寻址不便。(3)非紧缩格式(字编址):一个字中放一个字符,存取方便但浪费空间。第33页/共112页2.5 2.5 字符串第34页/共112页2.5 2.5 字符串2 2、链接存储分为单字符结点、多字符结点;多字符结点每个结点的data域存放多个字符;最后一个结点的data域若未放满,应加上特殊字符。第35页/共112页2.5 2.5 字符串四、串的模式匹配 在主串s中查找子串p,若有则返回串p的起始位置序号,称为串的模式匹配。p简单模式匹配s:a a a a b c p:a
18、 a b 第一趟:s3 p3 a a b 第二趟:s4 p3 a a b 第三趟:s5=p3匹配成功 返回位置为3第36页/共112页2.5 2.5 字符串简单模式匹配的缺点 效率较低。设 len(s)=n,len(p)=m,如n m,显然寻找一个匹配所需要的扫描次数为O(n),而每次扫描进行比较的次数为O(m),所以总的时间花费为O(mn)。p为克服上述缺点,提出了KMP算法,其总的时间花费为O(m+n)。利用模式前后子串间的相等关系以及与s的一个字符发生失配的位置来确定在模式的何处继续查找匹配。第37页/共112页2.6 2.6 树一、树的定义 树是由一个或多个结点组成的有限集合T,满足以
19、下两个条件:1、有一个特定的结点称为根节点;2、其余结点分成n(n0)个互不相交的集合T1、T2 Tn,且每个集合又都是一棵树,称为T的子树。结点的度:一个结点子树的数目。度为0的结点称为叶子;一棵树中结点度的最大值称为树的度。上图,根结点和树的度数都为3。结点的级:结点相对树根所处的层次。结点级的最大值称为树高或树深。(上图E为3级,树高3)第38页/共112页2.6 2.6 树二、二叉树1 1、定义 二叉树是一个有限的结点集合,该集合或者为空,或者由一个根节点及两棵互不相交的左右二叉子树所组成。二叉树第i级的结点数最多为2i-1深度为k的二叉树结点数最多为2k-1(等比数列)第39页/共1
20、12页2.6 2.6 树2 2、二叉树的表示方法 可使用具有2个指针域的链表,LC为左指针域,指向结点的左子树,RC为右指针域,指向结点的右子树。亦可用数组的下标来模拟指针,即开辟三个一维数组DATA,LC和RC分别存放结点的元素及其左、右指针。第40页/共112页2.6 2.6 树3 3、二叉树的遍历遍历:对每个结点访问一次且恰好一次。前序(DLR)、中序(LDR)、后序(LRD)看根节点的位置。前序遍历算法:前序遍历算法:若二叉树不空,则:访问根结点;前序遍历左子树;前序遍历右子树。右图前序ABEFCGDHIJABEFCGDHIJ第41页/共112页2.6 2.6 树 后序遍历算法:后序遍
21、历算法:若二叉树不空,则:后序遍历左子树;后序遍历右子树;访问根结点。后序FEGJIHDCBAFEGJIHDCBA 中序遍历算法:中序遍历算法:若二叉树不空,则:中序遍历左子树;访问根结点;中序遍历右子树。中序EFBGCHIJDAEFBGCHIJDA第42页/共112页2.6 2.6 树4 4、二叉树遍历算法 以上三种遍历方法都是递归定义的,故可用递归算法实现。void preorder(TNODE*t)/前序遍历,t为根节点指针 if(t!=NULL)coutdatallink);preorder(t-rlink);第43页/共112页2.6 2.6 树void midorder(TNODE
22、*t)/中序遍历 if(t!=NULL)midorder(t-llink);coutdatarlink);第44页/共112页2.6 2.6 树void posorder(TNODE*t)/后序遍历if(t!=NULL)posorder(t-llink);posorder(t-rlink);coutdata;第45页/共112页由遍历结果求二叉树结构第46页/共112页由遍历结果求二叉树结构第47页/共112页2.6 2.6 树三、线索二叉树 用标准形式存储二叉树时,树中有很多空指针,如何充分利用其提高算法效率?第48页/共112页第49页/共112页2.6 2.6 树四、树的二叉树表示o每一
23、棵都能唯一地转换到它所对应的二叉树o转换方法:凡是兄弟就用线连接起来;对每个非终端结点,除其最左孩子外,删去该结点与其他孩子结点的连线;再以根结点为轴心,顺时针旋转450第50页/共112页第51页/共112页2.7 2.7 图一、图的概念 常用G=(V,E)代表一个图,V是结点的有穷集合(非空),E是边的有穷集合(E可为空集)。若一条边的结点对无序,则称无向图。反之称为有向图。二、常用术语度 与结点v相联的边的数目。对有向图,以v为始端的边的数目称为v的出度,以v为末端的边的数目称为v的入度。p子图 对于一个图G,若存在图G,且满足v(G)v(G),E(G)E(G),则称G为G的子图。第52
24、页/共112页2.7 2.7 图路径、简单路径在图中,沿E(G)中的边从一个顶点到达另一个顶点所经历的顶点的序列称为从到的一条路径。简单路径是一条路径,除了第一个顶点和最后一个顶点可以相同外,其余都是不同的。p连通图、连通分支、强连通图、强连通分支无向图中任何一对顶点相互可达,称为连通图。无向图的最大连通子图称为连通分支。有向图中任何一对顶点相互可达,称为强连通图。有向图的最大强连通子图称为强连通分支。第53页/共112页2.7 2.7 图加权图边上加权值:表示从一个顶点到达另一个顶点所花费的代价。三、图的存储(常用方法有两种:邻接矩阵和邻接表)1、邻接矩阵若G是一个具有n个结点的图,则G的相
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 学习
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内