第3章 简单数据结构优秀课件.ppt
《第3章 简单数据结构优秀课件.ppt》由会员分享,可在线阅读,更多相关《第3章 简单数据结构优秀课件.ppt(175页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第3章 简单数据结构第1页,本讲稿共175页简单数据结构简单的数据结构,包括顺序表、链表、栈、队列和广义表,它们和上一章介绍过的数组和串一起都同属于线性结构。在线性结构中,数据元素之间的关系是一对一的次序关系,其逻辑特征为:存在一个惟一地被称作“第一个”的数据元素;存在一个惟一地被称作“最后一个”的数据元素;除第一个之外,每个数据元素都只有一个前趋;除最后一个之外,每个数据元素都只有一个后继。第2页,本讲稿共175页第3章 简单数据结构 3.1 顺序表3.2 链表3.3 栈3.4 队列3.5 广义表第3页,本讲稿共175页3.1 顺序表3.1.1 线性表的基本概念3.1.2 线性表的顺序存储结
2、构顺序表3.1.3 顺序表上的基本运算第4页,本讲稿共175页线性表的基本概念线性表(LinearList)是一种最简单最常用的数据结构。一个线性表是由n(n0)个相同类型数据元素(结点)组成的有限序列。表中有且仅有一个第一个结点,它没有前趋而只有一个后继;有且仅有一个最后一个结点,它没有后继而只有一个前趋;其余结点都只有一个前趋和一个后继。根据结点之间的关系可以排成一个线性序列:(a1,a2,a3,a4,an)其中:a1为第一个结点,an为最后一个结点;对于i=2n,ai-1是ai的前趋,ai是ai-1的后继;n称作线性表的长度,n为0时称作空表。第5页,本讲稿共175页线性表的例子线性表中
3、的数据元素(结点)可以是一个数、一个符号、一页书、一个记录等。下面给出线性表的几个例子:(“A”,“B”,“Z”)是一个线性表,称作字母表,表中的数据元素都是单个大写字母字符;(3,7,9,12,66,87)是一个线性表,表中的每个数据元素都是一个整数;学生成绩表也是一个线性表,表中的数据元素为描述一个学生高考情况的一个记录,它由姓名、准考证号、数学、语文、英语、理综、总分七个数据项组成。第6页,本讲稿共175页线性表的形式化定义线性表的形式化定义如下:LinearList=(D,R)其中:D=ai|aiDo,i=1,2,n,n0;R=|ai-1,aiDo,i=2,3,n;Do为某个数据对象。
4、线性表是一种相当灵活的数据结构,其长度可根据需要增减,即对数据元素不仅可以访问,还可进行插入和删除。第7页,本讲稿共175页线性表的基本运算置空表setnull(L):将线性表L置为空表。求长度length(L):计算线性表L中数据元素的个数。取元素get(L,i):取出线性表L中第i个数据元素;要求ilength(L)。取前趋prior(L,x):取出线性表L中值为x的元素的前趋元素;要求x的位序大于1。取后继next(L,x):取出线性表L中值为x的元素的后继元素;要求x的位序小于length(L)。定位序locate(L,x):确定元素x在线性表L中的位置,并给出位置序号;若L中无x返回
5、0。第8页,本讲稿共175页线性表的基本运算(续)插入insert(L,x,i):在线性表L中第i个位置上插入值为x的新元素,使表长增1;要求1ilength(L)+1。删除delete(L,i):删除线性表L中的第i个元素,使表长减1;要求1ilength(L)。利用这些基本运算,可以实现线性表的其它较复杂运算,如线性表的分拆、合并、逆置等。在实际应用中,当线性表作为一个运算对象时,所需的运算种类不一定相同,不同的运算将构成不同的抽象数据类型。这里所给出的运算是定义在逻辑结构上的抽象运算,而运算的实现要依赖于所采用的存储结构。第9页,本讲稿共175页3.1 顺序表3.1.1 线性表的基本概念
6、3.1.2 线性表的顺序存储结构顺序表3.1.3 顺序表上的基本运算第10页,本讲稿共175页线性表的顺序存储结构顺序表顺序表(sequentiallist)是用一组地址连续的存储单元依次存放线性表中的各个数据元素,是一种最简单最自然的线性表存储方法。这组地址连续的存储空间的大小依线性表中的数据元素个数而定,线性表中第一个元素存放在这组空间的开始处,第二个元素紧跟着存放在第一个元素之后,余类推。显然,顺序表中相邻的数据元素在计算机内的存储位置也相邻;换句话说,顺序表以数据元素在计算机内的物理位置相邻来表示数据元素在线性表中的逻辑相邻关系。第11页,本讲稿共175页线性表的存储地址计算公式由于线
7、性表中的数据元素具有相同的类型,所以可以很容易地确定顺序表中每个数据元素在存储空间中与起始单元的相对位置;假定线性表中每个数据元素需要占用c个存储单元,loc(a1)是第一个数据元素的存储地址(也称作基地址),则第i个数据元素的存储地址可由下式确定:loc(ai)=loc(a1)+(i-1)*c其中:1ilength(L)+1。显然,顺序表是一种可随机存取的数据结构。第12页,本讲稿共175页线性表的顺序存储结构示意图第13页,本讲稿共175页顺序表的顺序存储结构(续)由于在高级程序设计语言中的一维数组(或向量)在计算机内分配的是一片连续的存储单元,所以可借助一维数组为顺序表开辟存储空间存储表
8、中的数据元素。考虑到线性表因插入、删除运算长度可变,数组的容量要足够大(可设为MAXSIZE,其值依实际问题而定),并设一指示器变量last指向表中的最后一个元素位置。为了讨论方便,我们假定元素是从数组下标为1的位置开始存放,即last=0时为空表。第14页,本讲稿共175页顺序表的类型描述#define MAXSIZE 500 typedef struct elemtyPe dataMAXSIZE;int last;sequenlist;即把顺序表类型sequenlist描述为一个结构体,域data数组存放表中的数据元素,域last存放表长,datalast存放表中最后一个元素。elemty
9、pe为表中数据元素的类型,对于不同的实际问题可以为不同的具体类型,如整型int、实型float、字符型char、双精度实型double、或其它结构类型等。第15页,本讲稿共175页3.1 顺序表3.1.1 线性表的基本概念3.1.2 线性表的顺序存储结构顺序表3.1.3 顺序表上的基本运算第16页,本讲稿共175页顺序表上的基本运算在定义了线性表的顺序存储结构之后,就可以讨论各种基本运算的实现问题了。顺序表上的许多运算是很容易实现的。例如:置空表就是使表长为0,即(*L).last=0;求表长就是读出last域的值,即(*L).last;取元素就是按位序取出data域中相应元素,即(*L).d
10、atai;取前趋就是将元素x的位序前一个元素取出,即(*L).datalocate(L,x)-1;取后继即取出(*L).datalocate(L,x)+1的值等。这里只讨论定位序、插入和删除运算的实现算法。第17页,本讲稿共175页1.定位序locate(L,x)定位序即按值查找,确定元素x在顺序表L中的位置。最简单的方法是从第一个元素起和x比较,直到找到一个值为x的数据元素返回它的位置序号(即数组下标),或者找遍表中所有元素均无值为x的元素时返回0。其算法描述如下:int locate(L,x)sequenlist*L;elemtyPe x;int i=1;while(ilast)&(L-d
11、atai!=x)i+;第18页,本讲稿共175页定位序(续)if(iL-last)return 0;/*未找到值为x的元素返回0*/else return i;/*找到值为x的元素返回它的位序i*/*locate*/该算法的主要时间花费在于查找比较的循环。当a1=x时一次比较成功,当an=x时n次比较成功,在x分布位置等概率的情况下平均比较次数为(n+1)/2;查找不成功时的比较次数为n+1。所以算法的时间复杂度为O(n)。第19页,本讲稿共175页2.插入insert(L,x,i)插入运算是指在顺序表L的第i个元素之前加入一个新元素x。插入的结果使x在顺序表中第i个元素位置上,使顺序表的长度
12、由n变为n+1。插入新元素x后,部分数据元素间的逻辑关系发生了改变,要求物理存储位置也要相应变化。除非i=n+1,否则必须将位序为i,i+1,n的数据元素向后移动一个元素位置,空出第i个位置插入新元素x;在i=n+1时直接将新元素x插入表尾。第20页,本讲稿共175页在顺序表中插入新元素x的过程第21页,本讲稿共175页插入运算的算法描述 void insert(L,x,i)sequenlist*L;elemtype x;int i;int j;if(i(L-last+1)printf(“插入位置不正确n”);else if(L-last=MAXSIZE)printf(“表已满,发生上溢n”)
13、;else for(j=L-last;j=i;j-)L-dataj+1=L-dataj;L-datai=x;L-last=L-last+1;/*insert*/第22页,本讲稿共175页插入运算算法的时间复杂度算法中的数据元素移动是从第n个元素到第i个元素依次后移的。算法中的主要时间开销在于后移元素的for循环,循环执行n-i+1次。当i=n+1时不需移动元素是最好情况,当i=1时需移动元素n次是最坏情况,在插入位置等概率分布时的平均移动次数为n/2。所以算法最好情况下的时间复杂度为O(1),在最坏情况下的时间复杂度为O(n),在平均情况下的时间复杂度也是O(n)。第23页,本讲稿共175页3
14、.删除delete(L,i)删除运算是把顺序表中第i个元素删掉,使顺序表的长度由n变为n-1,其部分元素的逻辑关系和存储位置也发生相应变化,即 由(a1,a2,ai-1,ai,ai+1,an)变成为 (a1,a2,ai-1,ai+1,an)。除非i=n时直接删除,否则需要从第i+1元素到第n元素依次前移一个元素位置。第24页,本讲稿共175页在顺序表中删除第i个元素过程第25页,本讲稿共175页删除运算的算法描述 void delete(L,i)sequenlist*L;int i;int j;if(iL-last)printf(“删除位置不正确n”);else for(j=i+1;jlast
15、;j+)L-dataj-1=L-dataj;L-last=L-last-1;/*delete*/第26页,本讲稿共175页删除运算算法的时间复杂度由删除过程可以看出,通过元素ai+1到an的依次前移就达到了删除ai的目的。该算法的时间开销也主要是在元素的移动。当i=n时最好不需移动,当i=1时最坏需移动n-1次,在等概率的情况下需平均移动元素(n-1)/2次。其时间复杂度在最好、最坏和平均的情况下分别为O(1),O(n)和O(n)。第27页,本讲稿共175页举例删除顺序表中的重复元素 一个顺序表中可能含有一些值相同的重复元素,题目要求对于值相同的重复元素只保留位序最小的一个而删除其它多余的元素
16、。如(5,2,2,3,5,2)经删除重复元素后变为(5,2,3)算法思路:从顺序表中第一个元素起,逐个检查它后面是否有值相同的其它元素,若有便删除之;直到表中所有元素都已无重复元素为止。为此,算法中需设两重循环,外层控制清除的趟数,内层控制每趟的检查范围。第28页,本讲稿共175页删除顺序表中的重复元素的算法描述 void Purge(L)sequenlist*L;int i,j,k;i=1;while(ilast)j=i+1;while(jlast)if(L-dataj=L-datai)for(k=j+1;klast;k+)L-datak-1=L-datak;L-last=L-last-1;
17、else j+;i+;/*Purge*/第29页,本讲稿共175页举例有序表的合并顺序表A和B的元素均按由小到大的升序排列,编写算法将它们合并成为顺序表C,要求C中元素也是从小到大的升序排列。算法思路:依次扫描A和B中元素,比较当前两个元素值,将较小的元素赋给C,直到其中一个顺序表扫描完毕,然后将另一个顺序表中剩余元素赋给C即可。第30页,本讲稿共175页有序表的合并的算法描述 void merge(C,A,B)sequenlist*C,*A,*B;int i,j,k;i=1;j=1;k=1;while(ilast&jlast)if(A-dataidataj)C-datak+=A-datai+
18、;else C-datak+=B-dataj+;While(ilast)C-datak+=A-datai+;While(jlast)C-datak+=B-dataj+;C-last=k-1;/*merge*/第31页,本讲稿共175页第3章 简单数据结构 3.1 顺序表3.2 链表3.3 栈3.4 队列3.5 广义表第32页,本讲稿共175页3.2 链表顺序表的特点是,逻辑关系上相邻的两个元素在物理位置上也相邻。这一特点使得顺序表有如下两个优点:无需为表示数据元素之间的关系而额外增加存储空间;可以随机存取表中任一数据元素,元素存储位置可以用一个简单、直观的公式表示。这一特点也造成了这种存储结构
19、的两个缺点:插入和删除运算必须移动大量(几乎一半)数据元素,效率较低;必须预先分配存储空间,造成空间利用率低,且表的容量难以扩充。本节介绍线性表的另一种存储结构链式存储结构。它不要求逻辑上相邻的元素在物理位置上也相邻,为表示元素之间的关系要增加额外存储空间,也不能随机存取数据元素;但是它没有顺序存储结构所具有的缺点。第33页,本讲稿共175页3.2 链表3.2.1 线性表的链式存储结构链表3.2.2 单链表上的基本运算 3.2.3 循环链表和双向链表3.2.4 线性表应用举例一元多项式相加问题第34页,本讲稿共175页线性表的链式存储结构链表 线性表的链式存储结构,是用一组任意的存储单元(这组
20、存储单元的地址可以连续,也可以不连续)来存放线性表中的各个数据元素的。为了表示出每个数据元素与其后继之间的关系,对每个元素除了存储元素本身的信息外,还需存储指示该元素的后继元素的地址;这两部分信息组成一个结点。存放数据元素信息的域data称作数据域,存放后继元素地址信息的域next称作指针域或链域。一个线性表的n个元素通过每个结点的指针域拉成一条“链子”,所以称之链表(LinkedList)。由于这种链表中每个结点只含有一个指向后继的指针,所以称作线性链表或单链表(SingleLinkedList)。第35页,本讲稿共175页单链表存储举例对于线性表(mon,tue,wed,thu,fri,s
21、at,sun),其单链表存储示意图如下图。第36页,本讲稿共175页单链表由于单链表中每个结点的存储地址是放在其前趋结点的指针域中,因此整个链表的存取必须从第一个结点开始;需设立头指针指示链表中的第一个结点。这样就可以由头指针找到第一个结点,再由第一个结点的指针域找到第二个结点,依次顺着指针域找到每个结点。此外,在链表中最后一个结点没有后继,该结点的指针域为空,用NULL或表示空指针域。第37页,本讲稿共175页单链表(续)对于单链表,我们并不关心各个结点的实际存储位置,而关心的是结点间的逻辑次序关系,故可将单链表(mon,tue,wed,thu,fri,sat,sun)的画成如下图。其中用箭
22、头表示的指针域中的指针。由上图可以很清楚地看出,线性表的链式存储结构是通过链指针来表示数据元素之间的逻辑关系的,是非顺序存储结构。整个单链表可由头指针惟一确定,所以常用头指针名来命名一个单链表,如称表H则意味着该单链表的头指针为H。第38页,本讲稿共175页单链表的类型描述 typedef struct node elemtype data;struct node*next;LinkList;LinkList*H,*P;需要说明的是,定义LinkList与struct node为相同类型不同的类型标识符(名字),是为了用它说明单链表类型,这种方法有利于提高程序或算法的可读性。另外,指针变量所指
23、向的结点地址并不是在程序中显式给出,而是在程序的执行过程中用标准函数malloc根据需要动态生成的。第39页,本讲稿共175页单链表结点空间的申请与释放malloc函数的返回值类型在ANSI C版本中是void*类型,所以动态生成的结点类型必须强制转换为指向该结点的指针类型。具体方法为 P=(LinkList*)malloc(sizeof(LinkList);它获得一个单链表类型结点,结点地址在指针变量P。如下图当要释放结点空间时可用标准函数free完成,即 free(P);它释放指针P所指结点空间给内存。对结点中两个域的访问,只能通过指向该结点的指针进行,如 P-data和P-next 或者
24、(*P).data和(*P).next第40页,本讲稿共175页3.2 链表3.2.1 线性表的链式存储结构链表3.2.2 单链表上的基本运算 3.2.3 循环链表和双向链表3.2.4 线性表应用举例一元多项式相加问题第41页,本讲稿共175页单链表上的基本运算为了方便运算,使单链表的空表和非空表的处理一致,通常在单链表的第一个结点前增加一个头结点。头结点的数据类型和其它结点一致,它的数据域无定义,指针域中存放第一个数据结点的地址,空表时指针域为空。空表和非空表的图形表示如下:若无特殊说明,本章算法均采用带头结点的单链表。第42页,本讲稿共175页1.建立单链表在单链表中每个元素的存储空间是在
25、需要时才申请,其逻辑关系靠指针来表示,所以在建立单链表的过程中更多关心的是指针的链接。一开始先申请并生成头结点,然后每读入一个数据元素申请一个结点,填入数据后插入表尾,为此要设一个尾指针r。具体的算法描述如下:LinkList*CreateLinkList()char ch;int x;LinkList*head;/*head为头结点指针*/LinkList*r,*P;head=(LinkList*)malloc(sizeof(LinkList);head-next=NULL;第43页,本讲稿共175页建立单链表(续)r=head;/*尾指针初始化*/ch=getchar();while(ch
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第3章 简单数据结构优秀课件 简单 数据结构 优秀 课件
限制150内