数据结构第2章 线性表 教案

合集下载

实用数据结构电子教案第二章 数组与线性表

实用数据结构电子教案第二章 数组与线性表
当i=n时,则循环一次也不执行,只是将 元素数目n比原来减少一个,而第n个数 据元素不必再考虑,其余的各单元的元 素均维持不变,这是最好的情况。
第二章 数组与线性表
3. 算法的时间复杂性
可以用数据元素的移动次数来度量这两个算 法的时间复杂性。
插入时,最少循环0次,最多循环n次,如i 的各种取值概率相同,则平均循环次数为 n/2;
else {
x=ST[top]; top=top-1; /*栈顶位置下移*/ } }
第二章 数组与线性表
2.3.2 堆栈的应用
1. 堆栈在函数调
A1
用中的应用:
设有三个函数A1,
A2
A2,A3,这三个 r
函数有如下的调 用关系:函数A1
在其函数体的某
A3 t
处r调用函数A2,
函数A2又在其函
数体某处t调用函
计算机处理表达式时,常把运算符放在两个 运算数的后面或前面。
1. 把运算符放在两个运算数的后面,例如 AB+ , 称为后缀形式,也叫做波兰式 。
2. 把运算符放在两个运算数的前面,例如 +AB, 则称做前缀形式,也叫做逆波兰表达式。
第二章 数组与线性表
算术表达式的不同运算符有不同的运算优先 顺序,如,在没有括号时,乘除运算(*或/) 要比加减运算(+或-)优先进行。
数据结构数据结构第二章数组与线性表第二章数组与线性表第第二数组与线性表数组与线性表数组的基本特点及寻址方式线性数据结构的基本特征和基本运算堆栈的定义和基本运算队列的定义和基本运算循环队列的特征运算以及判断溢出的条件与普通队列的差别堆栈队列的简单应用循环队列的特点及判断溢出的条件利用本章的基本知识设计有效的算法解决与线性相关的应用问题第二章数组与线性表熟练掌握以下内容

最新数据结构李春葆 第2章 线性表讲解学习

最新数据结构李春葆 第2章  线性表讲解学习
该运算顺序查找第1个值域与e相等的元素的逻辑位序。若这样 的元素不存在,则返回值为0。
int LocateElem(SqList *L, ElemType e) { int i=0;
while (i<L->length && L->data[i]!=e) i++; if (i>=L->length) return 0; else return i+1; }
(3)判线性表是否为空表ListEmpty(L):若L为空表,则 返回真,否则返回假。
(4)求线性表的长度ListLength(L):返回L中元素个数。
(5)输出线性表DispList(L):当线性表L不为空时,顺序 显示L中各节点的值域。
(6)求线性表L中指定位置的某个数据元素 GetElem(L,i,&e):用e返回L中第 i(1≤i≤ListLength(L))个 元素的值。
地址 100 130 160 190 210
区号 010 021 027 029 025
城市名 Beijing Shanghai Wuhan Xian Nanjing
说明 首都 直辖市 湖北省省会 陕西省省会 江苏省省会
2.2.2 顺序表基本运算的实现
一旦采用顺序表存储结构,我们就可以用C/C++语言实 现线性表的各种基本运算。为了方便,假设ElemType为 char类型,使用如下自定义类型语句:
L->length=0;
0
}
返回到main()
后实参sq没有 sq
变化!!!
???
(2)使用引用的情况
main:
main()
{ SqList *sq;

《数据结构(C语言版)》电子教案第2章

《数据结构(C语言版)》电子教案第2章

数据元素,返回一特殊值(例如0),表示查找失败。
(5) 插入元素Inselem (L,i,x) 在线性表L的第 i 个位置上插入一个值为 x 的新元素,这样 使原序号为 i , i+1, ..., n 的数据元素的序号变为 i+1,i+2, ..., n+1,要求1≤i≤Getlen(L)+1,插入后原表长增1。 (6) 删除元素Delelem(L,i) 在线性表L中删除序号为i的数据元素,删除后使序号为 i+1, i+2,..., n 的元素变为序号i, i+1,...,n-1,要求1≤i≤Getlen(L), 删除后表长减1。
typedef int ElemType //在实际应用中,将ElemType定义成实际类型 typedef struct{ ElemType data[MaxLen]; //定义存储表中元素的数组 int length; //线性表的实际长度 }sqList; sqList L; //定义表结构的变量
E in
2012-9-12

i 1
n 1
p i ( n i 1)
1 n 1

i 1
n 1
( n i 1)
n 2
18
由此可以看出,在线性表上做插入操作需要移动表中一 半的数据元素,当n较大时,算法的效率是比较低的,所以 在线性表上进行插入操作的时间复杂度为O(n)。 6.顺序表的删除运算Delelem(L,i)的实现 顺序表的删除运算是指将表中第 i 个元素从线性表中去
i+1。
线性表是一种典型的线性结构。 数据的运算是定义在逻辑结构上的,而运算的具体实现则 是在存储结构上进行的。
2012-9-12

线性表详细教案

线性表详细教案

教案学科名称:计算机导论课题:数据结构基础(新课)教学目标:让学生了解数据结构在信息技术中的重要性,为让学生通过学习数据结构基础,能过更好的学习算法和程序设计。

教学内容:向学生阐述数据结构的运用和几种典型的数据结构(线性表、堆栈、队列)及其定义和特征。

教学重点:了解什么是数据结构,数据结构的类型的表现和实现。

教学难点:熟悉几种典型数据结构(线性表、堆栈、队列)的运算及其存储方式。

教学策略:讲授法,演示法,和操练法。

举一些典型的例子,演示数据结构的存储和区别,主要以幻灯片的方式来演示。

教学过程:一数据结构含义(提问:什么是数据结构?)所谓数据结构是带有结构的数据元素的集合,结构反映了数据元素相互之间存在的某种联系。

(这里所说的“数据”,是指描述客观事物的数、字符以及所有能输入到计算机并且被计算机处理的符号的集合。

因此,在计算机科学技术中,“数据”的含义是十分广泛的,它不仅可以是数值,其他如字符、图形、图像、乃至声音等信息都可以视为数据。

数据集合中每一个个体称为数据元素,它是数据的基本单位。

)(1)不同角度看数据结构学科角度:数据结构是计算机科学技术的一个分支,它主要研究数据的逻辑结构(即数据元素之间的逻辑关系)和物理结构(即数据在计算机中是如何表示的)以及它们之间的关系。

课程角度:数据结构是计算机科学技术的一门重要的专业基础课,其中系统介绍线性表、堆栈、队列、串、数组和广义表、树、图等基本类型的数据结构及其相应的运算的实现算法。

二、几种典型的数据结构1、线性表(1)线性表的定义(提问:看到线性表会联想到什么?{数轴}、坐标)线性表是一种简单且最常用的数据结构。

一个线性表是n个数据元素的有序列,每一个数据元素根据不同的情况可以是一个数、一个符号或者一个记录等信息。

例如:英文字母表(A,B,C,D,E,…,Z)就是一个线性表,其中的数据元素就是单个的字母。

数据元素、数据项数据元素是数据的基本单位,它也可以再由不可分割的数据项组成。

《数据结构》课程课件第二章线性表

《数据结构》课程课件第二章线性表

Step2:数据域赋值
插入后: Step3:插入(连接)
X q
(1)式和(2)式的顺序颠倒,可以吗?
4、插入元素(在第i个元素之前插入元素e)
为什么时间复杂度不再是O(1)?
第i-1个元素
第i个元素
p
s
新插入元素
5、删除p所指元素的后继元素
P
删除前:
P->next P->next->next
删除:
五、线性表ADT的应用举例
Void mergelist(list La,list Lb,list &Lc)
{ //已知线性表La和Lb中的数据元素按值非递减排列
//归并La和Lb得到新的线性表Lc,Lc中的元素也按值非递减排列
例: 将两个各有n个元素的有序表归并成一个有序表, 其最小的比较次数是( )。 A、n B、2n-1 C、2n D、n-1
三、线性表的ADT
四、线性表的分类
五、线性表ADT的应用举例
例1:已知有线性表L,要求删除所有X的出现
五、线性表ADT的应用举例
例2: 已知有两个分别有序的线性表(从小到大),要 求合并两个线性表,且合并后仍然有序。——归并 方法1: 合并,再排序O((m+n)2)
方法2: 归并,利用分别有序的特点O((m+n))
二、线性表上常见的运算
8、删除 Delete(L,i):删除线性表的第i个元素 删除前 a1 a2 … ai-1 ai ai+1 … an 删除后 a1 a2 … ai-1 ai+1 … an 9、判断是否为空 Empty(L):线性表空,则返回TRUE, 否则FALSE 10、输出线性表 Print(L):输出线性表的各个元素 11、其它操作 复制、分解、合并、分类等

第2章 线性表 (数据结构教程PPT课件)

第2章 线性表 (数据结构教程PPT课件)

3.在数组a中检索(查找)值为X的数据元素
int locate (int a[ ],int n, int x) { int i; i=0; while((i<=n-1)&&(a[i]!=x)) i++; if(i<=n-1) return (i); /*返回的是存储位置*/ else return (0);} }
(2)按值查找即定位 Locate_LinkList(L,x) Lnode * Locate_LinkList( LinkList L, datatype x) /*在单链表L中查找值为x的结点,找到后 返回其指针,否则返回空*/ { Lnode * p=L->next; while ( p!=NULL && p->data != x) p=p->next; return p; }
2.2.2 典型操作的算法实现
1. 初始化线性表L
SeqList *init_SeqList( )
{ SeqList *L; L=malloc(sizeof(SeqList)); L->last=-1; return L; }
2.在数组a第i个数据元素之(ai-1)前插入数据 元素X insert (int a[ ],int n,int i, int x) { int j; for(j=n-1;j>=i-1;j--) a[j+1]=a[j]; /* 结点移动 */ a[i-1]=x; /*新元素插入*/ n++; /*修改长度*/ }
4.删除数组a第i个数据元素(ai-1) delete (int a[ ],int n,int i) { int j; for(j=i;j<=n;j++) a[j-1]=a[j]; /* 结点移动 */ n--; /*修改长度*/ }

数据结构(Java版)-电子教案 第二章 线性表

数据结构(Java版)-电子教案  第二章 线性表

元素ai-1的后面和第i+1个元素ai+1的前面,这种位置上有序性就
是一种线性关系,所以线性表是一个线性结构,用二元组表示为
❖ L = (D,R)
❖ 其中:
❖ D = {ai|1<=i<=n,n>=0,ai属ElemType类型}, ElemType是自定义的类型标识符
❖ R = {r}
❖ r = {<ai,ai+1>|1<=i<=n-1}
❖ Loc(ai) = Loc(a0) + m*(i-1)

在java语言中,定义一个数组(使用new关键字)就分配了一块可供
用户使用的存储空间,因此,线性表的顺序存储和结构通常利用数组来实现
的,数组的基本类型就是线性表中元素的类型,数组的大小(数组的上界-
下界+1值,它等于数组包含的元素个数)要大于等于线性表的长度。的逻辑结构
2.2
线性表的顺序存储结构
2.3
线性表的链式存储
2.4
一元多项式的表示及相加
2.1 线性表的逻辑结构
❖ 线性表表示具有相同特性的数据元素的一个有序序列。该序列中所含 元素的个数叫做线性表的长度,用n表示,n>=0。当n=0时,表示 线性表是一个空表,即表中不包含任何元素。设序列中第i(i表示逻 辑位序)个元素为ai(1<=i<=n),则线性表的一般表示为
a1
a2 …… a3
a4
……
an
2.1 线性表的逻辑结构
❖ 线性表是一个相当灵活的数据结构,它的长度可根据需要增长和缩短 ,即对线性表的数据元素不仅可以进行访问,也可以进行插入和删除 操作等。

抽象数据类型线性表的定义如下:

高中信息技术 竞赛班数据结构专项培训教程 02线性表教案-人教版高中全册信息技术教案

高中信息技术 竞赛班数据结构专项培训教程 02线性表教案-人教版高中全册信息技术教案

§2 线性表§2.1 线性表的定义及其基本运算线性表是n个数据元素〔结点〕a1,a2,……,a n组成的有限序列。

其中数据元素的个数n 定义为表的长度。

当n=0时称为空表。

线性表的常用的运算:〔1〕置空表。

〔2〕求线性表L的长度。

〔3〕取表中的第i个结点〔4〕按值查找。

〔5〕插入:在表L的第i个位置上插入新的结点X。

〔6〕删除:删除表L的第i个结点。

线性表可采用两种存储结构:顺序存储和链式存储。

§2.2 线性表的顺序存储结构它的特点是逻辑上相邻的结点其物理位置亦相邻,下标可以看成是结点的相对地址。

·运算:1) 插入用顺序表作为线性表的存储结构时,由于结点的物理顺序必须和结点的逻辑顺序保持一致,因此我们必须将表中位置n,n-1,...,i上的结点依次后移到位置 n+1,n,...,i+1上,腾出第 i个位置,然后在该位置上插入新结点x。

仅当插入位置 i=n+1时,才无须移动结点,直接将 x插入表的末尾。

2〕删除在顺序表上实现删除运算也必须移动结点,才能反映出结点间逻辑关系的变化。

仅当i=n,才能简单地删除终端结点,无须移动结点;3〕取表S中的第i个结点: 直接以 S[i]表示4) 查找须顺序取出表中元素逐一比较·顺序表有如下优缺点:优点:〔1〕无须为表示结点间的逻辑关系而增加额外的存储空间;〔2〕可以方便地随机存取表中的任一结点。

缺点:〔1〕插入和删除运算不方便,除表尾的位置外,在表的其它位置上进行插入和删除操作都必须移动大量的结点,其效率较低;〔2〕由于顺序表要求占用连续的存储空间,存储分配只能预先进行〔静态分配〕,因此当表变化较大时,难以确定合适的存规模,假设按可能达到的最大长度预先分配表空间,那么可能造成一部分空间长期闲置而得不到充分利用,假设事先对表长估计不足,那么插入操作可能使表长超过预先分配的空间而造成溢出。

§2.3 线性表的链式存储结构从链接方式上可分为:单链表、循环链表和双链表。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第2章线性表本章主要内容:1、线性表的概念、特点、及其基本操作定义2、线性表的顺序存储结构及其算法实现3、线性表的链式存储结构及其算法实现4、循环链表及其线性表的应用本章重点难点:1、线性表的存储结构及算法实现。

2、链式存储结构及算法实现。

3、循环链表2.1 线性表的定义和基本操作2.1.1 线性表的定义及特点1.线性表的定义线性表是由n(n≥0)个类型相同的数据元素组成的有限序列。

n表示线性表中数据元素的个数,称为线性表的长度(简称表长)。

当n=0时,线性表为空,称为空线性表。

线性表的逻辑结构通常用数学中的向量形式表示:L=( a1,a2,...,ai-1,ai,ai+1,...,an) 或者L=( a0,a1,...,ai-1,ai,ai+1,...,an-1)其中:L为线性表名称,习惯用大写书写;ai为组成该线性表的数据元素,元素的数据类型可以是可以表示出的任何类型。

例 1:分析下列线性表的数据类型:La=(34,89,765,12,90,-34,22);Lb=(January, February,March,April,May,June,July,August,September,October,November,December,World, China,Welcome);Lc=(stu1,stu2,...,stu50) ;其中,数据元素stui的数据类型为:struct student{char Num; //学号char *name; //姓名};2、线性表的特点。

除第一个元素外,每个元素有且仅有唯一一个直接前驱,第一个元素无直接前驱,除最后一个元素外,每个元素有且仅有唯一一个直接后继,最后一个元素无直接后继。

1-1这种次序描述了元素之间的 1 对 1关系。

此外,我们所研究的线性表的元素个数是有限的,各元素的数据类型是相同德,且数据元素可以是任意类型。

2.1.2、线性表的基本操作(1)初始化线性表L InitList(L)(2)清空线性表L ClearList(L)(3)求线性表L的长度 ListLength(L)(4)判断线性表L是否为空 IsEmpty(L)(5)获取线性表L中的某个数据元素内容 GetElem(L,i,e)(6)查找值为e的数据元素 LocateELem(L,e)(7)返回线性表L中e的直接前驱元素 PriorElem(L,e)(8)返回线性表L中e的直接后继元素 NextElem(L,e)(9)在线性表L中插入一个数据元素 ListInsert(L,i,e)(10)删除线性表L中第i个数据元素 ListDelete(L,i,e)2. 2 线性表的顺序存储结构与操作算法实现2.2.1 线性表的顺序存储结构定义及其特点1、线性表的顺序存储结构(顺序表)线性表的顺序存储结构是指用一组连续的存储单元依次存储线性表中的每个数据元素。

如图2-1所示:图 2-1 顺序表的存储相邻两个数据元素的存储位置计算公式:LOC(a i)=LOC(a i-1)+C (2-1)线性表中任意一个数据元素的存储位置的计算公式为:LOC(a i)=LOC(a1)+(i-1)*C (2-2)或者:LOC(a i)=LOC(a0)+i*C (2-3)其中,C为每个数据元素所占据的存储单元数目。

2、顺序存储结构的特点优点:(1) 一致性。

在顺序表中,利用数据元素的存储位置相邻,表示线性表中数据元素之间的相邻前后关系,逻辑结构与存储结构(物理结构)一致;(2)可随机访问性。

在访问顺序表时,可以利用公式(2-2),(2-3),可以快速地计算出任何一个数据元素的存储地址。

因此,访问每个数据元素所花费的时相等。

这种存取元素的方法被称为随机存取法,使用这种存取方法的存储结构被称为随机存储结构。

缺点:(1)插入、删除低效。

对插入、删除等操作效率较低,需要移动大量元素。

(2)不便于扩充。

要动态增加元素个数较困难。

顺序表示适合于数据元素个数稳定、较少进行插入和删除操作、频繁进行查询操作的场合。

3、顺序存储结构的定义#define LIST_MAX_LENGTH 100 //线性表的最大长度typedef struct {Elemtype elem[LIST_MAX_LENGTH]; //指向存放线性表中数据元素int length; //线性表的当前长度} SQLIST;2.2.2 线性表的典型操作算法的实现(1)初始化线性表Lviod InitList(SEQLIST *L){ L->length=0; //将当前线性表长度置0}(2)清空线性表Lvoid ClearList(SEQLIST *L){ L->length=0; //将线性表的长度置为0}上面的两个算法的具体操作都是一样的,但是含义却不一样。

初始化一个线性表,是给出一个初始状态:表中没有元素,所以表长为0。

而清空线性表是说表里面是否有元素我们不管,只要定义了表长为0,就肯定了表是空表。

前者是对一个表的初始状态的描述,后者是强行达到空表的操作。

(3)求线性表L的长度int GetLength(SEQLIST L){ return (L.length);}(4)判断线性表L是否为空int IsEmpty(SEQLIST L){ if (L.length==0) return TRUE;else return FALSE;}( 5)获取线性表L中的某个数据元素的内容int GetElem(SEQLIST L,int i,Elemtype *e){ if (i<1||i>L.length) return ERROR;//判断i值是否合理,若不合理,返回ERROR*e=L.elem[i-1];//数组中第i-1的单元存储着线性表中第i个数据元素的内容 return OK;}(6)在线性表L中查找值为e的数据元素int LocateELem(SEQLIST L,Elemtype e){ for (i=0;i< L.length;i++)if (L.elem[i]==e) return i+1;return 0;}(7)在线性表L中第i个数据元素之前插入数据元素eint ListInsert(SEQLIST *L,int i,Elemtype e){ if (L->length==LIST_MAX_LENGTH) return ERROR;//检查是否有剩余空间if (i<1||i>L->length+1) return ERROR; //检查i值是否合理for (j=L->length-1;j>=i-1;i++)//将线性表第i个元素之后的所有元素向后移动L.->elem[j+1]=L->elem[j];L->elem[i-1]=e; //将新元素的内容放入线性表的第i个位置,L->length++;return OK;}(8)将线性表L中第i个数据元素删除int ListDelete(SEQLIST *L,int i,Elemtype *e){ if (IsEmpty(L)) return ERROR; //检测线性表是否为空if (i<1||i>L->length) return ERROR; //检查i值是否合理*e=L->elem[i-1];//将欲删除的数据元素内容保留在e所指示的存储单元中for (j=i;j<=L->length-1;j++)//将线性表第i+1个元素之后的所有元素向前移动L->elem[j-1]=L->elem[j];L->length--;return OK;}2.2.3算法效率分析1 、查找算法如果线性表的长度为n ,在查找成功的前提下,被查找的元素e 线性表的第i (1≤i ≤n ),i 的值不同,比较元素的个数不同,所以,我们用平均比较次数(又称为平均查找长度)ASL 来说明算法的效率:ASL=∑=ni i i C P 1。

其中,P i 是被查找元素是第i 个元素的概率,C i 是查找到第i 个元素的比较次数,在等概率的前提下,P i =1/n ,C i =i,所以,平均查找长度为ASL = (1+2+…+n)/n=(n+1)/2。

2、 插入算法顺序表的插入算法快慢主要通过元素的移动次数来决定,插入的位置不同,移动的元素的个数也不同,因此我们用平均移动元素个数来描述。

如果被插入元素的的插入位置为i (1≤i ≤n+1),则移动的元素个数为(n+1-i ),在插入位置等概率的情形下,平均移动元素个数为(∑+=-+111n n i i )/(n+1)=n/2。

3、 删除算法的平均移动元素的个数为(n-1)/ 2和插入算法一样,删除算法的时间复杂度也是由元素移动的次数来决定的,我们任然用平均移动次数来描述。

如果被删除元素为线性表的第i (1≤i ≤n )个元素,则移动的元素个数为n-i ,在删除元素位置等概率的前提下,平均移动元素个数为(∑=-ni i 1n )/n=(n-1)/2。

所以,查找算法、插入算法和删除算法的时间复杂度都是用O 表示都是O(n),即n 的线性函数。

4、 其他算法的时间复杂度都是 O(1)。

2. 3 线性表的链式存储结构线性表顺序存储结构的缺点是在做插入或删除元素的操作时,会产生大量的数据元素移动;对于长度变化较大的线性表,要一次性地分配足够的存储空间,但这些空间常常又得不到充分的利用;线性表的容量难以扩充。

2.3.1 线性表的链式存储结构及特点1、线性表的链式存储结构:指用一组任意的存储单元(可以连续,也可以不连续)存储线性表中的数据元素。

为了反映数据元素之间的逻辑关系,对于每个数据元素不仅要表示它的具体内容,还要附加一个表示它的直接后继元素存储位置的信息。

假设有一个线性表(a 1,a 2,...,a n ),可用图2-2所示的形式存储:图2-2 链表的存储2、链式存储结构的特点优点:(1)插入、删除操作方便性。

不需移动元素,数据个数可动态增长。

(2)不连续占用存储空间。

缺点:(1)不一致性。

线性表中的数据元素在存储单元中的存放顺序与逻辑顺序不一定一致;(2)只能顺序访问性。

在对线性表操作时,只能通过头指针进入链表,并通过每个结点的指针域向后扫描其余结点,这样就会造成寻找第一个结点和寻找最后一个结点所花费的时间不等,具有这种特点的存取方式被称为顺序存取方式。

链式存储结构适合于数据各是动态变化、插入、删除频繁的场合。

3、链式存储结构的定义在C语言中,实现线性表的链式存储结构的类型定义typedef strcut Node{ //结点类型Elemtype elem;struct Node *next;} Node, *LINKLIST;2.3.2 链表的典型操作的算法实现通常我们采用带有头结点的单链表来存储线性表,初始的时候头结点的next 域为空。

相关文档
最新文档