04-05-06.第二章线性表最终版
第 2 章 线性表
2020/1/28
5
线性表(Linear List)定义
定义: n个具有相同特性的数据元素组成 的有限序列;
表示:(a1,…,ai-1,ai,ai+1,…,an) ai必须具有相同特性,即属于同一数据对
C
2020/1/28
7
抽象数据类型定义
ADT List{
数据对象:D={ai|ai∈ElemSet,i=1,2,…,n,n≥0} 数据关系:R={<ai-1,ai>|ai,ai-1∈D,i=2,…,n} 基本操作:
1. ListInit (L) ; 2. ListLength (L) ;
3. ListGet(L,i) ;
// LA和LB是顺序存储的线性表,元素按非递减有序排列,本算法将 LB合并到LA中,元素仍非递减有序 {m=st; n=st;//m,n分别为线性表LA和LB的长度。 k=m+n-1; //k为结果线性表的工作指针(下标) i=m-1;j=n-1;//i,j分别为线性表LA和LB的工作指针(下标) while (i>=0 && j>=0) if (LA.data[i]>=LB.data[j]) LA.data[k--]=LA.data[i--]; else LA.data[k--]=LB.data[j--]; while (j>=0) LA.data[k--]=LB.data[j--]; st=m+n; }
象 ai-1是ai的直接前驱元素,ai+1是ai的直接后
继元素 数据元素ai在线性表中有确定的位置i,i称
《数据结构》--第二章线性表
《数据结构》--第二章线性表《数据结构》第二章线性表在计算机科学中,数据结构是一门非常重要的基础课程,它为我们有效地组织和管理数据提供了理论和方法。
而在数据结构的众多内容中,线性表是一个关键且基础的概念。
线性表,简单来说,就像是一排整齐排列的元素。
这些元素按照一定的顺序依次排列,每个元素都有其特定的位置。
想象一下排队买奶茶的人群,从第一个人到最后一个人,就形成了一个线性的队列,这就是一种线性表的形象体现。
线性表具有一些显著的特点。
首先,它的元素个数是有限的。
就像排队买奶茶的队伍,长度不可能是无限的。
其次,元素具有相同的数据类型。
比如在一个记录学生成绩的线性表中,每个元素都是学生的成绩数据。
再者,元素之间是顺序排列的,有先后之分。
从存储结构上来看,线性表可以分为顺序存储和链式存储两种。
顺序存储的线性表,就好比是把一系列物品紧密地摆放在一个连续的空间里。
比如,我们可以把一系列数字存储在一个连续的数组中。
这种存储方式的优点是可以随机访问,也就是说,如果我们想获取第 5 个元素,直接通过计算就可以快速得到。
但它也有缺点,那就是插入和删除操作比较麻烦。
当我们要在中间插入一个新元素时,可能需要移动后面的一系列元素来腾出位置;删除一个元素时,又需要把后面的元素向前移动来填补空缺。
相比之下,链式存储的线性表就灵活得多。
它就像是一串珍珠,每个珍珠(节点)通过一根线(指针)与下一个珍珠相连。
每个节点包含数据域和指针域,数据域用来存放数据,指针域则指向链表中的下一个节点。
链式存储的优点是插入和删除操作比较方便,只需要修改相关节点的指针即可。
但它的缺点是不能随机访问,要找到特定位置的元素,需要从链表的头开始逐个遍历。
线性表在实际应用中无处不在。
比如,我们的通讯录就是一个线性表,按照联系人的添加顺序依次排列。
操作系统中的任务队列也是线性表,任务按照先后顺序等待被执行。
在编程实现线性表时,我们需要根据具体的需求来选择合适的存储方式。
第二章线性表
//最后元素在数组中的位置(下标值)
} SeqList;
其中elem数组的第 i 个分量为线性表第 i 个 数据元素的存储映像。注意区分元素的序号和 数组的下标,如a1的序号为1,而其对应的数组 下标为0。last 指最后一个数据元素在数组空间 中的位置。空表last置为-1
#define LIST_INIT_SIZE 100//线性存储空间 的初始分配量 #define LISTINCREMENT 10//线性表存储空 间的分配增量
内存空间状态
a1 a2
…
ai
…
an
逻辑地址
1 2
…
i
…
n
...
loc(a1)+(maxlen-1)k
顺序存储结构的C语言定义
#define maxsize=线性表可能达到的最大长度;
typedef struct
{ ElemType elem[maxsize]; // 线性表占用的数组空间
int last;
若没有与e相等的元素,则返回值为0。 Traverse(L,visit( )) 依次对L的每个元素调用函数
visit( )。一旦visit( )失败,则操作失败。
加工型操作
Clear(L) 将L置为空表。 Put(L, i, e ) 将e的值赋给L的 i号元素。
(1≤i≤Length(L) ) InsList(L,i,e) 在L的i号元素(1≤i≤Length(L)+1)
注:这里的数据元素ai(1≤i≤n)只是一个抽象的 符号,其具体含义在不同的情况下各不相同。
例1 26个英文字母组成的字母表: (A,B,C、…、Z)
例2 某校从1978年到1983年各种型 号的计算机拥有量的变化情况:
第2章线性表
(1) 将线性表L中的第i+1个至第n个结点依此向前移 动一个位置。
(2) 线性表长度减1。
算法描述
Status Delete_SqList(Sqlist &L,int i, ElemType &e)
{
if (L.length==0) { printf(“线性表L为空!\n”); return ERROR; }
◆ 删除时平均移动次数:Edelete=∑pi*(n-i) (1≦i≦n) ∴ Edelete=(n-1)/2 。
平均时间复杂度:Ecompare+Edelete=n ,即为O(n)
2.3 线性表的链式存储
2.3.1 线性表的链式存储结构
链式存储 :用一组任意的存储单元存储线性表
中的数据元素。用这种方法存储的线性表简称线性链 表。
{ ElemType Elem_array[MAX_SIZE] ; int length ;
} SqList ; 如何?
(3) 用下述结构类型来定义顺序表类型,有何不同? typedef int Status ; typedef int ElemType ; #define LIST_INIT_SIZE 100 #define LISTINCREMENT 10
Status Insert_SqList(Sqlist &L,int i, ElemType e)
{if ( i<1||i>L.length+1) return ERROR ;
if (L.length>=L.listsize)
{ newbase=( ElemType* )realloc(L. elem, (L.listsize+LISTINCREMENT)*sizeof( ElemType ) ) ; if ( !newbase ) exit(OVERFLOW);
第2章线性表-PPT精品文档
( ) a , a, a , x , a , a i n
2、顺序表的插入
{ if (i<1 ||i>L.length+1 ) return ERROR;
P24 算法2.4
Status ListInsert_Sq(SqList &L,int i,ElemType e) //i值不合法
2.2
二、线性表的顺序存储结构定义 ——动态
#define LIST_INIT_SIZE 100 //线性表存储空间的初始分配量 #define LISTINCREMENT 10 //线性表存储空间的分配增量 typedef struct { ElemType *elem; //存储空间基址, 体现动态性 int length; //当前长度 int listsize; //当前分配的存储容量 }SqList;
M-1 或动态申请和释放内存 数据元素不是简单类型时,可定义结构体数组 ElemType *pData; pData = (ElemType *)malloc(M*sizeof(ElemType)); free(pData); 2019/3/26
二、线性表的顺序存储结构定义 ——静态
#define MAXSIZE 100 typedef struct { ElemType elem[MAXSIZE]; int length; }SqList;
#define LISTINCREMENT 10 typedef typedef struct struct { { ElemType *elem; ElemType elem[MAXSIZE]; int length; int length; int listsize; }SqList; }SqList;
线性表
n 1
n1 2 2
顺序表中插入操作的平均时间复杂度为O(n)
5. 删除
算法过程
序号 内容
0
1
a1
2
a2
3
a3
…
…
i-1
ai1
i
ai
i+1 ai1
…
…
n
an
n+1
maxsize -1
序号 内容
0
1
a1
2
a2
3
a3
…
…
i-1
ai1
i
ai1
i+1
ai 2
…
…
n-1
an
n
maxsize -1
删除前
删除后
把线性表(a1, a2, a3,......, an )顺序存放在内存中
地址 内存
b
a1
b+L
a2
b+2L
a3
…
…
…
…
b+(i-1)×L ai
… … b+(n -1)×L an
序号 0 1 2 3 … …
i
… … n
maxsize-1 顺序存储结构示意图
第二章 线性表
假设线性表的每个元素需占用L个存储单元,并以所占的 第一个单元的存储地址作为数据元素的存储位置(上图中 为b)。则线性表中第i+1个数据元素的存储位置LOC(ai+1) 和第i个数据元素的存储位置LOC(ai)之间满足下列关系:
第二章 线性表
例2-3、学生健康情况登记表如下:
姓 名 学 号 性 别 年龄 健康情况
王小林 790631 男 18 健康
第2章 线性表
2.2.2 运算的实现
1. 创建一个空顺序表 PSeqList createNullList_seq(int m ) 首先需要调用函数malloc(sizeof(struct SeqList)), 首先需要调用函数malloc(sizeof(struct SeqList)), 得到一 个 struct SeqList 的 空 间 , 然 后 再 按 参 数 m 的 大 小 调 用 malloc(sizeof(DataType)*m), malloc(sizeof(DataType)*m) , 得到为顺序表分配的一个由参 数m指定大小的数组空间,并将顺序表的MAXNUM字段置 指定大小的数组空间,并将顺序表的MAXNUM字段置 为m, n字段置为0。 字段置为0 程序实现 2. 判断线性表是否为空 int isNullList_seq( PSeqList palist ) 判断palist的 字段是否为0 判断palist的n字段是否为0即可 程序实现
2.1基本概念与抽象数据类型 2.1基本概念与抽象数据类型
2.1.1 基本概念
线性表( 线性表(简称为表)是零个或多个元素的有穷序列。 L=( k0,k1,…,kn-1) L=( 线性表的逻辑结构:L=<K, 线性表的逻辑结构:L=<K,R> 其中K={ 其中K={ k0,k1,…,kn-1}, R={<ki, ki+1>|0≤i≤n-2 }, >|0≤i≤科学学院 生命科学学院
生物技术学系 生物技术学系 细胞及遗传学系 细胞及遗传学系
2.1.2 抽象数据类型
假设用List表示一个线性表类型,用DataType来 假设用List表示一个线性表类型,用DataType来 表示其元素的类型 ,元素的下标用Position类 ,元素的下标用Position类 型的量表示, 则可以说明如下: 则可以说明如下: List list; DataType x; Position p;
第2章 线性表
(9) ListDelete (&L, i, &e)
初始条件: 表L已存在且非空, 1≤i≤ListLength(L)。
操作结果: 删除L的第i个数据元素, 并用e返回其值, L
的长度减1。 } ADT List
第2章 线 性 表 例2—1 Void union (List &La, List Lb){ La_len= ListLength (La); Lb_len= ListLength (Lb); For (i=1;i<= Lb_len;i++){ GetElem (Lb,i,e); If(!LocateElem(La,e,equal)) ListInsert(La,++ La_len,e); } } O(Listlength(LA)* Listlength(LB))
第2章 线 性 表
假设线性表中有n个元素,每个元素占k个单元,第一
个元素的地址为loc(a1),则可以通过如下公式计算出第i个
元素的地址loc(ai):
loc(ai) =loc(a1)+(i-1)×k
其中loc(a1)称为基地址。 它是一种随机存取的数据结构。
第2章 线 性 表
存储地址 loc(a1 ) loc(a1 )+k 内存空间状态 a1 a2 逻辑地址 1 2
构类型但同一线性表中的数据元素必须属于同一数据对象。此外,
线性表中相邻数据元素之间存在着序偶关系,即对于非空的线性
表(a1, a2, …,ai-1, ai, ai+1, …, an), 表中ai-1 领先于ai,称ai-1 是ai 的直接前驱,而称ai是 ai-1的直接后继。除了第一个元素a1外,每
第二章 线性表PPT课件
(二)线性表的删除(1)
1﹑删除下标为i的 数据元素
例2.3 为在V[0]到V[99] 中删除一个元素 V[i],引用del1函数。 删除前后的线性表 的示意图如右
举例(续)
分析: ①初始条件: 数组V,
删除下标i ②删除条件:0≤i≤99 ③执行结果:1成功,0
不成功 ④N-S流程图如右:
举例(续)
(一)线性表插入操作(1)
1、在数组中下标为i的元 素前插入一个新元素。
例2.1 某C语言程序中, 整型数组V的99个元数 V[0]~V[98]组 成一个线性表。为了在V [i]位置前插入一个新元 素b,可用如下函数inst1 来实现,当插入成功时返 回1,否则返回0,所以该 函数的返回值类型是整型。 插入前后的线性表的示意 图如右:
第二章 线性表
2.1 线性表的逻辑结构 2.2 线性表的顺序存储结构 2.3线性表的链式存储结构 2.4 典型例题
线性表的特点是:在数据元素的非空有
限集中,(1)存在唯一的一个被称为 “第一个”的数据元素;(2)存在唯一
的一个被称为“最后一个”的数据元素; (3)除第一个以外,集合中的每一个数 据元素均有且只有一个前驱;(4)除最
V[99]=0; /*数组最后一个元素清0或某种结束标记*/ return 1; /*删除成功 */ }
线性表的删除操作(2)
2﹑在有序顺序表 中删除一个数据 元素
例2.4 在有序表中 删除一个值为x的 数据元素。当x的 值为78时删去前 后的线性表的
示意图如右:
举例(续)
分析: ①初始条件:数组
return 0; /*插入失败*/
} for (j=99;j>i;j--) v[j]=v[j-1];/*后移*/ v[i]=b; /*插入*/ return 1; /*插入成功 */ }
(C语言详细版)第二章 线性表ppt课件
这种方法可以解决方案一中的“上溢”问题和“空间利用 率不高”问题。但是这一方案是有时间和空间代价的:当 因插入元素而空间不足时,需要重新分配比原先的顺序表 多存储LISTINCREMENT个数据元素的连续空间,并且需 要将原空间的数据元素复制到新分配的空间中。
2018/11/13
卓月明
12
2.2线性表的顺序表示和实现 --类型定义与基本操作实现
卓月明 4
2018/11/13
2.1 线性表的类型定义
在稍复杂的线性表中,一个数据元素可以由若干个数据项 (Item)组成。 在这种情况下,常把数据元素称为记录(Record),含有大量记录的线性 表又称文件(File)。 例如,一个学校的学生健康情况登记表如图所示,表中每个学生的情况 为一个记录,它由姓名、学号、性别、年龄、班级和健康状况等六个数 据项组成。
(C语言详细版)第二章 线性表
第二章 线性表
从第2章至第4章将讨论线性结构。 线性结构的特点是:
在数据元素的非空有限集中,
(1)存在唯一的一个被称做“第一个”的数据元素; (2)存在唯一的一个被称做“最后一个”的数据元素; (3)除第一个之外,集合中的每个数据元素均只有一 个前驱; (4)除最后一个之外,集合中每个数据元素均只有一 个后继。
2.2 线性表的顺序表示和实现
若要在实际的程序设计中真正引用线性表的基本操作, 首先必须实现线性表类型。即在计算机中确定它的存 储结构并在此存储结构上实现类型中定义的所有基本 操作。本节将讨论它的顺序存储结构以及在顺序存储 结构中基本操作的实现。
何谓顺序存储表示?
顺序存储表示指的是,以数据元素在存储器中的"相对位置"来 表示数据元素之间的逻辑关系。你还记得吗?
第二章线性表-
2020/2/23
如何在计算机中存储线性表? 如何在计算机中实现线性表的 基本操作?
存储线性表,至少要保存两类信息: 1)线性表中的数据元素; 2)线性表中数据元素的顺序关系;
2020/2/23
操作结果:返回L中第1个与e满足关系
compare( )的元素的位序。 若这样的元素不存在, 则返回值为0。
2020/2/23
加工型操作
ListInsert( &L, i, e ) ListDelete(&L, i, &e)
2020/2/23
ListInsert( &L, i, e )
(插入数据元素)
} ADT List 2020/2/23
结构操作 初始化操作 InitList( &L )
操作结果:构造一个空的线性表L。
结构销毁操作 DestroyList( &L )
初始条件:线性表 L 已存在。 操作结果:销毁线性表 L。
2020/2/23
引用型操作:
ListEmpty( L ) ListLength( L ) GetElem( L, i, &e ) LocateElem( L, e, compare( ) )
若假定在线性表中任何一个位置上进行插入
的概率都是相等的,则移动元素的期望值为:
2020/2/23
Eisn1 1n i 1 1(ni1)
n 2
线性表操作 ListDelete_Sq(&L, i, &e)的实现
首先分析:
删除元素时, 线性表的逻辑结构发生什么变化?
第二章线性表
线性表的遍历算法
ListTraverse(L)
//遍历线性表中的元素
{
if(ListEmpty(L))
//判断表是否为空
printf(“这是一个空表”);
else
for(i=1;i<=ListLength(L);i++)
visit(ListGet(L,i));
//访问线性表中的元素i
}
2.线性表的合并
第二章线性表
2.1 线性表的定义
2.1.1 线性表的概述 2.1.2 线性表的抽象数据类型 2.1.3 线性表的相关操作
2.1.1 线性表概述
➢线性表的逻辑定义 •n(n≥0)个属于同一数据类型的数据元素a1,a2,……,an组成 的有限序列,称为线性表。 L=(D,R) 其中,D={a1,a2, ……,an} R={< ai-1,ai>| ai-1,ai∈D,2≤ i≤ n } •当n=0时,为空表。
➢ 合并:将两个线性表La和Lb合并成一个长度为 ListLengh(La)+ ListLength(Lb)的线性表Lc。
1) 直接合并:将线性表Lb中的元素插入到线性表La中。 2) 保序合并:将两个有序的表La和Lb归并为一个新的线性表
Lc,并且保证线性表Lc仍然是有序的。 P.26页:算法 2.6
if((i<1)︱︱(i>L.lenght+1)) { printf(“i不合法!”) ;
exit(0);} for (j=i;j<=L.length;j++)
L.data [j]=L.data[j+1]; L.length--; }
顺序表删除的算法评价
设qi是删除第i个元素的概率,则在表长为n的表中删除一个元 素所需移动次数的平均值为:
第二章 线性表
插入、删除算法分析
设在线性表第 i 个元素前插入一新元素的概率为 Pi,删除 第 i 个元素的概率为 Qi,元素移动为算法的基本操作。则插 入和删除的平均移动期望值为:
3、置空线性链表
void clearList_L(LinkList *L)
{ p=L->next; L->next=NULL; while(p) { q=p->next; free(p); p=q; } }
线性链表的访问运算
4、访问第i个数据元素:先找到第i各结点
Status GetElem_L(LinkList L,int i,ElemType &e) { p=L->next;j=1;
取第个i数据元素
LocateElem(L,x):
定位函数
PriorElem(L,elm,&pre_e): 求元素elm的前驱
NextElem(L,elm,&next_e): 求元素elm的后继
ListInsert(&L,i,e):
在第个i元素之前插入元素e
ListDelete(&L,i,&e):
删除第i个元素
{ i=LocateElem_Sq(L, e,compare); if(i>=2) { pre_e=L.elem[i-2]; return(1);} else return(0); }
status NextElem_Sq(SqList L,ElemType e,ElemType &next_e, Status(*compare)(ElemType,ElemType))
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2.2 线性表的顺序存储
构造一个空顺序表L (算法2.3)
#define LIST_INIT_SIZE 100 // 线性表存储空间的初始分配量 #define LISTINCREMENT 10 // 线性表存储空间的分配增量 typedef struct{ ElemType *elem; // 存储空间基址 int length; // 当前长度 ElemType a[100]; int listsize; // 当前分配的存储空量 ElemType *elem; }SqList; ElemType 在前面章节已 elem=a; 经预定义: Status InitList_Sq(SqList &L){ // 构造一个空的线性表 typedef int ElemType L.elem = (ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType)); 或其他类型也可以 if( !L.elem )exit( OVERFLOW ); 判断空间是否分配成功 L.length = 0; L.listsize = LIST_INIT_SIZE; //为线性表分配初始分配量 return OK;}
2.2 线性表的顺序存储
在第i个位置插入一个元素(算法2.4)
Status ListInsert_Sq(Sqlist &L,int i,ElemType e){ if( i<1 || i>L.length+1 ) return ERROR; 判断i值是否合法 if( L.length>=L.listsize) { #define TRUE 1 当前空间已满,增加分配 #define FALSE 0 newbase = ( ElemType *) realloc (L.elem, #define OK 1 (L.listsize+LISTINCREMENT) *sizeof(ElemType)); #define ERROR 0 分配空间失败 if(#define INFEASIBLE -1 !newbase) exit (OVERFLOW); #define OVERFLOW -2 分配空间成功,新基址 L.elem = newbase; 存储容量增加 //Status 是函数的类型,其值 L.listsize += LISTINCREMENT; } 是函数结果状态代码 typedef int Status;
typedef struct{ ElemType *elem; int length; int listsize; }SqList;
// 存储空间基址 // 当前长度 // 当前分配的存储空量
Status InitList_Sq(SqList &L){ ……} Status ListInsert_Sq(SqList &L,int i,ElemType e){ ……} Status Load_Sq(SqList L){ ……}
2.2 线性表的顺序存储
特点:
实现逻辑上相邻—物理地址相邻 实现随机存取
L
内存 a1 a2
元素序号 1 2
实现:可用C语言的一维数组实现
an
n
2.2 线性表的顺序存储
V数组下标 0 1
内存 a1 a2
元素序号 1 2
n-1
an
n
M-1
备 用 空 间
数据元素不是简单类 型时,可定义结构体数 组
简单介绍宏定义#define
2.2 线性表的顺序存储
#define 标识符 字符串 : #define PI 3.14159 即在代码里把3.14159用PI代替 在预处理时把程序中的PI用3.14159替换回去 #define LIST_INIT_SIZE 100 C语言的编译系统:预处理编译连接 #define PI 3.l4159 在预处理时不作任何语法检查,照单全收 typedef int ElemType; #define ElemType int
2.2 线性表的顺序存储
在第i个位置删除一个元素(算法2.5)
Status ListDelete_Sq(SqList &L, int i, ElemType &e) { ElemType *p,*q; if((i<1) || (i>L.length)) return ERROR; 定义一个指针指向要删除的位置 p=&(L.elem[i-1]); e=*p; 定义一个指针指向表尾位置 q=L.elem + L.length – 1; for (++p; p<=q; ++p) 被删除元素后面的所有元素左移 *(p - 1) = *p; --L.length; 表长减1 return OK; }
0<i&l存储
定义:用一组地址连续的存储单元存放一个线性 表 元素地址计算方法:
L
内存 a1 a2
元素序号 1 2
LOC(ai+1)=LOC(ai)+L LOC(ai)=LOC(a1)+(i-1)*L 其中:
an
n
L—-一个元素占用的存储单元个数 LOC(ai)—-线性表第i个元素的地址
2.2 线性表的顺序存储
实现:可用C语言的一维数组实现 缺点:个数需预先设定
( 少--溢出overflow,多--浪费waste) 浪费空间,如何解决?
动态分配顺序存储结构:
先为顺序表分配一个预定义大小的空间 (malloc),一旦因插入元素而导致空间不足, 可进行再分配(realloc),即为顺序表增加空间
输出顺序表中所有元素
Status Load_Sq(SqList &L) { int i; if( L.length= =0) printf(“The List is empty!”); else { printf(“The List is: ”); for(i=0;i< L.length ;i++) printf(“%d ”, L.elem[i] ); } printf(“\n”); return OK; }
例 英文字母表(A,B,C,…..Z)是一个线性表
线性表的抽象数据类型定义
ADT List { 数据对象:D={ai| ai∈ElemSet,i=0,1,…,n- 1,n≥0} 数据关系:R={< ai-1, ai >| ai-1, ai∈D0,i=0,1,…,n-1,n≥0} 基本操作: InitList(&L) //构造一个空的线性表L DestroyList(&L) //销毁一个已存在的线性表L ClearList(&L) //将已存在的线性表L重置为空表 ListEmpty(L) //判断线性表L是否为空 ListLength(L) //求线性表中元素个数 GetElem(L,i,&e) //返回线性表中某元素的值 LocateElem(L,e,compare())返回第一个满足条件的元素位序 ListInsert(&L,i,e) //插入元素e ListDelete(&L,i,&e) //删除元素e ……… }
第二章 线性表
(1,2,3,4,5) (A,B,C,D,…Z) (赵敏,女,21,90,85,79,83,84)
2.1线性表的概念
线性表(linear_list) 线性表是n个数据元素的有限序列,是最常 用而且是最简单的一种数据结构。
线性表的类型定义
定义 n( 0)个数据元素的有限序列,记 作 (a1, a2, … ai, ai+1, … an) ai 是表中数据元素,n 是表长度。
线性表逻辑结构特点
(a1, a2, … ai, ai+1, … an)
同一线性表中的元素同构。 元素之间存在着位序关系。i是数据元素ai的 位序。
a1是唯一的一个被称作“第一个”的数据元素 an是唯一的一个被称作“最后一个”的数据元素 ai有且仅有一个直接前驱是ai-1,a1无直接前驱 ai有且仅有一个直接后继是ai+1,an无直接后继
处理动态分配所需的函数
2.2 线性表的顺序存储
malloc函数: 在内存的动态存储区中分配一个 长度为size的连续空间。 void *malloc(unsigned size) ;
返回一个指向分配区首地址的指针 L.elem = (ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
2.2 线性表的顺序存储
算法评价
设Qi是删除第i个元素的概率,则在长度为n的线性表 中删除一个元素所需移动的元素次数的平均次数为:
E de
Q (n i )
i 1 i
n
T n O n
1 若认为Qi n 1 n n 1 则E de ( n i ) n i 1 2
2.2 线性表的顺序存储
算法时间复杂度T(n)
设Pi是在第i个元素之前插入一个元素的概率, 则在长度为n的线性表中插入一个元素时,所 需移动的元素次数的平均次数为:
Eis P (n i 1) i
i 1 n 1
若 为 P 认 i
1 n 1
T n On
1 n 1 n 则Eis (n i 1) n 1 i 1 2
在第i个位置删除一个元素
2.2 线性表的顺序存储
删除前
(a1,a2,…,a i-1, a i, a i+1, …,an)
删除后
(a1,a2,…,a i-1, a i+1, …,an)