线性表的类型定义、顺序表示和实现

合集下载

数据结构 线性表

数据结构 线性表

第1讲线性表本章主要掌握如下内容:线性表的定义和基本操作,线性表的实现,线性表的顺序存储结构及链式存储结构,线性表的应用。

知识点分析(一)线性表的定义和基本操作1.线性表基本概念1)定义:是由相同类型的结点组成的有限序列。

如:由n个结点组成的线性表(a1, a2, …, a n)a1是最前结点,a n是最后结点。

结点也称为数据元素或者记录。

2)线性表的长度:线性表中结点的个数称为其长度。

长度为0的线性表称为空表。

3)结点之间的关系:设线性表记为(a1,a2,…a i-1 , a i, a i+1 ,…a n),称a i-1是a i的直接前驱结点....(简称前驱),a i+1是a i的直接后继结点....(简称后继)。

4)线性表的性质:①线性表结点间的相对位置是固定..的,结点间的关系由结点在表中的位置确定。

②如果两个线性表有相同的数据结点,但它们的结点顺序不一致,该两个线性表也是不相等的。

注意:线性表中结点的类型可以是任何数据(包括简单类型和复杂类型),即结点可以有多个成分,其中能唯一标识表元的成分称为关键字(key),或简称键。

以后的讨论都只考虑键,而忽略其它成分,这样有利于把握主要问题,便于理解。

『经典例题解析』线性表的特点是每个元素都有一个前驱和一个后继。

( )【答案】错误。

【解析】线性表的第一个数据元素没有前驱,最后一个元素没有后继。

其余的所有元素都有一个前驱和后继。

2.线性表的抽象数据类型线性表是一个相当灵活的数据结构,其长度可以根据需要增加或减少。

从操作上讲,用户不仅可以对线性表的数据元素进行访问操作,还可以进行插入、删除、定位等操作。

1)线性表的基本操作假设线性表L有数据对象 D={ai | ai∈ElemSet,i=1,2,3,…,n,n>=0},数据元素之间的关系R={<ai-1,ai>|ai-1,ai∈D,i=1,2,…,n},则线性表L的基本操作如下所示:●InitList(&L):其作用是构造一个长度为0的线性表(空线性表);●DestoryList(&L):其作用是销毁当前的线性表L;●ClearList(&L):清空线性表L,使之成为空表;●ListLength(L):返回线性表L的长度,即线性表中数据元素的个数;●ListEmpty(L) :判断线性表L是否为空表,是则返回True,否则返回False;●GetElem(L,i,&e):将线性表L中第i个数据元素的值返回到变量e中;●LocateELem(L,e,compare( )) :判断线性表L中是否存在与e满足compare()条件的数据元素,有则返回第一个数据元素;●PriorElem(L,cur_e,&pri_e):返回线性表L中数据元素cur_e的前驱结点;●NextElem(L,cur_e,&next_e):返回线性表L中数据元素cur_e的后继结点;●ListInsert(&L,i,e):向线性表L的第i个位置之前插入一个数据元素,其值为e;●ListDelete(&L,i,&e):删除线性表L的第i个数据元素,并将该数据元素的值返回到e中;●ListTraverse(L,visit()):遍历线性表中的每个数据元素。

算法与数据结构第2章 线性表

算法与数据结构第2章  线性表

利用已有基本运算求解问题 例2.1 假设有两个集合 A 和 B 分别用两个线性表 LA 和 LB 表示,即线性表中的数据元素即为集合中的成员。编写一 个算法求一个新的集合C=A∪B,即将两个集合的并集放在线 性表LC中。 解题思路: LC LA LC LB中不在LA中的元素
void unionList(List LA,List LB,List &LC)
该运算返回L中第 i(1≤i≤ListLength(L))个元素的值,存放在e中。
e=L->data[i-1];
return 1; } 本算法的时间复杂度为O(1)。
(7) 按元素值查找LocateElem(L,e) 该运算顺序查找第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) else } return i+1; return 0;
{ int lena,lenb,lenc,i; ElemType e; InitList(LC); lena=ListLength(LA); for (i=1;i<=lena;i++) //求线性表的长度
//将LA的所有元素插入到Lc中
{ GetElem(LA,i,e); ListInsert(LC,i,e);
0
返回到 sq Main:
???
main:
引用的作用 main() { SqList *sq; InitList(sq); op(sq);

线性表PPT.

线性表PPT.

条件(i<1 || i>pslist->length)也包括对表空的检查。
检查要删除位置的有效性,1≤i≤n 。
删除ai后,该数据已不存在。
顺序表的基本运算
⒋ 按值查找 线性表中的按值查找是指在线性表中查找与给
定值x相等的数据元素,并返回查找成功与否标志。 算法分析
从第一个元素a1起依次和x比较,直到找到一个 与x相等的数据元素,则返回它在顺序表中的存储下 标或序号(二者差一);如果没有找到,返回-1。
return i; /*返回存储位置,即序号*/ }
顺序表的基本运算
时间复杂度分析: 本算法的主要运算是比较,比较次数与x的位置有
关,也与表长有关,当a1=x时,比较一次成功,当 an=x时,比较n次成功,平均比较次数为(n+1)/2,时间 复杂度为O(n)。
顺序表的基本运算
⒌ 查找操作
查找顺序表中第i个位置上的元素值ai,并将该 元素的值返回。
面的值均比a1小,a1后面的值都比a1大。。
划分前 12 26 8 11 19 10 …
划分后 10 11 8 12 26 19 …
顺序表的应用
算法分析
从第二个元素开始
第三课时 水上安全
31.、需请⑴求有咨骑询自当(行分车前析经)验数的学据生交比流。a1大时,不改变其位置,继续比较下一个。
8.交车服务
return(pslist->length); /*求pslist所指向顺序表的长度*/ }
1 完善SeqList_yanshi_1.c,熟悉顺序表的存 储结构及运算。
选:完善SeqList_yanshi_2.c ,体会 typedef及抽象数据类型Elemtype的作用。

chap2数据结构,顺序表,树,图,链表,排序

chap2数据结构,顺序表,树,图,链表,排序

2.4 一元多项式的表示
ADT List { 数据对象: D={ ai | ai ∈ElemSet, i=1,2,...,n, n≥0 } { 称 n 为线性表的表长; 称 n=0 时的线性表为空表。} 数据关系:
R1={ <ai-1 ,ai >|ai-1 ,ai∈D, i=2,...,n }
{ 设线性表为 (a1,a2, . . . ,ai,. . . ,an), 称 i 为 ai 在线性表中的位序。}
i = 1; found = TRUE; while ( i<= La_len && found ) {
GetElem(LA, i, e); // 取得LA中一个元素
if (LocateElem(LB, e, equal( ))
i++;
// 依次处理下一个
else found = FALSE;
// LB中没有和该元素相同的元素
{加工型操作} ClearList( &L ) ( 线性表置空 ) PutElem( &L, i, &e ) ( 改变数据元素的值 ) ListInsert( &L, i, e ) ( 插入数据元素 ) ListDelete( &L, i, &e ) ( 删除数据元素 )
ClearList( &L ) 初始条件:线性表 L 已存在。 操作结果:将 L 重置为空表。 PutElem( &L, i, e ) 初始条件: 线性表 L 已存在, 且 1≤i≤LengthList(L)。 操作结果:L 中第 i 个元素赋值和 e 相同。
线性结构的基本特征: 线性结构 是 一个数据元素的有序(次序)集 1.集合中必存在唯一的一个“第一元素” 2.集合中必存在唯一的一个 “最后元素”

数据结构 线性表

数据结构 线性表

(9) Status NextElem_Sq(SqList L, ElemType cur_e, ElemaType &next_e)
//若cur_e是线性表L的元素且不是最后一个,返回它的后继 { for (i=0; i<L.length-1; i++) if (cur_e==L.elem[i]) { next_e=L.elem[i+1]; return OK; } return ERROR; }//NextElem_Sq O(n)
抽象数据类型 唯 一 数据的逻辑结构 确 操作的定义 定
集合 *
线性表
特殊线性表 扩展线性表
线性结构
树形结构 图形结构
灵 活 数据的存储结构 操作的实现 设 计
顺序存储 链式存储 散列(哈希)存储
数据的基本操作:针对结构、针对元素、针对状态
数据结构---第二章 线性表 1
第二章 线性表
2.1 2.2 2.3 2.4
数据结构---第二章 线性表
9
2.2 线性表的顺序存储结构(顺序表)
起始地址为b、最多可容纳maxlen个元素的线性表
下标 存储地址
0
1
b b+c
b+(i-1)c
a1 a2
ai
c个存储单元
i-1
LOC(ai)=LOC(a1)+(i-1)c LOC(ai)=LOC(ai-1)+c
n-1
b+(n-1)c
n-1
int LocateElem_Sq(SqList L, ElemType e, (7) Status (*compare)(ElemType,ElemType) ) //在线性表L中查找第1个值与e满足 //compare()的元素的位序 { for (i=0; i<L.length; i++) L.elem[i]==e if ( (*compare)(L.elem[i],e) ) return i+1; return 0 ; //作为未找到的特殊标记 } // LocateElem_Sq O(n) P25-2.6

数据链表

数据链表

数据元素插入到线性表 LA 中去。
操作步骤:
1.从线性表 LB 中依次察看每个数据元素;
GetElem(LB, i)→e
2.依值在线性表 LA 中进行查访;
LocateElem(LA, e, equal( )) 3.若不存在,则插入之。 ListInsert(LA, n+1, e) ( n 表示线性表 LA 当前长度)
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); // 取Lb中第i个数据元素赋给e if (!LocateElem(La, e, equal( )) ) ListInsert(La, ++La_len, e);
线性表是一种最简单的线性结构
线性结构的基本特征:
线性结构 是 一个数据元素的有序(次序)集
1.集合中必存在唯一的一个“第一元素”; 2.集合中必存在唯一的一个 “最后元素”
3.除最后元素在外,均有 唯一的后继;
4.除第一元素之外,均有 唯一的前驱。
2.1 线性表的类型定义和操作
2.2 线性表类型的实现 顺序映象 2.3 线性表类型的实现 链式映象
内存单元 ... a1 a2 a3 ai an ...
图2-1 线性表顺序存储结构示意图
以“存储位置相邻”表示有序对<ai-1,ai
即:LOC(ai) = LOC(ai-1) + L
一个数据元素所占存储量↑
所有数据元素的存储位置均取决于

线性表的定义和基本操作

线性表的定义和基本操作线性表的定义提到线性这个词,并不陌⽣,在中学过线性的逻辑结构。

线性逻辑结构是⼀对⼀关系,结点之间排成了⼀列或者⼀⾏,所以说线性表也是⼀种逻辑关系。

有了对线性表的认知,那么来看⼀下它的概念:线性表是具有相同类型的 n (n>=0) 个元素的有限序列,其中 n 为表长,当 n=0 时,该表为空表。

为什么要相同类型?计算机在处理⼤量数据的时候,把相同的数据元素称作为数据对象。

往往要处理相同的数据元素,也就处理⼀种数据对象。

不会把⾳频和图⽚杂糅到⼀起进⾏处理。

也不会把抽象事物,⽐如说⼈和汽车组合到⼀起进⾏处理。

因为这样没有意义,也没有⾼的效率。

对于相同类型,在接下来所学到的所有的数据结构中都有这样的要求。

因为具有相同类型的数据结构,它在解决实际问题,实现算法时,才更加的有意义。

其次,对于这个类型的范围,它的定义其实并不狭隘,并不仅仅局限于我们常见的类型,⽐如说整型、浮点型这样的类型。

对于从实际⽣活中抽象出来的类型,⽐如说⼀本书、⼀个⼈也是可以作为⼀个元素的。

它与 C++ 中的⾯向对象的类⽐较相似。

除了相同类型,定义中还有⼀个⽐较重要的点,那就是是有限序列。

什么是有限?就是说明该线性表的长度是有限的,因为计算机⽆法处理⽆限多的数据。

第⼆个是序列,根据下⾯的表⽰⽅法可以发现,线性表中每⼀个元素都是有序号的,序列的意思就是有序号的⼀种排列。

这就是在线性表定义中⽐较重要的两个点。

若 L 命名为线性表,则⼀般表⽰为:在 L 当中,线性表的每⼀个元素都具有相同类型,都是属于同⼀个数据对象的数据元素,分别是 a1、a2⼀直到 a n。

可以发现,对于所有的元素它都是有序号的。

那么在表中,第⼀个元素,称它为表头元素,最后⼀个元素称它为表尾元素。

除了这样,该线性表还有⼀些其他的逻辑关系。

在线性表中,每⼀个元素除了表头元素,它都有⼀个前驱结点。

也就是 a i+1的前驱结点,即是 a i。

同样在表中,每⼀个元素除了表尾元素,它都有⼀个后继结点。

北京林业大学《数据结构与算法》课件PPT 第2章 线性表


线性表P = (p0,p1,p2,…,pn)
P(x) = 10 + 5x - 4x2 + 3x3 + 2x4
指数 (下标i)
0
1
2
3
系数p[i] 10
5
-4
3
数组表示
(每一项的指数i隐含 在其系数pi的序号中)
4
2
北京林业大学信息学院
Rn(x) = Pn(x) + Qm(x)
线性表R = (p0 + q0,p1 + q1,p2 + q2,…,pm + qm,pm+1,…,pn)
数,即表长
例1 分析26 个英文字母组成的英文表
( A, B, C, D, …… , Z) 数据元素都是字母; 元素间关系是线性 例2 分析学生情况登记表
学号
041810205 041810260 041810284 041810360

姓名
于春梅 何仕鹏 王爽 王亚武

性别
女 男 女 男 :
年龄
下标i 0
1
2
系数 b[i]
8
22 -9
指数 1
7
8
线性表P =((p1, e1), (p2, e2),…,(pm, em))
创建一个新数组c 分别从头遍历比较a和b的每一项
✓指数相同,对应系数相加,若其和不为零,则在c中增加一个新项 ✓指数不相同,则将指数较小的项复制到c中 一北个京多林项业大式学已信遍息历学完院毕时,将另一个剩余项依次复制到c中即可
线性表
北京林业大学信息学院
第2章 线性表
教学目标
1. 了解线性结构的特点 2.掌握顺序表的定义、查找、插入和删除 3.掌握链表的定义、创建、查找、插入和删除 4.能够从时间和空间复杂度的角度比较两种存储结

线性表的顺序存储——顺序表

线性表的顺序存储——顺序表之前我们讲了线性表, 本篇来阐述下线性表的顺序存储——顺序表定义线性表的顺序存储⼜称为顺序表, 它是⽤⼀组地址连续的存储单元依次存储线性表中的数据元素. 逻辑上相邻的两个数据元素在物理位置上同样相邻.规律顺序表中逻辑顺序与物理顺序相同L = ($a_{1}$, $a_{2}$, ..., $a_{i}$, $a_{i + 1}$, ..., $a_{n}$)其中在逻辑上相邻的两个数据元素,在顺序表中也存放在相同的存储单元当中,每⼀个⼩格⼦就代表⼀个存储单元。

注线性表中的元素的位序是从1开始, ⽽数组中元素下标是从0开始的若线性表存储的起始位置为Loc(A), sizeof(ElemType)为每个数据元素所占⽤的存储空间⼤⼩, 那么根据这⼀特点,我们可以计算出每⼀个数据元素存储的地址。

第⼀个元素的地址是 LOC(A),计算第⼆个元素的地址就可以⽤第⼀个元素的地址加上第⼀个数据元素 $a_{1}$ 所消耗的存储空间,⽤ sizeof 可求得该数据元素所消耗的存储空间⼤⼩。

这⾥需要注意的⼀点是,n 与 MaxSize 是有含义上的不同的,其中 $a_{n}$ 代表的是顺序表中最后⼀个数据元素,⽽ MaxSize 代表的是数组的最后⼀个存储单元。

顺序表的两种实现⽅法顺序表可以⽤数组来实现。

根据数组的两种分配⽅式,也就有两种描述顺序表的⽅法。

分别是静态描述分配顺序表的⽅法和动态描述分配顺序表的⽅法。

⾸先来看数组静态分配时时如何描述⼀个顺序表的。

静态描述分配顺序表#define MaxSize 50typedef struct{ElemType data[MaxSize];int length;}SqList;这就是描述顺序表的语句。

第⼀句是定义了⼀个宏,也就是定义线性表的最⼤长度为 50,同时这也是数组的最⼤容量。

接着定义了⼀个结构体。

结构体就是把多个基本数据类型组合到⼀起构成⼀个新的数据类型。

810数据结构

2015年学术型硕士研究生招生考试大纲(数据结构)学科、专业:食品安全与智能控制(0832Z1)
一、绪论
1、什么是数据结构
2、基本概念和术语
3、抽象数据类型的表示与实现
4、算法和算法分析
二、线性表
1、线性表的类型定义
2、线性表的顺序表示和实现
3、线性表的链式表示和实现
三、栈和队列
1、栈
2、栈的应用举例
3、队列
四、串
1、串类型的定义
2、串的表示和实现
五、数组和广义表
1、数组的定义
2、数组的顺序表示和实现
3、矩阵的压缩存储
4、广义表的定义
5、广义表的存储结构
六、树和二叉树
1、树的定义和基本术语
2、二叉树
3、遍历二叉树和线索二叉树
4、树和森林
5、赫夫曼树及其应用
七、图
1、图的定义和术语
2、图的存储结构
3、图的遍历
4、图的连通性问题
5、最短路径
八、查找
1、静态查找表
2、动态查找表
3、哈希表
九、内部排序
1、插入排序
2、快速排序
3、选择排序
4、归并排序
5、基数排序
十、外部排序
1、外存信息的存取
2、外部排序的方法
参考书目:《数据结构(C语言版)》,严蔚敏、吴伟民编著,清华大学出版社,第一版,2011。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
l 表示为:A=(a1,a2,… ,ai,ai+1,… ,an )
第i个元素的地址
l 假设线性表中有n个元素,每个元素占k个单 元,第一个元素的地址为loc(a1),则可以通过 如下公式计算出第i个元素的地址loc(ai): loc(ai) =loc(a1)+(i-1)×k
l 其中loc(a1)称为基地址。
int locateElem(&L,e,compare()); //返回L中第1个与e满足关系compare()的数据 元素的位序。若这样的数据元素不存在,则返回0
bool insertElem(&L, e, pos); //在L的pos位置插入e,线性表L长度加1
bool deleteElem(&L,pos); //删除L的第pos个数据元素
l 线性表的数学模型(形式定义):
l 含有n个数据元素的线性表是一个数据结构
l
LinearList=(A, R)
l 其中: A={ai| ai∈ElemType , 1≤i≤n, n≥0}
l
R={r}
l
r={<ai, ai+1> | 1≤i≤n -1}
说明:
l ①线性表的数据元素可以是各种类型(整、实、记录类型等 )
typedef Node ElemType; //声明结点的类型名为ElemType
struct SqList
//定义线性表的存储结构
{
ElemType* list;
int size;
int maxSize;
};
bool initList(SqList& L,int ms); void clearList(SqList& L); int getSize(SqList L); bool isEmpty(SqList L); bool isFull(SqList L); void traverList(SqList L,void (*visit)(ElemType&)); ElemType& getElem(SqList L,int pos); int locateElem(SqList& L,ElemType e,int (*compare)(ElemType,ElemType)); int findList(SqList L,ElemType e); bool insertElem(SqList& L,ElemType e,int pos); bool deleteElem(SqList& L,int pos); bool createList(SqList& L,int n,void (*visit)(ElemType&));
l
if (!locateElem(la,e,equal))
l
insertElem(la,e,la.size+1);
l}
l}
l int equal(ElemType e1,ElemTypd==e2.id)
l
return 1;
l return 0;
l}
算法的时间复杂度为O(La.size×Lb.size)。
线性表的类型定义、顺 序表示和实现
2020年4月19日星期日
l 线性表是一种最简单的线性结构。
l 什么是线性结构?简单地说,线性结构是一个数据元素的有 序(次序)集合。它有四个基本特征:
l 在数据元素的非空有限集中,
– ①存在惟一的一个被称做"第一个"的数据元素; – ②存在惟一的一个被称做"最后一个"的数据元素; – ③除第一个之外,集合中的每个数据元素均只有一个前驱; – ④除最后一个之外,集合中的每个数据元素均只有一个后继。
l ④序列中数据元素的个数 n 定义为线性表的表长,n=0 时的 线性表被称为空表;
l ⑤称i为数据元素在线性表中的位序。
2.1.2 线性表的抽象数据类型
ADT LinearList { Data: 一个线性表L定义为L=(a1,a2,…,an),当L=( )时定义为一个空表 。 Operation: bool initList(& L); //初始化线性表L,即把它设置为一个空表 void clearList(& L); //将L重置为空表 int getSize(L); //返回L中数据元素的个数 bool isEmpty(L); //判断L是否为空,若空则返回true,否则返回false void traverList(L, visit( )); //遍历线性表L,依次对L的每个数据元素调用函数visit( ) ElemType& getElem(L, pos); //返回线性表第pos个数据元素的值
2.2 线性表的顺序表示和实现
2.2.1 线性表的顺序表示
l 线性表的顺序存储是指用一组地址连续的存 储单元依次存储线性表中的各个元素,使得 线性表中在逻辑结构上相邻的数据元素存储 在相邻的物理存储单元中,即通过数据元素 物理存储的相邻关系来反映数据元素之间逻 辑上的相邻关系。 采用顺序存储结构的线性 表通常称为顺序表。
线性表的顺序存储结构示意图
顺序存储结构可以借助于高级程序设计语言中的一维数组来表示。
用C++语言描述的顺序表类型如下所示: sqlist.h
#include <iostream> using namespace std;
struct Node {
int id; int age; };
//定义结点(数据元素)的类型
l 这里的"有序"仅指在数据元素之间存在一个"领先"或"落后" 的次序关系,而非指数据元素"值"的大小可比性。比较典型 的线性结构:线性表、栈、队列、串等。
2.1 线性表的类型定义
2.1.1 线性表的定义
l 线性表(linear_list)是n个数据元素的有限序列,记作 (a1, a2, …, ai, …, an)。
元素,重复 ①、②、③,直到取完Lb的每个元素 。
l void unionList(SqList &la,SqList lb)
l{
l int lbSize=getSize(lb);
l ElemType e;
l for (int i=1;i<=lbSize;++i)
l{
l
e=getElem(lb,i);
bool createList(&L,n, visit ()); //创建有n个元素的线性表
}
2.1.3 操作举例
l 例:假设利用两个线性表La和Lb分别表示两 个集合A和B,求一个新的集合A=A∪B。
l 算法:
– ①取得Lb中的1个元素; – ②在La中查找这个元素; – ③若不存在:插入La中;若存在,取Lb中下一个
l
typedef int ElemType;
l
typedef char ElemType;
l
等;
l ②同一线性表中的数据元素必须具有相同的特性,属同一类 型;
l ③a2,关…系, ra是i-1,一a个i, a有i+1序, …偶,对an的)集,合a,i-1即领对先于于非ai,空表的示线了性数表据(元a1,素 之;间的相邻关系,称ai-1是ai的直接前驱,ai是ai-1的直接后继
相关文档
最新文档