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

合集下载

数据结构 线性表

数据结构 线性表

第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章 线性表

北京林业大学《数据结构与算法》课件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.能够从时间和空间复杂度的角度比较两种存储结
  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的直接后继
相关文档
最新文档