第2章 线性表1-顺序表

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

a1 a2 … ai ai+
1
n-1 n
… an
length nn+1
e 插入完成
2.2 顺序存储结构的C语言定义
Status ListInsert(struct SqList *L,int i,ElemType e)
{ int j;
if (i<1 || i>L->length+1)
return ERROR ;
Status ListLength(struct SqList *L) {
return (L->length); }
2.2 顺序存储结构的C语言定义
(5)输出线性表DispList(L) 该运算当线性表L不为空时,顺序显示L中各元素的值。
void DispList(struct SqList *L) { int i;
2.1 线性表的抽象数据类型定义
ADT的形式化定义是三元组:ADT=(D,S,P) ADT List{
数据元素: D={ai| ai∈ElemSet, i=1,2,…,n,n≥0 }
数据关系: S={<ai,ai+1>|ai,ai+1∈ElemSet, i=1,2, …,n-1}
2.1 线性表的抽象数据类型定义
//参数错误时返回false
i--;
//将顺序表逻辑序号转化为物理序号
for (j=L->length;j>i;j--) //将data[i..n]元素后移一个位置
L->data[j]=L->data[j-1];
(6)LocateElem(L,e): 初始条件:L已存在 操作结果:返回L中第1个值域与e相等的逻辑位 序。若这样的元素不存在,则返回值为0。
2.1 线性表的抽象数据类型定义
{加工型操作} (7)ListInsert(&L,i,e) (8)ListDelete(&L,i,&e)
2.1 线性表的抽象数据类型定义
2.1.2 线性表的逻辑结构
线性表中的结点可以是单值元素(每个元素只 有一个数据项) 。
【例】大写英文字母表 (A,B,C、…、Z) 【例】 一副扑克的点数 (2,3,4,…,J,Q, K,A)
2.1.2 线性表的逻辑结构
线性表中的结点可以是记录型元素,每个元 素含有多个数据项 ,每个项称为结点的一个域 。 每个元素有一个可以唯一标识每个结点的数据 项组,称为关键字。
a2
2



loc(a1)+(i-1)k
ai
i



loc(a1)+(n-1)k
an
n

loc(a1)+(maxlen-1)k
2.2 顺序存储结构的C语言定义
顺序表类型定义:
#define OK 1 #define ERROR -1 #define MAX_SIZE 100 typedef int Status ; typedef int ElemType ;
2.1 线性表的抽象数据类型定义
List purge(List LA,List LB){ int i,e,Lalen, Lblen; Lalen=ListLength(LA); Lblen=ListLength(LB); for(i=1;i<=Lblen;i++) {
e=GetElem(LB,i); en=GetElem(LA,Lalen); if(ListEmpty(LA)||en!=e) ListInsert(LA,++Lalen,e); }//end for return LA; }//end union
题目求解: 1、从线性表LB中依次取得每个数据元素:
GetElem(LB,i)->e 2、依值在线性表LA中进行查访:
LocateElem(LA,e) 3、若不存在,则插入之
ListInsert(LA,n+1,e)
2.1 线性表的抽象数据类型定义
C语言描述: List union(List LA,List LB){ int i,e,Lalen, Lblen; Lalen=ListLength(LA); Lblen=ListLength(LB); for(i=1;i<=Lblen;i++) {
2.2 顺序存储结构的C语言定义
(7)按元素值查找LocateElem(L,e) 该运算顺序查找第1个值与e相等的元素的逻辑位序。 若这样的元素不存在,则返回值为false。
Status LocateElem(struct SqList *L, ElemType e)
{ int i=0;
while (i<L->length && L->data[i]!=e)
2.1 线性表的抽象数据类型定义
(3) ListEmpty(L): 初始条件:L已存在 操作结果:若L为空表,则返回真,否则返回假 。
(4)ListLength(L): 初始条件:L已存在 操作结果:返回L中元素个数
2.1 线性表的抽象数据类型定义
(5) GetElem(L,i,&e): 初始条件:L已存在,1≤i≤ListLength(L) 操作结果:用e返回L中第 i个元素的值。
空表,则返回true,否则返回false。
Status ListEmpty(struct SqList *L) {
return (L->length==0); }
2.2 顺序存储结构的C语言定义
(4)求线性表的长度ListLength(L) 该运算返回顺序表L的长度。实际上只需返回
length成员的值即可。
本章要求
理解:线性表的基本概念 掌握: 1、线性表的存储结构(顺序表、单链表、 双链表、循环链表) 2、顺序表、单链表的基本运算实现。 3、循环单链表、双链表、循环双链表运算 实现上与单链表的不同之处。
2.1 线性表
【例】一副扑克的点数 (2,3,4,…,J,Q,K,A)
【例】学生信息表
学号 1 8 34
2.2 线性表的顺序存储结构
顺序存储 : 把线性表的结点按逻辑顺序依次存放在一组
地址连续的存储单元里。
采用顺序存储结构的线性表通常称为顺序表。
2.2 线性表的顺序存储结构
在具体的机器环境下:设有非空的线性表:(a1, a2,…,ai,…,an)
存储地址
内存空间状态 逻辑地址
Loc(a1)
a1
1
Loc(a1)+(2-1)k
(7)ListInsert(&L,i,e): 初始条件:L已存在,1≤i≤ListLength(L)+1 操作结果:在L的第i个元素位置插入新的元素e ,L的长度增1。
2.1 线性表的抽象数据类型定义
(8)ListDelete(&L,i,&e): 初始条件:L已存在,1≤i≤ListLength(L) 操作结果:删除L的第i个元素,并用e返回其值 ,L的长度减1。
(1.1)初始化顺序表InitList( L ) 该运算的结果是构造一个空的线性表L。实际 上只需将length成员设置为0即可。
Status InitList( struct SqList *L ) { L->data=( ElemType * )malloc(MAX_SIZE*sizeof( ElemType ) ) ; L->length= 0 ; return OK ; }
i++;
if (i>=L->length) return ERROR ;
else return i+1; }
2.2 顺序存储结构的C语言定义
(8)插入数据元素ListInsert(L,i,e) 该运算在顺序表L的第i(1≤i≤ListLength(L)+1)个 位置上插入新的元素e。
01
i-1 i i+1
Status GetElem(struct SqList *L,int i)
{ ElemType e;
if (i<1 || i>L->length) return ERROR ;
e=L->data[i-1];
return e;
本 算 法 的 时 间 复 杂 度 为 O(1) 。
}
体现顺序表的随机读取特性
e=GetElem(LB,i); if(!LocateElem(LA,e)) ListInsert(LA,++Lalen,e); }//end for return LA; }//end union
2.1 线性表的抽象数据类型定义
【例2】已知一个非纯集合B,试构造一个纯 集合A,使A中只包含B中所有值各不相同的数 据元素。
【例】学生信息表
学号 1 33 66
姓名 张斌 刘丽 李英
性别 男 女 女
班号 9901 9902 9901
数据项 数 据 元 素
2.1 线性表的逻辑表示
线性表的逻辑结构:
(a1,a2,…,ai-1,ai,ai+1,…,an)
表头元素
表尾元素
线性表中所含元素的个数叫做线性表的长度, 用n表示,n≥0。n=0时,表示线性表是一个空表, 即表中不包含任何元素。
2.2 顺序存储结构的C语言定义
(1.2)初始化顺序表InitList( L ) 该运算的结果是构造一个完整的线性表L。实 际上只需将length成员设置为0即可。
Status InitList( struct SqList *L,int a[],int n) { L->data=( ElemType* )malloc(MAX_SIZE*sizeof( ElemType ) ) ; int i; for(i=0;i<n;i++) L->data[i]=a[i]; L->length= n ; return OK ;
姓名 张斌 刘丽 李英
性别 男 女 女
班号 9901 9902 9901
数据项 数 据 元 素
2.1 线性表的概念
线性表:是一个具有相同特性的数据元素的有 限序列。
相同特性:所有元素属于同一数据类型。 有限:数据元素个数是有限的。 序列:数据元素由逻辑序号唯一确定。一个 线性表中可以有相同值的元素。
if (ListEmpty(L)) return; for (i=0;i<L->length;i++)
printf("%d",>data[i]); printf("\n"); }
2.2 顺序存储结构的C语言定义
(6)求某个数据元素值GetElem(L,i,&e) 该运算返回L中第 i(1≤i≤ListLength(L))个元素的值
2.2 顺序存储结构的C语言定义
顺序表类型定义:
struct SqList { ElemType *data;
int length; } ; //顺序表类型
ElemType为对象类型
其中data成员存放元素,length成员存放线性表的 实际长度。
说明:注意逻辑位序和物理位序相差1。
2.2 顺序存储结构的C语言定义
第2章 线性表
线性结构的定义: 是一个数据元素的有序(次序)集。
第2章 线性表
线性结构的基本特征: 存在一个唯一的被称为“第一个”的数据 元素; 存在一个唯一的被称为“最后一个”的数 据元素; 除第一个元素外,每个元素均有唯一一个 直接前驱; 除最后一个元素外,每个元素均有唯一一 个直接后继。
2.1 线性表的类型定义 2.2 线性表的顺序表示和实现 2.3 线性表的链式表示和实现 2.4 一元多项式的表示和相加
}
2.2 顺序存储结构的C语言定义
(2)销毁线性表DestroyList(L) 该运算的结果是释放线性表L占用的内存空间。 void DestroyList(struct SqList *L) {
free(L); }
L
顺序表
free(L)释放L所指向的空间
2.2 顺序存储结构的C语言定义
(3)判定是否为空表ListEmpty(L) 该运算返回一个值表示L是否为空表。若L为
基本操作: {结构初始化}
(1)InitList(L)
初始条件:无。 操作结果:将L初始化为空表。
2.1 线性表的抽象数据类型定义
基本操作: {结构销毁}
(2)DestroyList(L) 初始条件:线性表L已存在。 操作结果:将L销毁。
2.1 线性表的抽象数据类型定义
{引用型操作} (3) ListEmpty(L) (4)ListLength(L,&length) (5) GetElem(L,i,&e) (6)LocateElem(L,e)
}ADT List;
2.1 线性表的抽象数据类型定义
【例1】假设有两个集合A和B分别用线性表 LA和LB表示(即线性表中数据元素为集合成 员),现要求解A=A U B。
转化为对线性表的操作: 扩大线性表LA,将存在于线性表LB中而线性 表LA中没有的数据元素插入到线性表LA中。
2.1 线性表的抽象数据类型定义
相关文档
最新文档