数据结构第2章 线性表 教案
实用数据结构电子教案第二章 数组与线性表
第二章 数组与线性表
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章 线性表讲解学习
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章
数据元素,返回一特殊值(例如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课件)
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版)-电子教案 第二章 线性表
元素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线性表教案-人教版高中全册信息技术教案
§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 线性表的链式存储结构从链接方式上可分为:单链表、循环链表和双链表。
数据结构与算法分析 线性表PPT学习教案
T通常是代 表要处 理的数 据元素 的类型
●
线性表的抽象数据类型定义
Tempate <class T> Class CList{
void Clear(); bool Append(const T value); bool Delete(const int p);
. . };
第4页/共27页
二、顺序表 Tempate <class T>
<T> * preValue= NULL ) {//具有两个参数的List构造函数
next =nextValue; pre = preValue;
} };
第19页/共27页
三、链 ● 双链表的类定义
表 template <class T>
class doubleList :public doubleLink <T>{ //继承结点类
Class CarrList:public CList<T>{
●顺序表 :按顺 序方式 存储的 线性表 ,采用 定长的 一维数 组存储 结构。
private:
T *aList; //T类型的指针,存储线性表实例
int maxSize; //实例的最大长度
顺序表的类定义: int curLen; //实例的当前长度
last->next = p p->pre=last
1
2
3
第21页/共27页
三、链表
(1)双链表——结点的删除算法 p
head
3
2
1
p->next->pre = p->pre P->pre->next=p->next Delete p
线性表 教案
线性表【教学目的】:1、了解数据结构的概念2、掌握时间复杂度的概念和计算方法【教学方法】:理论教学【教学课时】:2课时(复习)【教学内容】:一、基础知识和算法1. 线性表及其特点线性表是n个数据元素的有限序列。
线性结构的特点:①“第一个”②“最后一个”③前驱④后继。
12. 顺序表——线性表的顺序存储结构(1) 特点a) 逻辑上相邻的元素在物理位置上相邻。
b) 随机访问。
(2) 类型定义简而言之,“数组+长度”2。
const int MAXSIZE = 线性表最大长度;typedef struct{DataType elem[MAXSIZE];int length;1这里太简炼了,只是为了便于记忆。
2不准确的说法,只为便于理解和记忆,不要在正式场合引用。
凡此情形,都加引号以示提醒。
} SqList;注:a) SqList为类型名,可换用其他写法。
b) DataType是数据元素的类型,根据需要确定。
c) MAXSIZE根据需要确定。
如const int MAXSIZE=64;d) 课本上的SqList类型可在需要时增加存储空间,在上面这种定义下不可以。
(这样做避免了动态内存分配,明显减少了算法的复杂程度,容易理解。
而且,原来Pascal版本的《数据结构》(严蔚敏)就是这样做的。
)e) 课本上的SqList类型定义中listsize表示已经分配的空间大小(容纳数据元素的个数)。
当插入元素而遇到L.length==L.listsize时,用realloc (L.elem, L.listsize+增量) 重新分配内存,而realloc()函数在必要的时候自动复制原来的元素到新分配的空间中。
(3) 基本形态1°. 顺序表空条件L.length==0不允许删除操作2°. 顺序表满条件L.length==MAXSIZE不允许插入操作3°. 不空也不满可以插入,删除(4) 基本算法——遍历1°. 顺序访问所有元素for ( i=0; i<L.length; i++ )visit ( L.elem[i] ); 2°. 查找元素xfor ( i=0; i<L.length; i++ )0 1 MAXSIZE-1...L.length==0L.length==MAXSIZ0<L.length<MAXSIif ( L.elem[i]==x ) break;if ( i<L.length )找到;else未找到;(5) 插入算法ListInsert(&L,i,x)1°. 前提:表不满2°. 合理的插入范围:1≤i≤L.length+1注:位序i在C/C++中对应于下标i-1。
教案数据结构严蔚敏第2章线性表(完整版)
引用类型作形参的三点说明
(1)传递引用给函数与传递指针的效果是一 样的,形参变化实参也发生变化。 (2)引用类型作形参,在内存中并没有产生 实参的副本,它直接对实参操作;而一般变 量作参数,形参与实参就占用不同的存储单 元,所以形参变量的值是实参变量的副本。 因此,当参数传递的数据量较大时,用引用 比用一般变量传递参数的时间和空间效率都 好。
顺序存储结构存在问题 存储空间分配不灵活 运算的空间复杂度高
链式存储结构
A17(x)=7+3x+9x8+5x17 B8(x)=8x+22x7-9x8
pa
A -1 7 0 3 1 9 8 5 17
B
-1
8
1
22 7
-9
8
pb
多项式相加
A17(x)=7+3x+9x8+5x17 B8(x)=8x+22x7-9x8
第2章 线性表
徐海霞
近3周 • 第2章 线性表 上课 • 第3章 栈和队列 内容 • 第4章 串、数组和广义表
线性结构
(逻辑、存储 和运算)
线性结构的定义: 若结构是非空有限集,则有且仅有一个开始结 点和一个终端结点,并且所有结点都最多只有一个 直接前趋和一个直接后继。 可表示为:(a1 , a2 , ……,
何仕鹏
王 爽 王亚武 :
男
女 男 : :
20
19 18
04级计算机2班
04级计算机3班 04级计算机4班 :
数据元素都是记录;
元素间关系是线性
同一线性表中的元素必定具有相同特性
2.2 案例引入
案例2.1 :一元多项式的运算
Pn(x) = p0 + p1x + p2x2 + … + pnxn 线性表P = (p0,p1,p2,…,pn) P(x) = 10 + 5x 指数 (下标i) 系数p[i]
数据结构实验二 线性表
数据结构实验二线性表数据结构实验二线性表1. 实验目的1.1 理解线性表的概念和特性1.2 学习线性表的顺序存储结构和链式存储结构1.3 掌握线性表的基本操作:初始化、插入、删除、查找、修改、遍历等1.4 熟悉线性表的应用场景2. 实验内容2.1 线性表的顺序存储结构实现2.1.1 定义线性表结构体2.1.2 初始化线性表2.1.3 插入元素2.1.4 删除元素2.1.5 查找元素2.1.6 修改元素2.1.7 遍历线性表2.2 线性表的链式存储结构实现2.2.1 定义链表节点结构体2.2.2 初始化链表2.2.3 插入元素2.2.4 删除元素2.2.5 查找元素2.2.6 修改元素2.2.7 遍历链表3. 实验步骤3.1 实现顺序存储结构的线性表3.2 实现链式存储结构的线性表3.3 编写测试程序,验证线性表的各种操作是否正确3.4 进行性能测试,比较两种存储结构的效率差异4. 实验结果与分析4.1 执行测试程序,检查线性表的操作结果是否正确4.2 对比顺序存储结构和链式存储结构的性能差异4.3 分析线性表的应用场景,总结线性表的优缺点5. 实验总结5.1 总结线性表的定义和基本操作5.2 回顾实验中遇到的问题和解决方法5.3 提出对线性表实现的改进方向和思考附件:请参考附件中的源代码和实验报告模板。
法律名词及注释:1. 版权:指对某一作品享有的法律上的权利,包括复制权、发行权、改编权等。
2. 法律责任:指违反法律或合同规定所承担的责任。
3. 保密义务:指个人或组织根据法律、法规、合同等规定需要承担的保密责任。
4.知识产权:指人们在社会实践中所创造的智力劳动成果所享有的权利,包括专利权、著作权、商标权等。
2数据结构教案 - 线性表
数据结构B
章节名称
线性表
授课学时
总学时:4课堂授课:4
教学目标与要求
掌握:线性表的定义和特点
熟练掌握:线性表的顺序存储结构的查找、插入和删除等基本操作
熟练:单链表、循环链表及双向链表的定义及实现
掌握:单链表的应用方法
主要知识点、重点、难点
知识点:1)线性表的定义和特点
2)线性表的顺序存储ቤተ መጻሕፍቲ ባይዱ查找、插入和删除操作
3)线性表的顺序存储及查找、插入和删除操作
4)使用线性表的实例
重点难点:1)线性表的顺序存储和链式存储的区别
2)线性表的顺序存储和链式存储查找、插入和删除操作
教学过程设计
对比结合的方法进行讲授,通过分析线性表的顺序存储和链式存储的相同点与不同点,以及由此带来的算法及其算法复杂度的变化,通过对比加深学生对知识的印象。
作业布置
独立写出线性表的顺序存储及查找、插入和删除操作的伪码。
线性表教案
章节名称
第二章线性表
教学目的
与要求
1、要求学生能编写c语言代码,实现各种顺序存储线性表的基本运算
2、要求学生掌握线性表顺序表示某些操作的算法分析
3、要求学生掌握线性表单链表表示的构造方法
教学内容
2.2顺序表示
2.3链接表示
2.3.1单链表
重点
1、顺序表示中基本运算的实现
分析
2、要求学生能够用线性表解决约瑟夫环问题
教学内容
2.3链接表示
2.4应用举例
重点
线性表单链表,双链表和循环链表基本运算的实现
难点
1、线性表双链表和循环链表基本运算的实现
2、线性表解决约瑟夫环问题
教具
黑板
教学过程
(组织与方法)
1.介绍本课程的学习方法和要求
2.讲述教学内容
3.小结,布置作业及预习内容
教案章节名称第二章线性表教学目的与要求1要求学生能编写c语言代码实现各种顺序存储线性表的基本运算2要求学生掌握线性表顺序表示某些操作的算法分析3要求学生掌握线性表单链表表示的构造方法教学内容22顺序表示23链接表示231单链表重点1顺序表示中基本运算的实现2线性表顺序表示中插入和删除操作的时间复杂度分析3单链表难点1顺序表示中基本运算的实现2线性表顺序表示中插入和删除操作的时间复杂度分析3
3、单链表
难点
1、顺序表示中基本运算的实现
2、线性表顺序表示中插入和删除操作的时间复杂度分析
3.单链表的构造
教具
黑板
教学过程
(组织与方法)
1.介绍本课程的学习方法和要求
2.讲述教学内容
3.小结,布置作业及预习内容
章节名称
第二章线性表
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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 域为空。