数据结构1学习.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)
《数据结构1学习.pptx》由会员分享,可在线阅读,更多相关《数据结构1学习.pptx(114页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、2.1 数据结构的概念数据结构的概念数据结构是计算机科学与技术专业的专业基础课,所有的计算机系统软件和应用软件都要用到各种类型的数据结构。数据是一些可以被计算机接收和处理的描述客观事物的符号。这些符号可以是数字、字符、图形、声音及其他。数据元素是数据(集合)中的一个“个体”,是数据的基本单位。也可称为节点、记录。数据对象是具有相同性质的若干个数据元素的集合。第1页/共114页数据结构是指数据以及数据元素相互之间的联系。可以看作是相互之间存在着某种特定关系的数据元素的集合。因此,可时把数据结构看成是带结构的数据元素的集合。四类基本的结构:集合结构:数据元素间的关系是“属于同一个集合”。集合是元素
2、关系极为松散的一种结构。线性结构:数据元素之间存在着一对一的关系。树型结构:数据元素之间存在着一对多的关系。图形结构:数据元素之间存在着多对多的关系,图形结构也称作网状结构。第2页/共114页数据结构的形式定义为:数据结构S是一个二元组 S=(D,R)其中D是一个数据元素非空的有限集合;R是定义在D 上的关系,是非空集合。(a)集合结构 (b)线性结构 (c)树型结构(d)图形结构图2-1 四类基本结构的示意图第3页/共114页数据结构包括如下3个方面:(1)数据元素之间的逻辑关系,即数据的逻辑结构。(2)数据元素及其关系在计算机存储器中的存储 方式,即数据的存储结构,也称为数据的物 理结构。
3、(3)施加在该数据上的操作,即数据的运算。第4页/共114页2.1.1数据的逻辑结构数据的逻辑结构数据的逻辑结构也称数据结构,是数据元素之间关系的描述,是从具体问题抽象出来的数学模型,它与数据的存储无关。数据的逻辑结构有两种:线性结构:各数据元素之间的逻辑关系可用一个线性序列表示,如线性表,数据元素只按先后次序连接。非线性结构:不能用线性结构表达的结构,如树、图等;树中的数据元素是分层次的纵向连接,而图中的数据元素则是有各种各样的复杂连接。第5页/共114页2.1.2 数据的物理结构数据的物理结构数据的物理结构是数据的逻辑结构在计算机中的表示或称为映像;也称存储结构。研究的是数据结构在计算机中
4、的实现方法。【实例2-1】有一个学生表如表2-1所示。表中的数据元素是学生记录,每个数据元素由四个数据项(即学号、姓别、性别和C语言)组成。张小明的C语言考试成绩为92分,92就是该同学的成绩数据。了解一个学生的学习成绩和能力,要看他的学习档案,而学习档案即是说明该学生学习情况的数据。第6页/共114页第7页/共114页1顺序存储结构数据元素按某种顺序依此存放在计算机存储器的连续存储单元中,它们之间的关系由存储单元的邻接关系来体现。其存储的地址由起始地址和元素所占的存储空间来决定。S是起始地址,H是每个元素所占的空间,则第i个元素的存储地址为:Loc(i)=Loc(1)+(i-1)*H=S+(
5、i-1)*H第8页/共114页顺序存储结构的主要特点:(1)节点中只有自身信息域,没有连接信息域。因此存储密度大,利用率高;(2)计算确定数据结构中第i 个元素的位置,可以(直接)随机存取(3)插入和删除操作会引起大量的元素移动;(4)必须存储在一片地址连续的存储单元中;第9页/共114页2.链接存储结构在链接存储结构中,每个节点即数据元素由数据域Data和指针域Next两部分组成。数据域存放元素本身的数据,指针域存放与其相邻的元素地址。链接存储结构如图2-3所示。第10页/共114页链接存储结构的主要特点:(1)节点除有自身信息域外,还有表示连接信息的指针域。因此存储密度小,利用率低;(2)
6、可使逻辑上相邻的节点在物理上不邻接,使用于复杂的逻辑结构;(3)插入和删除操作灵活方便;只要修改指针域的值即可;(4)可以存储在不连续的存储单元中;第11页/共114页3数据结构的运算数据结构的运算插入:在数据结构中的指定位置插入新的元素。删除:根据一定的条件,将某个节点从数据结构中删除。更新:更新数据结构中某个指定节点的值。检索:在给定的数据结构中,找出满足一定条件的节点,条件可以是一个或多个数据项的值。排序:根据某一给定的条件,将数据结构中所有的节点重新排列顺序。第12页/共114页2.2 线性表线性表线性表是具有相同数据类型的n(n=0)个数据元素的有限序列,通常记为:(a1,a2,ai
7、-1,ai,ai+1,an)其中n为表长,n0 时称为空表。相邻元素之间存在着顺序关系。将ai-1 称为 ai 的直接前趋,ai+1 称为 ai 的直接后继。对于ai,有且仅有一个直接后继 ai+1,而 a1是表中第一个元素没有前趋,an 是最后一个元素无后继。第13页/共114页2.2.1 线性表的存储结构线性表的存储结构具有顺序存储结构的线性表称为顺序表。线性表的顺序存储是指在内存中用地址连续的一块存储空间顺序存放线性表的各元素。因为内存中的地址空间是线性的,用物理上的相邻实现数据元素之间的逻辑相邻关系是简单,知道顺序表首地址和每个数据元素所占地址单元的个数就可求出第i个数据元素的地址,顺
8、序表具有按数据元素的序号随机存取的特点。第14页/共114页从结构性上考虑,通常将data和last封装成一个结构作为顺序表的类型:typedef struct datatype dataMaxSize;int last;lnode,*SeqSeqList;SeqSeqList L;/定义一个顺序表L;第15页/共114页2.2.2 顺序表上基本运算的实现顺序表上基本运算的实现1.插入运算Insert_SeqList(L,i,x)(a1,a2,.,ai-1,ai,ai+1,.,an)插入后表长=原表长+1,成为表长为 n+1 表:(a1,a2,.,ai-1,x,ai,ai+1,.,an)顺序表
9、上完成的步骤:(1)将aian 顺序向下移动,为新元素让出位置;(2)将 x 插入空出的第i个位置;(3)修改 last 指针,使之仍指向最后一个元素。第16页/共114页算法如下:Insert_SeqList(SeqSeqList L,int i,datatype x)int j;if(iL-last+1)printf(插入位置错);/*检查插入位置的正确性*/else for(j=L-last;j=i-1;j-)L-dataj=L-dataj-1;/*移动元素*/L-datai-1=x;/*插入新元素*/L-last+;/*last仍指向最后元素,表的长度1*/第17页/共114页插入算法
10、的时间性能分析:时间主要消耗在了数据的移动上,在第i个位置上插入 x,从 ai 到 an 都要向下移动一个位置,共需要移动 ni1个元素,而 i 的取值范围为:1=i=n+1,即有 n1个位置可以插入。设在第i个位置上作插入的概率为Pi,则平均移动数据元素的次数:设:Pi=1/(n+1),即为等概率情况,则:第18页/共114页第19页/共114页删除运算Delete_SeqList(L,i)线性表的删除运算是指将表中第 i 个元素从线性表中去掉,删除后表长原表长使原表长为 n 的线性表:(a1,a2,.,ai-1,ai,ai+1,.,an)成为为 n1 的线性表,:(a1,a2,.,ai-1
11、,ai+1,.,an)。i 的取值范围为:1=i=n。如图2-7所示顺序表中的删除。第20页/共114页第21页/共114页算法步骤:(1)将将ai+1an 顺序向上移动。(2)修改last指针,使之仍指向最后一个元素。Delete_List(SeqSeqList L,int i)int j;if(iL-last+1)printf(不存在第i个元素);return(0);else/*检查空表及删除位置的合法性*/for(j=i;jlast;j+)L-dataj-1=L-dataj;/*移动元素*/L-last-;/*last仍指向最后元素,表的长度-1*/return(1);/*删除成功*/第
12、22页/共114页删除算法的时间性能分析:与插入运算相同,时间主要消耗在移动表中元素上,删除第i个元素时,其后面的元素 ai+1an 都要向上移动一个位置,共移动 n-i 个元素,所以平均移动数据元素的次数:在等概率情况下,pi=1/n,则:第23页/共114页2.2.3 线性表的链式存储和运算实现线性表的链式存储和运算实现存储单元地址可连续,可不连续,不要求逻辑上相邻的两个数据元素物理上也相邻,通过“链”将数据元素之间的逻辑关系来,对线性表的插入、删除不需要移动数据元素。1.单链表的表示链表节点定义如下:typedef struct node datatype data;struct nod
13、e*next;LNode,*LinkList;/LNode是节点的类型定义头指针变量:LinkList L;/LinkList是指向Lnode类型节点的指针类型第24页/共114页第25页/共114页2.单链表的建立,在单链表的尾部插入节点建立单链表算法思路:(1)初始状态:头指针L=NULL,尾指针 r=NULL;(2)按线性表中元素的顺序依次读入数据元素,不是结束标志时,申请节点。(3)将新节点插入到 r 所指节点的后面,然后 r 指向新节点(但第一个节点有所不同,读者注意下面算法中的有关部分)。在尾部插入建立单链L=NULL 或 r=NULL /*初始状态*/第26页/共114页第27页
14、/共114页算法如下:LinkList Creat_LinkList()LinkList L=NULL;Lnode *s,*r=NULL;char flag=0;char x;/*设数据元素的类型为char*/scanf(%d,&x);while(x!=flag)s=(Lnode*)malloc(sizeof(Lnode);s-data=x;if (L=NULL)H=s;/*第一个节点的处理*/else r-next=s;/*其他节点的处理*/r=s;/*r 指向新的尾节点*/scanf(%d,&x);if(r!=NULL)r-next=NULL;/*对于非空表,最后节点的指针域放空指针*/r
15、eturn L;第28页/共114页第29页/共114页3.按序号查找 Get_Linklist(L,i)算法思路:(1)从链表的第一个元素节点起,判断当前节点是否是第i个节点;(2)若是第i个节点,则返回该节点的指针,否则继续后一个,表结束为止。(3)没有第个节点时返回空。第30页/共114页Lnode *Get_LinkList(LinkList L,char i);/*在单链表L中查找第i个元素节点*/Lnode *p=L;int j=0;while(p-next!=NULL&jnext;j+;if(j=i)return p;/*若是第i个节点,则返回该节点的指针*/else retur
16、n NULL;/*没有第个节点时返回空*/第31页/共114页4.单链表的插入,后插节点:设p指向单链表中某节点,s指向待插入的值为x的新节点,将节点s插入到节点p的后面,插入示意图如图2-14。操作如下:s-next=p-next;p-next=s;第32页/共114页(2)插入运算 Insert_LinkList(L,i,x)算法思路:(1)查找第i-1个节点;如果找到,继续(2),否则结束;(2)申请、填装新节点;(3)将新节点插入,结束。第33页/共114页int Insert_LinkList(LinkList L,int i,char x)/*在单链表L的第i个位置上插入值为x的元
17、素*/Lnode *p,*s;p=Get_LinkList(L,i-1);/*查找第i-1个节点*/if(p=NULL)printf(参数i错);return 0;/*第i-1个不存在不能插入*/else s=(Lnode*)malloc(sizeof(Lnode);/*申请、填装节点S*/s-data=x;s-next=p-next;/*插入在第i-1个节点的后面*/p-next=s;return 1;/*1表示插入成功*/第34页/共114页5.删除 删除节点p 删除节点:设p指向单链表中某节点,删除节点p。操作示意图如图2-15所示。操作如下:q-next=p-next;第35页/共11
18、4页(2)删除运算:Del_LinkList(L,i)算法思路:(1)查找到第i-1个节点;如果找到,继续(2),否则结束;(2)若存在第i个节点则继续(3),否则结束;(3)删除第i个节点,结束。第36页/共114页int Del_LinkList(LinkList L,int i)/*删除单链表L上的第i个数据节点*/LinkList p,s;p=Get_LinkList(L,i-1);/*查找第i-1个节点*/if(p=NULL)printf(第i-1个节点不存在);return 0;else if(p-next=NULL)printf(第i个节点不存在);return 0;else s
19、=p-next;/*s指向第i个(P的后继)节点*/p-next=s-next;/*从链表中删除S节点*/free(s);/*释放*s*/return 1;/*删除成功*/第37页/共114页6.上机实验单链表上插入、删除,源程序名“2_2.c”第38页/共114页循环链表是最后一个节点的指针不为空,而指向第一个节点的链表,使得链表头尾节点相连,就构成了单循环链表。如图2-16所示。图2-16 带头节点的单循环链表(a)非空表a1Han(b)空表H第39页/共114页2.3栈和队列栈和队列2.3.1栈栈(Stack)是操作受限的线性表,它限定仅在表尾进行插入或删除操作。对栈采说,允许插入、删除
20、的这一端称为栈顶,另一个固定端称为栈底。当表中没有元素时称为空栈。向栈里放入一个新元素,称为进栈(Push),从栈中取出一个元素,称为出栈(Pop)。第40页/共114页 进栈顺序是a1、a2、a3,出栈时顺序a3、a2、a1,所以栈又称为后进先出的线性表(Last In First Out),简称 LIFO表。在日常生活中栈的例子,如子弹夹,火车调度进站出站等。第41页/共114页第42页/共114页栈的初始化:建立一个空栈,即说明一个数组和指针初值。int smax;top-1;进栈:在栈顶插入一个元素,即将栈顶指针加1,同时元素值x送人栈顶。int Push(int s,int x)if
21、(top=max-1)return 0;/*栈满,不能入栈*/else top+;s top=x;return 1;/*元素进入,返回*/第43页/共114页出栈:在栈顶删除一个元素,同时栈顶指针减1。int Pop(int s,int*x)if (top=-1)return 0;/*栈空,不能出栈*/else *x=s top;s-top-;return 1;/*栈顶元素存入*x,返回*/第44页/共114页【实例2-2】栈的简单应用,数制转换问题:将十进制数N转换为r进制的数,其转换方法利用辗转相除法:以N=3456,r=8为例转换方法如下:N N/8(整除)N%8(求余)123 15 3
22、 低 15 1 7 1 0 1 高 以:(123)10 =(173)8当当N0时重复(时重复(1),(),(2)若若 N0,则将,则将N%r 压入栈压入栈s中中,执行,执行2;若若N=0,将栈,将栈s的内容依次出栈,算法结束。的内容依次出栈,算法结束。用用N/r 代替代替 N第45页/共114页#define L 8 void conversion(int N,int r)int sL,top;/*定义一个顺序栈*/int x;top=-1;/*初始化栈*/while(N)s+top=N%r;/*余数入栈*/N=N/r;/*商作为被除数继续*/while(top!=-1)x=stop-;pri
23、ntf(“%d”,x);printf(n);第46页/共114页2.3.2队列队列栈是一种后进先出的数据结构,“先进先出”FIFO(First In First Out)的数据结构:即插入在表一端进行,而删除在表的另一端进行,我们将这种数据结构称为队或队列。把允许插入的一端叫队尾(rear),把允许删除的一端叫队头(front)。第47页/共114页排队买东西,排头的买完后走掉,新来的排在队尾。在队列上进行的基本操作有:(1)初始化队列:initQueue(Q)(2)取队首元素之值:将队列Q的队头元素置于变量x中,队列不变。(3)入队:在队列Q的队尾插入一个元素x(4)出队:删除队列Q的队头元
24、素。第48页/共114页1顺序存储的队列 采用顺序存储结构的队列称为顺序队列。假设用一维数组qm来存储队列中的数据元素,队列所允许的最大容量为m。由于插入和删除的原故,队头和队尾的位置会经常变动,所以要设置两个指针front和rear,并约定rear指向队尾元素所在的位置,front指向队头元素的前一个位置。qrear 指向队尾元素,qfront+1表示队头元素。当frontrear时,就表示空队列。第49页/共114页在图在图2-21中,中,(a)为空队列;为空队列;(b)为元素为元素a1,a2,a3相继进入队列后的情相继进入队列后的情况;况;(c)为元素为元素a1,a2,a3相继退出队,相
25、继退出队,a6,a7,a8入队列;入队列;第50页/共114页因为rear+l已超出了最大容量MaxSize。但我们注意到队列中还有空间可利用,这种现象称为假溢出。解决假溢出时,可以将队列看成是头尾相连的环,称之为循环队列。第51页/共114页循环队列人队操作可描述如下:rear(rear+1)m;qrearx;循环队列出队操作可描述如下:front(frontd-1)m;xqfront;v在在循环队列循环队列如何如何判定判定队队满满和队和队空空。v因为此时无论队满或队空,都有因为此时无论队满或队空,都有frontfrontrearrear。v解决方案是少用一个元素空间,这样可用解决方案是少用
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 学习
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内