第二章-线性表课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《第二章-线性表课件.ppt》由用户(晟晟文业)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第二 线性 课件
- 资源描述:
-
1、2022-12-28北京联合大学信息学院第二章线性表2022-12-28北京联合大学信息学院 本章导读本章导读 本章要点:线性表的基本概念、线性表的顺序存储、链本章要点:线性表的基本概念、线性表的顺序存储、链式存储、线性表的两种不同存储比较,线性表的应用。式存储、线性表的两种不同存储比较,线性表的应用。通过本章的学习,掌握线性表的基本概念、顺序表和通过本章的学习,掌握线性表的基本概念、顺序表和单链表上的基本运算。掌握循环链表、双向链表和静态单链表上的基本运算。掌握循环链表、双向链表和静态链表的概念。能够利用线性表解决实际问题。链表的概念。能够利用线性表解决实际问题。2022-12-28北京联合
2、大学信息学院2.1线性表的基本概念线性表(Linear list)是最简单且最常用的一种数据结构。是最简单且最常用的一种数据结构。线性表是具有相同类型的线性表是具有相同类型的n(n 0)个数据元素个数据元素(结点)(结点)a1,a2,an组成的有限序列。组成的有限序列。其中数据元素的个数其中数据元素的个数n定义为定义为表的长度表的长度。当。当n=0时称为时称为空表空表,常常将,常常将非空的线性表(非空的线性表(n0)记作:()记作:(a1,a2,an)这里的数据这里的数据元素元素a ai i(1(1 i n)i n)只是一个抽象符号,具体含义视情况而不同。只是一个抽象符号,具体含义视情况而不同
3、。这种结构具有下列特点:存在一个唯一的没有前驱的这种结构具有下列特点:存在一个唯一的没有前驱的(头)数据元(头)数据元素素;存在一个唯一的没有后继的;存在一个唯一的没有后继的(尾)数据元素(尾)数据元素;此外,每一个数;此外,每一个数据元素均有一个据元素均有一个直接前驱直接前驱和一个和一个直接后继直接后继数据元素。数据元素。2022-12-28北京联合大学信息学院2.1 线性表的逻辑结构线性表的逻辑结构v例如:英文字母表(例如:英文字母表(A,B,C,Z)是一个长度为)是一个长度为26的线性表,其中的每一个字母就是一个数据元素;的线性表,其中的每一个字母就是一个数据元素;v某公司某公司2003
4、年每月产值表(年每月产值表(400,420,500,600,650)(单位:万元单位:万元)是一个长度为是一个长度为12的线性表,其的线性表,其中的每一个数值就是一个数据元素。中的每一个数值就是一个数据元素。v上述两例中的每一个数据元素都是不可分割的,在一些复上述两例中的每一个数据元素都是不可分割的,在一些复杂的线性表中,每一个数据元素又可以由若干个杂的线性表中,每一个数据元素又可以由若干个数据项数据项组组成,在这种情况下,通常将数据元素称为成,在这种情况下,通常将数据元素称为记录记录(record)含用大量记录的线性表又称为含用大量记录的线性表又称为文件文件v例如,图例如,图2.1学生成绩表
5、就是一个线性表,表中每一个学学生成绩表就是一个线性表,表中每一个学生的成绩就是一个记录,每个记录包含六个数据项:学号、生的成绩就是一个记录,每个记录包含六个数据项:学号、姓名、高等代数姓名、高等代数。2022-12-28北京联合大学信息学院2.1 线性表的逻辑结构线性表的逻辑结构图2.1学生成绩表2022-12-28北京联合大学信息学院2.1 线性表的逻辑结构线性表的逻辑结构v矩阵也是一个线性表,但它是一个比较复杂的线性表。在矩阵也是一个线性表,但它是一个比较复杂的线性表。在矩阵中,我们可以把每行看成是一个数据元素,也可以把矩阵中,我们可以把每行看成是一个数据元素,也可以把每列看成是一个数据元
6、素,而其中的每一个数据元素又是每列看成是一个数据元素,而其中的每一个数据元素又是一个线性表。一个线性表。v因此,线性表或者是一个空表(因此,线性表或者是一个空表(n=0),或者可以写成:),或者可以写成:(a1,a2,a3,ai-1,ai,ai+1,an)。)。2022-12-28北京联合大学信息学院2.1 线性表的基本操作线性表的基本操作n数据的运算(线性表的基本操作)是定义在逻辑结构上的,而运算的具体实现则是在存储结构上。n线性表的基本运算:(1)置空表 InitList(L):将线性表L置成空表 (2)求长度 ListLength(L):求线性表L中结点个数 (3)取结点GetNode(
7、L,i):取出线性表L中第i个结点 (4)定位 Locate(L,x):在线性表L中查找x的位置 (5)插入Insert(L,x,i):在线性表L的第i个位置插入一 值为x的新结点 (6)删除Delete(L,i):删除线性表L的第i个结点2022-12-28北京联合大学信息学院2.2 线性表的顺序存储结构和实现线性表的顺序存储结构和实现n在计算机中用一组地址连续的存储单元依次存储线性表的各个在计算机中用一组地址连续的存储单元依次存储线性表的各个数据元素,称作线性表的顺序存储结构,线性表称为数据元素,称作线性表的顺序存储结构,线性表称为顺序表顺序表。2.2.1 线性表的顺序存储结构线性表的顺序
8、存储结构 在线性表的顺序存储结构中,其前后两个元素在存储空间中是紧在线性表的顺序存储结构中,其前后两个元素在存储空间中是紧邻的,且前驱元素一定存储在后继元素的前面。由于线性表的邻的,且前驱元素一定存储在后继元素的前面。由于线性表的所有数据元素属于同一数据类型,所以每个元素在存储器中占所有数据元素属于同一数据类型,所以每个元素在存储器中占用的空间大小相同,因此,要在该线性表中查找某一个元素是用的空间大小相同,因此,要在该线性表中查找某一个元素是很方便的。很方便的。假设线性表中的第一个数据元素的存储地址为假设线性表中的第一个数据元素的存储地址为Loc(a1),每一个,每一个数据元素占数据元素占d字
9、节,则线性表中第字节,则线性表中第i个元素个元素ai在计算机存储空间中在计算机存储空间中的存储地址为:的存储地址为:Loc(ai)=Loc(a1)+(i-1)*d2022-12-28北京联合大学信息学院只要确定了存储线性表的起始位置,线性表中任一元素都可随机存取,所以线性表的顺序存储结构是一种随机存取的存储结构。在程序设计语言中,通常利用数组来表示线性在程序设计语言中,通常利用数组来表示线性表的顺序存储结构。这是因为数组具有如下特表的顺序存储结构。这是因为数组具有如下特点点:(1)数据中的元素间的地址是连续的;数据中的元素间的地址是连续的;(2)数组中所有元素的数据类型相同。数组中所有元素的数
10、据类型相同。这两特点与线性表的顺序存储结构类似。这两特点与线性表的顺序存储结构类似。2022-12-28北京联合大学信息学院2.2 线性表的顺序存储结构线性表的顺序存储结构v顺序表数据类型描述 typedef int datatype#define maxsize 1024 typedef struct datatype datamaxsize;int length;sequenlist;2022-12-28北京联合大学信息学院2.2 线性表的顺序存储结构线性表的顺序存储结构n顺序表是用向量实现的线性表,向量的下标可以看成是结点的相对地址。它的特点是逻辑上相邻的结点其物理上亦相邻。2.2.2顺
11、序表上的基本运算 1.顺序表的插入操作 线性表的插入运算是指在表的第i(1 i n)个位置上,插入新结点x,使长度为n的线性表:(a1,ai-1,ai,an)变成长度为n+1的线性表:(a1,ai-1,x,ai,an)2022-12-28北京联合大学信息学院2.2.2顺序表上的基本运算2.2顺序表中插入结点的过程a1a2ai-1aiai+1ana1a2ai-1xaiai+1an插入前插入后一般情况下,在第i(1 i n)个元素之前插入一个元素时,需将第n至第i(共n-i+1)个元素向后移动一个位置。2022-12-28北京联合大学信息学院2.2.2顺序表上的基本运算i插入算法n int Ins
12、ert_Item(SeqList*L,DataType x,int i)nn int j;n if(iL-length+1)n return 0;n for(j=L-length;j=i-1;j-)n L-dataj+1=L-dataj;n L-datai-1=x;n L-Length+;n return 1;n2022-12-28北京联合大学信息学院2.2.2顺序表上的基本运算 2.顺序表的删除操作 线性表的删除运算是指将表的第i个结点删去,使长度为n的线性表 (a1,ai-1,ai,an)变为长度为n-1的线性表 (a1,ai-1,ai1,an)其删除过程如图2.3所示:2022-12-2
13、8北京联合大学信息学院2.2.2顺序表上的基本运算2.3顺序表中删除结点的过程a1a2ai-1aiai+1ana1a2ai-1ai+1an删除前删除后般情况下,删除第i(1 i n)个元素时需将从i+1至第n(共n-i)个元素向前移动一个位置。2022-12-28北京联合大学信息学院2.2.2顺序表上的基本运算v删除算法 int Delete(sequenlist*L,int i)int j;if(iL-length)return FALSE;for(j=i;jdataj=L-dataj+1;L-length=L-length-1;return TRUE;2022-12-28北京联合大学信息学
14、院算法分析(以下须xiugai)从上述两个算法来看,很显然,在线性表的顺序存储结构中插入或删除一个数据元素时,其时间主要耗费在移动数据元素上。而移动元素的次数取决于插入或删除元素的位置。假设Pi是在第i个元素之前插入一个元素的概率,则在长度为n的线性表中插入一个元素时所需移动元素次数的平均次数为假设qi是删除第i个元素的概率,则在长度为n的线性表中删除一个元素时所需移动元素次数的平均次数为2)(110ninnEniins()0()nis niiEpni2022-12-28北京联合大学信息学院算法分析如果在线性表的任何位置插入或删除元素的概率相等,即 则 可见,在顺序存储结构的线性表中插入或删除
15、一个元素时,平均要移动表中大约一半的数据元素。若表长为n,则插入和删除算法的时间复杂度都为O(n)。在顺序存储结构的线性表中其他的操作也可直接实现,在此不再讲述)1(10inqEniidel11npinqi121)1(110ninnEnidel2022-12-28北京联合大学信息学院2.3 线性表的链式存储结构和实现线性表的链式存储结构和实现v从线性表的顺序存储结构的讨论中可知,对于大的线性表,特别是元素变动频繁的大线性表不宜采用顺序存储结构,而应采用本节要介绍的链式存储结构。v线性表的链式存储结构就是用一组任意的存储单元(可以是不连续的)存储线性表的数据元素。对线性表中的每一个数据元素,都需
16、用两部分来存储:一部分用于存放数据元素值,称为数据域;另一部分用于存放直接前驱或直接后继结点的地址(指针),称为指针域,把这种存储单元称为结点。2022-12-28北京联合大学信息学院2.3 线性表的链式存储结构线性表的链式存储结构v 在链式存储结构方式下,存储数据元素的结点空间可以在链式存储结构方式下,存储数据元素的结点空间可以不连续,各数据结点的存储顺序与数据元素之间的逻辑不连续,各数据结点的存储顺序与数据元素之间的逻辑关系可以不一致,而数据元素之间的逻辑关系由指针域关系可以不一致,而数据元素之间的逻辑关系由指针域来确定。来确定。v 链式存储方式可用于表示线性结构,也可用于表示非线链式存储
17、方式可用于表示线性结构,也可用于表示非线性结构。性结构。数据域指针域2022-12-28北京联合大学信息学院n例线性表 (zhao,qian,sun,li,zhou,wu,zheng,wang)的链表存储结构.存储地址 数据域 指针域 1 li 43 7 qian 13 头指针head 13 sun 1 19 wang NULL 25 wu 37 31 zhao 7 37 zheng 19 43 zhou 25 整个链表的存取必须从头指针(链表中第一个结点的存储位置)开始进行,最后一个数据元素没有直接后继,则线性链表中最后一个结点的指针域为“空”(NULL)。312022-12-28北京联合大
18、学信息学院qianzhaowangsunlizhouwuzhenghead2022-12-28北京联合大学信息学院2.3.1 单链表1单链表单链表 线性链表中数据元素的逻辑顺序是通过链表中的指针链接次线性链表中数据元素的逻辑顺序是通过链表中的指针链接次序实现的。因此,在存储线性表中的数据元素时,一方面要存储序实现的。因此,在存储线性表中的数据元素时,一方面要存储数据元素的值,另一方面要存储各数据元素之间的逻辑顺序。数据元素的值,另一方面要存储各数据元素之间的逻辑顺序。此种形式的链表因只含有一个指针域,又称为单向链表,简此种形式的链表因只含有一个指针域,又称为单向链表,简称单链表。称单链表。图图
19、2.5(a)所示为一个空线性链表。图所示为一个空线性链表。图2.5(b)所示为一个非空线性链所示为一个非空线性链表(表(a0,a1,a2,an-1)。)。a1a2an head head (a)(b)图2.5 线性链表的存储结构2022-12-28北京联合大学信息学院2.3.1 单链表v 通常在线性链表的第一结点之前附设一个称为头结点的结通常在线性链表的第一结点之前附设一个称为头结点的结点。头结点的数据域可以不存放任何数据,也可以存放链点。头结点的数据域可以不存放任何数据,也可以存放链表的结点个数的信息。表的结点个数的信息。v 对空线性表,附加头结点的指针域为空(对空线性表,附加头结点的指针域
20、为空(NULL或或0表示),表示),用用 表示。头指针表示。头指针head指向链表附加头结点的存储位置。指向链表附加头结点的存储位置。对于链表的各种操作必须从头指针开始。单链表由头指针对于链表的各种操作必须从头指针开始。单链表由头指针唯一确定。唯一确定。2022-12-28北京联合大学信息学院2.3.1 单链表用C语言描述单链表如下:typedef int datatype typedef struct Lnode datatype data;struct Lnode*next;LinkList;LinkList*head,*L;2022-12-28北京联合大学信息学院2.3.1 单链表 在在
21、C语言中,用户可以利用语言中,用户可以利用malloc函数向系统申请分配链表结点的存储函数向系统申请分配链表结点的存储空间,该函数返回存储区的首地址,如:空间,该函数返回存储区的首地址,如:p=(LinkList*)malloc(sizeof(LinkList);指针指针p指向一个新分配的结点。指向一个新分配的结点。如果要把此结点归还给系统,则用函数如果要把此结点归还给系统,则用函数free(p)来实现。来实现。我们无法通过预先定义的标识符去访问这种动态的结点变量,而只能通我们无法通过预先定义的标识符去访问这种动态的结点变量,而只能通过指针过指针p来访问它,即用来访问它,即用*p作为该结点变量
22、的名字来访问。作为该结点变量的名字来访问。(*p).data和和(*p).next或或 p-data和和p-next。2022-12-28北京联合大学信息学院单链表上的基本操作单链表上的基本操作1.建立单链表建立单链表 假设线性表中结点的数据类型是字符,我们逐个输入字符型结点,并以假设线性表中结点的数据类型是字符,我们逐个输入字符型结点,并以“#”作为作为输入结束标志符。输入结束标志符。(1)头插法建表)头插法建表 LinkList*CreateListF()char ch;LinkList*head,*s;head=Null;ch=getchar();while(ch!=#)s=(LinkL
展开阅读全文