收藏 分享(赏)

第1章 线性表.ppt

上传人:dzzj200808 文档编号:3788549 上传时间:2018-11-18 格式:PPT 页数:220 大小:2.83MB
下载 相关 举报
第1章 线性表.ppt_第1页
第1页 / 共220页
第1章 线性表.ppt_第2页
第2页 / 共220页
第1章 线性表.ppt_第3页
第3页 / 共220页
第1章 线性表.ppt_第4页
第4页 / 共220页
第1章 线性表.ppt_第5页
第5页 / 共220页
点击查看更多>>
资源描述

1、数 据 结 构,网上的一个贴子:,数据结构在软件项目中都有哪些应用呢? 如题,我做软件项目的时候一直没感觉数据结构在项目有什么用?今天去面试,面试官突然问我数据结构,我就回答了一句我不懂数据结构,然后就直接挂掉了! 各位能给我讲讲数据结构在软件项目中的应用么? 最好举个例子了,课程性质,数据结构是计算机专业的专业基础课公共基础课、专业基础课、专业方向课、专业选修课 在教学计划中的地位:核心、承上启下前导课:高等数学、离散数学、程序设计语言后续课:数据库、操作系统、编译原理 属于武术中的“练功”科目是IT行业的核心技术,特别是软件开发人员必须掌握的内功 各种认证考试全国计算机等级考试,软件水平考

2、试的必考科目,学习要求,循序渐进,切忌心浮气躁提高课外学习的时间和内容 理解科学而不是背诵科学读书正确对待考试 作习题华罗庚:“学数学不做习题等于入宝山而空返” 作实验计算机学科是一门科学性与工程性并重的学科,表现为理论和实践紧密结合的特征。,成绩组成,平时成绩20:出勤作业 实验成绩20:上机作业检查报告 期末考试成绩60 课程设计成绩:优、良、中、及格、不及格,第 1 章 线性表,数据结构的案例应用 数据结构的研究对象 数据结构的基本概念 算法及算法分析,本章的基本内容是:,1938年出生,25岁毕业于加州理工学院数学系,博士毕业后留校任教,28岁任副教授。30岁时,加盟斯坦福大学计算机系

3、,任教授。从31岁起,开始出版他的历史性经典巨著: The Art of Computer Programming 他计划共写7卷,然而出版三卷之后,已震惊世界,使他获得计算机科学界的最高荣誉图灵奖,此时,他年仅36岁。,数据结构的创始人克努思,数据结构的兴起和发展,程序设计的实质是什么?,数据结构:将数据存储在计算机内存中 算法:计算机处理内存中数据的过程,求解问题,数据结构问题起源于程序设计,计算机是处理信息的机器。当今,随着计算机信息量的增加,信息范围的拓宽和信息结构复杂化的加深,为了编写出高质量的程序,数据结构不仅研究这些信息的数学性质,也关心如何在计算机中有效地存储和处理这些信息。程

4、序设计的实质就是为确定的问题选择一种适当的数据结构并设计一个好的算法。,程序=数据结构+算法,数据结构的研究对象,计算机求解问题的过程:提出问题抽象出问题的数学模型求模型的解问题分类:数值问题、非数值问题数 值 问 题主要是研究数学方程非数值问题主要是研究数据结构,例1 学籍管理问题表结构,数据结构的研究对象,完成什么功能?各表项之间是什么关系?,例2 人机对弈问题树结构,数据结构的研究对象,如何实现对弈?各格局之间是什么关系?,例3 教学计划编排问题图结构,数据结构的研究对象,如何表示课程之间的先修关系?,概述:数据结构是研究非数值问题中计算机的操作对象(数据元素)以及它们之间的关系和操作的

5、一门学科。,数据结构的研究对象,1.1.1 案例实现过程 【案例说明】 顺序表的就地逆置就是利用原数据表所占用的内存空间将线性表(a1,a2,an)逆置为(an,an-1,a1),并且此处要求只使用一个元素的辅助空间。程序运行结果如图 1.1 所示。,1.1 “顺序表的就地逆置”案例,图 1.1 顺序表的就地逆置,内存物理图示:,逆置,#define MAXSIZE 100 /*顺序表的最大长度*/typedef int ElemType; /*ElemType 为顺序表元素的类型*/typedef struct ElemType dataMAXSIZE; int length; /*顺序表的

6、实际长度*/SqList;SqList L;,顺序表的内存实现:,L,L.length,L.data0, , L.data99,(1) 掌握线性表的顺序存储结构。 (2)掌握顺序表的基本运算并能灵活应用。 【技术要点】 (1) 先要设计和实现数据的计算机内存中的存储形式 (2) 空表或长度为 1 的表,不做任何处理。 (3) 表长大于或等于 2 时,做如下处理:设两个整型变量 i 和 j,分别指向顺序表的第 0个元素和尾元素。若 ij,首先交换 ai和 aj,然后修改指针,i+和 j-,使它们分别指向顺序表的第 2 个元素和倒数第 2 个元素,依次类推,直到 ij 为止。 因为基本操作是对应元

7、素的交换运算,假设顺序表的长度为 n,则需要进行 n/2 次交换,所以时间复杂度为 O(n)。,【案例目的】,内存物理图示:,Main.L: 2000h,L-data0 L-data1 L-data2 L-data3 L-data4L- length*L n i j t,49,38,65,97,76,5,2000h,5,L-data0 L-data1 L-data2 L-data3 L-data4L- length*L n i j t,49,38,65,97,76,5,5,0,4,49,1,3,38,数据输入:,数据逆置:,【代码及分析】,#define MAXSIZE 100 /*顺序表的最

8、大长度*/ typedef int ElemType; /*ElemType 为顺序表元素的类型*/ typedef struct ElemType dataMAXSIZE; int length; /*顺序表的实际长度*/SqList; void Reverse_SqList(SqList *L) int i,j,n,t;n=L-length;if(n=0|n=1) return;i=0;j=n-1;while(idatai; L-datai=L-dataj; L-dataj=t;i+; j-; ,void Creat_SqList(SqList *L,int n) int i;L-leng

9、th=n;i=0;printf(“ninput %d data : “,n);while(idatai); /*49 38 65 97 76 13 21*/i+; ,void Print_SqList(SqList *L) int i,n;n=L-length;i=0;printf(“noutput %d data : “,n);while(idatai);i+; void main()SqList L;int n;printf(“ninput length( n) : “);scanf(“%d“,1.1.2 应用扩展,已知顺序表中的元素以值递增的顺序排列,删除顺序表中所有值相同的多余元素,使

10、操作后顺序表中所有元素的值均不相同。/*删除有序顺序表中所有值相同的多余元素*/int Del_SqList(SqList *L)int i,j,k ;int n=L-length;int count=0;ElemType t; /*辅助变量t,用于存储当前数据*/,for(i=0;idatai;for (j=i+1;jdataj = = t)count+;else break; if( count != 0 ) /*说明当前数据有多个相同的*/ for(k=j;kdatak-count= L-datak;n=n-count; /*元素个数减 count*/ count=0; /* count

11、 清 0,为删除下一个元素的重复元素做准备*/ L-length=n; ,L-data0 L-data1 L-data2 L-data3 L-data4 L-data5 L- length i j Countt t,0,56,1,0,2,3,2,1,56,56,56,28,17,17,/*删除与当前元素重复的 count 个多余元素*/,6,4,1.1.3 相关知识及注意事项,数据(Data):是客观事物的数字、字符以及所有能输入到计算机中并能被计算机程序识别和处理的符号集合。数值数据:整数、实数等,主要用于工程计算、科学计算和商务处理等 。非数值数据:图形、图象、声音、文字等 数据元素(Da

12、ta Element) :数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理。 数据项:构成数据元素的不可分割的最小单位。 数据对象:具有相同性质的数据元素的集合。,1.数据结构的基本概念,数据、数据元素、数据项之间的关系:,包含关系:数据是由数据元素组成,数据元素是由若干个数据项组成。数据元素是讨论数据结构时涉及的最小数据单位,其中的数据项一般不予考虑。,数据元素(记录、元组),数据项,数据结构(Data Structure) :是指按照某种关系组织起来的一组数据,按照一定的存储表示方式把它存储在计算机内存中,并在这些数据上定义了一组操作的集合。,数据结构一般包括以下 3 个方面的

13、内容:数据的逻辑结构、数据的存储结构以及数据的运算。,程序设计好算法好数据结构,同样的数据对象,用不同的数据结构来表示,运算效率可能有明显的差异。,数据结构涵盖的内容,集合结构: 数据元素仅同属一个集合 线性结构: 数据元素之间存在一对一(1:1) 、有先后顺序的关系树 结 构: 数据元素存在一对多(1:n)的层次关系图 结 构:数据元素存在多对多 (m:n)的任意关系,非线性,线 性,逻辑结构可细分为4类:,答:指数据元素之间的逻辑关系。即从逻辑关系上描述数据,它与数据的存储无关,是独立于计算机的。,解释1: 什么叫数据的逻辑结构?,数据的逻辑结构是从具体问题抽象出来的数学模型。,(1) S

14、 =(D ,R)D= a, b, c, d, e, f R=, , , , ,解: 上述表达式可用图形表示为:,b c a e f d,此结构为线性的。,例:用图形表示下列数据结构,并指出它们是属于线性结构还是非线性结构。,在形式上,数据的逻辑结构可以用一个二元组来表示:,Data_Structure=(D,R) 其中,D是数据元素的有限集,R是D上关系的有限集。,d1d5 d2d4 d3,该结构是非线性的。,解:上述表达式可用图形表示为:,(2) S =(D, R) D=di | 1i5 R=, ij,思考题:,答:数据的存储结构亦称物理结构,是数据的逻辑结构在计算机存储器内的表示(或映像)

15、。它依赖于计算机。,存储结构可分为4大类:,顺序、链式、索引、散列,解释2:什么叫数据的物理结构?,存储结构实质上是内存空间的使用和实现,在程序实现时,依赖于具体的计算机语言。,存入内存,内存条,1) 顺序存储方式:用一组连续的存储单元依次存储数据元素,数据元素之间的逻辑关系由元素的存储位置来表示。,例:线性表(bat, cat, eat)的两种存储方式:,2) 链接存储方式:用一组任意的存储单元存储数据元素,数据元素之间的逻辑关系用指针来表示 。,例:(bat, cat, eat),bat 0200,cat 0325,eat,数据的运算是CPU在数据对象上所施加的一系列操作,目的是靠CPU对

16、数据对象的高速运算来解决问题的需求。 数据的运算是定义在逻辑结构上的,而运算的具体实现是要控制CPU在存储结构上进行。每种逻辑结构都有相应的一个运算集合。,解释3:什么是数据的运算?,最常用的数据运算有 5 种:,插入、删除、修改、查找、排序,逻辑结构和存储结构之间的关系,数据的逻辑结构属于用户视图,是面向问题的,反映了数据内部的构成方式;数据的存储结构属于具体实现的视图,是面向计算机的。一种数据的逻辑结构可以用多种存储结构来存储,而采用不同的存储结构,其数据处理的效率往往是不同的。,数据结构的基本概念(小结),数据的操作:插入、删除、修改、查找、排序等,1) 算法(Algorithm):是让

17、计算机(CPU)对特定问题求解步骤的一种描述,是指令的有限序列。,2) 算法的五大特性: 输入:一个算法有零个或多个输入,它们是在算法开始前赋给算法(CPU)最初的数据。 输出:一个算法有一个或多个输出。 有穷性:一个算法必须总是在执行有穷步之后结束,且每一步都在有穷时间内完成。 确定性:算法中的每一条指令必须有确切的含义,对于相同的输入只能得到相同的输出。 可行性:算法描述的操作可以通过已经实现的基本操作执行有限次来实现。,2 .算法及算法分析,足够的情报,欧几里德算法(CPU的计算过程),m,n,r,例:欧几里德算法辗转相除法求两个自然数 m 和 n 的最大公约数r之计算过程。,常用时间复

18、杂度来衡量,正确性、可读性、健壮性、高效率与低存储量需求,常用空间复杂度来衡量,3. 算法的描述,优点:容易理解 缺点:冗长、二义性 使用方法:粗线条描述算法思想 注意事项:避免写成自然段,1)自然语言,软件设计师可以使用各种不同的方法来描述算法。, 输入m 和n; 求m除以n的余数r; 若r等于0,则n为最大公约数,算法结束;否则执行第步; 将n的值放在m中,将r的值放在n中; 重新执行第步。,例:欧几里德算法的描述。,自然语言,优点:流程直观 缺点:缺少严密性、灵活性 使用方法:描述简单算法 注意事项:注意抽象层次,2)流程图,流 程 图,例:欧几里德算法的流程图表示。,优点:能由计算机执

19、行 缺点:抽象性差,对语言要求高 使用方法:算法需要验证 注意事项:将算法写成子函数,3)程序设计语言,#include int CommonFactor(int m, int n) int r=m % n;while (r!=0) m=n;n=r;r=m % n;return n; void main( ) coutCommonFactor(63, 54)endl; ,程序设计语言,例:欧几里德算法的程序设计语言表示。,伪代码(Pseudocode):介于自然语言和程序设计语言之间的方法,它采用某一程序设计语言的基本语法,操作指令可以结合自然语言来设计。 优点:表达能力强,抽象性强,容易理解

20、,4) 伪代码,1. 输入m和n;2. r = m % n;3. 循环直到 r 等于02.1 m = n;2.2 n = r;2.3 r = m % n;4. 输出 n ;,伪 代 码,例:欧几里德算法的伪代码描述。,4. 算法分析,2)进行算法评价有两个具体的目的: 一方面在于从解决问题的不同算法中选择较为合适的一种;另一方面在于对现有的算法进行改进,从而设计出更好的算法。,1)算法分析(Algorithm Analysis):主要是对算法所需要的计算机资源时间和空间进行估算,以确定算法的优劣。,时间复杂性(Time Complexity) 空间复杂性(Space Complexity),3

21、)评价一个算法的优劣指标: (1)算法首先应该是正确的; (2)其次还要考虑以下 3 个因素:,一个好的算法应有效地使用存储空间和有较高的时间效率,执行算法所耗费的时间; 执行算法所耗费的存储空间,其中主要考虑辅助存储空间; 算法应易于理解,易于编码,易于调试等。,(1) 算法的时间复杂度分析,算法的执行时间每条语句执行时间之和,a=5; for (i=1; i=n; i+)for (j=1; j=n; j+)x+;,c2,c1,c,取决于,取决于,基本语句:是执行次数与整个算法的执行次数成正比的操作指令。 问题规模:运算量的多少。,a=5; for (i=1; i=n; i+)for (j=

22、1; j=n; j+)x+;,基本语句:x+; 问题规模:n,算法分析要素:,定义: 若存在两个正的常数c和n0,对于任意nn0,都有T(n)cf(n),则称T(n)=O(f(n),理解为:当问题规模充分大时在渐近意义下的阶。,算法分析大O符号,定理:若A(n)=amnm+am-1nm-1+a1n+a0是一个m次多项式,则A(n) O(nm)。,说明:在计算算法时间复杂度时,可以忽略所有低次幂和最高次幂的系数。,例如,一个算法中语句执行次数为 T(n)n2+8n+5则 T(n) (n2)。,例1-5 +x; 例1-6 for (i=1; i=n; +i)+x; 例1-7 for (i=1; i

23、=n; +i) for (j=1; j=n; +j)+x; 例1-8 for (i=1; i=n; +i)for (j=1; j=i-1; +j) +x;,算法分析,T(n)=C O(1),T(n)=n*c O(n),T(n)=n*n*c O(n2),T(n)=(0+1+2+(n-1)*c =(n*(n-1) /2)*c =c*n2/2-c*n/2 O(n2),例1-9 for (i=1; i=n; +i)for (j=1; j=n; +j)cij=0;for (k=1; k=n; +k)cij+=aik*bkj;,算法分析,T(n)=c1*n2+c2*n3O(n3),c1,c2,(1)(lo

24、g2n)(n)(nlog2n)(n2)(n3) (2n)(n!),常见的时间复杂度按数量级递增排列为:,概述:很多算法的时间复杂度不仅是问题规模 n 的函数,还与它所处理的数据对象的状态有关。这时,通常是根据数据对象可能出现的最好情况和最坏情况估计出算法的最好时间复杂度和最坏时间复杂度。有时,对数据对象的分布作出某种假设(如等概率),并讨论算法的平均时间复杂度。,最好情况、最坏情况、平均情况:,例:在一维整型数组An中顺序查找与给定值k相等的元素(假设该数组中有且仅有一个元素值为k)。,int Find(int A , int n) int i;for (i=0; in; i+)if (Ai=

25、 =k) break;return i; ,基本语句的执行次数是否只和问题规模有关?,k=80; A10=10,0,-82,55,73,90,100,80,43,-59; B10=10,0,-82,55,73,90,100,43,-59,80; C10=10, 80,0,-82,55,73,90,100, 43,-59;,否,算法的空间复杂度记作 S(n):是指该算法在运行过程中所耗费的辅助存储空间,它也是问题规模 n 的函数。 若一个算法所耗费的辅助存储空间与问题规模 n 无关,记作 S(n)=(1)。,算法所耗费的存储空间包括 3 部分,即算法本身所占用的存储空间、算法的输入/输出所占用的

26、存储空间和算法在运行过程中临时占用的辅助存储空间。,(2)空间复杂度,内存条,a b,输入/输出,算法本身所占用的存储空间,小结知识结构图,作业:,公元5世纪末,我国古代数学家张丘建在它所撰写的算经中,提出这样一个问题:“鸡翁一,值钱五;鸡母一,值钱三,鸡雏三,值钱一,百钱买百鸡,问鸡翁、母、雏各几何?”意思是说公鸡每只5元,母鸡每只3元,小鸡3只1元,用100元钱买100只鸡,求公鸡、母鸡、小鸡的只数。试设计算法求解该问题,并分析你所设计的算法的时间复杂度。(要求:算法分别用伪代码和C描述),3线性结构及其特点,线性表的逻辑结构线性表的顺序存储及实现线性表的链接存储及实现顺序表和单链表的比较

27、线性表的其他存储及实现,本节的基本内容是:,3线性结构及其特点,线性结构的特点如下:数据对象中的数据元素之间,具有先后的、线性的、一维的关系, 存在唯一的一个被称为“第一个”的数据元素,即开始结点; 存在唯一的一个被称为“最后一个”的数据元素,即终端结点; 除了第一个数据元素外,集合中的每个数据元素均只有一个前驱; 除了最后一个数据元素之外,集合中的每个元素均只有一个后继。,线性结构中的最后一个元素。,线性结构中的第一个元素。,前驱,后继,1)学生成绩登记表,举例,姓 名,英语,数据结构,高数,学号,丁一,96,78,87,0101,李二,87,90,78,0102,张三,67,86,86,0

28、103,孙红,69,81,96,0104,王冬,87,74,66,0105,#define MAXSIZE 100 /*顺序表的最大长度*/ typedef struct nodechar numbo4; char name20;int sujg,yy,gs; ElemType; /*ElemType 为顺序表元素的类型*/ typedef struct ElemType dataMAXSIZE;int length; /*顺序表的实际长度*/SqList; /*定义用于自家程序的数据类型*/ SqList L; /*定义顺序表 L*/,2)职工工资登记表,姓 名,岗位津贴,基本工资,奖金,职

29、工号,丁一,600,278,200,0101,李二,300,190,100,0102,张三,300,186,100,0103,孙红,500,218,200,0104,王冬,300,190,100,0105,数据元素之间的关系是什么?,#define MAXSIZE 100 /*顺序表的最大长度*/ typedef struct nodechar numbo4; char name20;int jbgz,gwjt,jj,zsr,kk,sfgz; ElemType; /*ElemType 为顺序表元素的类型*/ typedef struct ElemType dataMAXSIZE;int len

30、gth; /*顺序表的实际长度*/SqList; /*定义用于自家程序的数据类型*/ SqList L; /*定义顺序表 L*/,线性表:简称表,是n(n0)个具有相同类型的数据元素的有限序列。通常记为L(a1, a2 , , ai-1, ai , , an)。 线性表的长度:线性表中数据元素的个数。 空表:长度等于零的线性表,记为:L=( )。 非空表记为:L(a1, a2 , , ai-1, ai , , an),线性表,其中,ai(1in)称为数据元素; 下角标 i 表示该元素在线性表中的位置或序号。,线性表的图形表示,线性表(a1, a2 , , ai-1, ai , , an)的图形

31、表示如下:,线性表的特点,1.有限性:线性表中数据元素的个数是有穷的。,2.相同性:线性表中数据元素的类型是相同的。,3.顺序性:线性表中相邻的数据元素ai-1和ai之间存在序偶关系(ai-1, ai),即ai-1是ai的前驱, ai是ai-1的后继;对于非空的线性表,有且仅有一个开始结点a1 ,它无前驱,仅有一个后继;有且仅有一个终端结点an ,它无后继,仅有一个前驱 。其它每个元素有且仅有一个前驱和一个后继,前驱,后继,无前驱,无后继,线性表的基本运算,(1) 初始化运算 Init_List ()前置条件:表不存在输入:无功能:表的初始化输出: 无后置条件:建一个空表,内存条,0,void

32、 Init_List (Seqlist *L) L-length=0; void main() Seqlist L;Init_List( ,L.data,L.length,(2)求表的长度 Length_List(L)前置条件:表已存在输入:无功能:求表的长度输出:表中数据元素的个数 后置条件:表不变,内存条,4,int Length_List(Seqlist *L) return(L-length); ,(3)取表的元素 Get_List(L,i) 前置条件:表已存在输入:元素的序号i功能:在表中取序号为i的数据元素输出:若i合法,返回序号为i的元素值,否则抛出异常后置条件:表不变,Elem

33、Type Get_List(Seqlist *L,int i) if( iL-length)printf(“位置不合法”); exit(0);return( L-datai-1); ,(4)定位运算 Locate_List(L,x) 前置条件:表已存在输入:数据元素x功能:在线性表中查找值等于x的元素输出:若查找成功,返回x在表中的序号,否则返回0后置条件:表不变,(5) 插入运算 Insert_List(L,i,x) 前置条件:表已存在输入:插入i;待插x功能:在表的第i个位置处插入一个新元素x输出:若插入不成功,抛出异常后置条件:若插入成功,表中增加一个新元素(6) 删除运算 Delete

34、_List(L,i) 前置条件:表已存在输入:删除位置i功能:删除表中的第i个元素输出:若删除成功,返回被删元素,否则抛出异常后置条件:若删除成功,表中减少一个元素,(6) 判断表是否为空 Empty(L)前置条件:表已存在输入:无功能:判断表是否为空输出:若是空表,返回1,否则返回0后置条件:表不变,进一步说明: (1)线性表的基本操作根据实际应用是而定; (2)复杂的操作可以通过基本操作的组合来实现; (3)对不同的应用,操作的接口可能不同。,5线性表的顺序存储结构及实现,顺序表线性表的顺序存储结构,例:(34, 23, 67, 43),34,23,67,43,4,存储要点,用一段地址连续

35、的存储单元,依次存储线性表中的数据元素 逻辑关系相邻的两个元素,在物理位置上也相邻 元素之间的逻辑关系是通过下标反映出来,顺序表线性表的顺序存储结构,例:(34, 23, 67, 43),34,23,67,43,存储空间的起始位置,4,用什么属性来描述顺序表?,顺序表的容量(最大长度),例:(34, 23, 67, 43),34,23,67,43,4,如何实现顺序表的内存分配?,如何求得任意元素的存储地址?,0 i-2 i-1 n-1 Max-1,a1,ai-1,ai,an,空闲,长度,顺序表,一般情况下,(a1,a2,, ai-1,ai , , an)的顺序存储:,0 i-2 i-1 n-1

36、 Max-1,a1,ai-1,ai,an,空闲,长度,Loc(ai)=Loc(a1) + (i -1)c,随机存取:在O(1)时间内存取数据元素,顺序表,一般情况下,(a1,a2,, ai-1,ai , , an)的顺序存储:,存储结构是数据对象及其逻辑结构在计算机(内存条)中的表示;存取结构是在一个数据结构上对查找操作的时间性能的一种描述。,存储结构和存取结构,“顺序表是一种随机存取的存储结构”的含义为:在顺序表这种存储结构上进行的查找操作,其时间性能为O(1)。,顺序表的声明,#define MAXSIZE 100 /*顺序表的最大长度*/ typedef int ElemType; /*

37、ElemType 为顺序表元素的类型*/ typedef struct ElemType dataMAXSIZE;int length; /*顺序表的实际长度*/SqList;/*定义用于自家程序的数据类型*/ SqList L; /*定义顺序表 L*/,一维数组可以用来描述顺序表,但考虑到顺序表的长度(数据元素个数)是不断变化的,所以通常将一维数组和顺序表的长度封装成一个结构体来描述顺序表。,#define MAXSIZE 100 /*顺序表的最大长度*/ typedef struct node char name20;char num117,num217,num317;char addr3

38、0,qq11;char e_mail15; ElemType;/*ElemType 为顺序表元素的类型*/ typedef struct ElemType dataMAXSIZE;int length; /*顺序表的实际长度*/SqList; /*定义用于自家程序的数据类型*/ SqList L; /*定义顺序表 L*/,顺序表声明的一个实例:手机通讯录管理程序设计。,Main.L: 2000h,数组a: a0 a1 a2 a3 a4n,49,38,65,97,76,5,L-data0 L-data1 L-data2 L-data3 L-data4L- length*L n i j t,49,

39、38,65,97,76,操作接口:SeqList(SqList *L ,ElemType a,int n),5,顺序表的建立:,void SeqList(SqList *L ElemType a , int n) if (nMaxSize) printf( “参数非法n“);exit(0);for (i=0; idatai=ai;L-length=n; ,顺序表的建立,算法描述:,概述:是指在线性表第 i 个位置上插入一个值为 x 的新元素,使原来长度为 n 的线性表(a1,a2,ai-1,ai,ai+1,an)变成长度为 n+1 的线性表(a1,a2,ai-1,x,ai,ai+1,an)。其

40、中,i 的取值范围为 1in+1。插入前:(a1, , ai-1, ai, , an)插入后:(a1, , ai-1, x , ai, , an),2) 顺序表基本运算的实现,ai-1和ai之间的逻辑关系发生了变化,顺序存储要求存储位置反映逻辑关系,存储位置要反映这个变化,(1) 插入操作 Insert_SqList(&L,i,x),L-data0 L-data1 L-data2 L-data3 L-data4 L-data5L- length*L i x,49,38,65,97,76,5,33,Main.L: 2000h,L-data0 L-data1 L-data2 L-data3 L-d

41、ata4 L-data5L- length*L i x,49,38,65,97,76,33,+1,6,例:(49,38,65,97,76),在i=2的位置上插入33。,注意序号和下标之间的关系,表满:length=MaxSize 合理的插入位置:1ilength+1(i指的是元素的序号),什么时候不能插入?,注意序号和下标之间的关系,1. 如果表满了,则抛出上溢异常; 2. 如果元素的插入位置不合理,则抛出位置异常; 3. 将最后一个元素至第i个元素分别向后移动一个位置; 4. 将元素x填入位置i处; 5. 表长加1;,算法描述伪代码,void Insert_SqList(SqList *L,

42、 int i,ElemType x) int j;if(L-length=MAXSIZE) printf(“表满“); exit(0); /*表已满,不能插入*/if( iL-length+1 ) /*检查插入位置的正确性*/ printf(“位置错“); exit(0); for( j=L-length; j=i ; j-)L-dataj=L-dataj-1; /*移动元素*/L-datai-1=x; /*插入新元素*/L-length+; /*修改表长 length 的值*/ ,算法描述C描述,基本语句?,注意序号和下标之间的关系,最好情况:在表尾插入,即当 i=n+1 时,不需要移动元素

43、 , 基本语句执行0次,时间复杂度为O(1)。最坏情况:是在表头插入,即当 i=1 时,从 a1到 an都要向后移动一个位置,共需要移动 n 个元素。 基本语句执行n+1次,时间复杂度为O(n)。平均情况(1in+1):,时间性能分析,顺序表的插入运算,其时间主要耗费在移动元素上,而移动元素的个数取决于插入元素的位置。,时间复杂度为O(n)。,删除前:(a1, , ai-1,ai,ai+1,an) 删除后:(a1,ai-1,ai+1, ,an),ai-1和ai之间的逻辑关系发生了变化,顺序存储要求存储位置反映逻辑关系,存储位置要反映这个变化,(2) 删除操作 Delete_SqList(&L,

44、i),是指删除线性表中的第 i 个元素,这时只需将 ai+1,an依次向前移动 1 个位置,这样元素 ai即被删除。,Main.L: 2000h,L-data0 L-data1 L-data2 L-data3 L-data4 L-data5L- length*L i x,49,38,65,97,76,5,例: (49,38,65,97,76),删除i=2的数据元素。,-1,4,注意序号和下标之间的关系,表空:length=0,什么时候不能删除?,0,合理的删除位置:1ilength(i指的是元素的序号),0 1 2 3 4,5,35,33,12,24,42,1 2 3 4 5,i,注意序号和下

45、标之间的关系,1. 如果表空了,则抛出下溢异常; 2. 如果元素的删除位置不合理,则抛出位置异常; 3. 将第i个元素至最后一个元素分别向前移动一个位置; 4. 表长减1;,算法描述伪代码,算法源代码如下:,void Delete_SqList(SqList *L,int i) int j;if(L-length=0) printf(“表空n“); exit(0); /*表已空不能删除*/if(iL-length) /*检查删除位置的合法性*/ printf(“不存在第 i 个元素n “); exit(0); for(j=i-1;jlength-1;j+)L-dataj=L-dataj+1;

46、/*向前移动*/L-length-; ,注意序号和下标之间的关系,时间性能分析,顺序表的插入运算,其时间主要耗费在移动元素上,而移动元素的个数取决于删除元素的位置。,在顺序表上作删除运算时,大约需要移动表中一半的元素,其时间复杂度为 O(n)。,(3) 定位操作 Locate_SqList(&L,x),概述:是指在线性表中查找第一个与给定值 x 相等的元素。,例如: (49,38,65,97,76),中查找值为97的元素,返回在表中的序号。,int L_seqlist(Seqlist *r,Elemtype x) int i=0;while(ilength) if(r-datai=x)brea

47、k;i+;if(i=r-length) return -1;else return i+1; ,Main.L: 2000h,L-data0 L-data1 L-data2 L-data3 L-data4 L-data5L- length*L i x,49,38,65,97,76,5,0,1,3,2,注意序号和下标之间的关系,算法思想:从顺序表的第 1 个元素开始向后依次查找,若某个元素的值等于 x,则返回它在顺序表中的位序;否则,若表中不存在值为 x 的元素,则返回-1。,时间复杂度?,O(n),算法源代码如下:,int Locate_SqList(SqList *L, ElemType x) int i=0;while( ilength ,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 大学课件

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报