数据结构线性表

合集下载

数据结构 线性表

数据结构 线性表

第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()):遍历线性表中的每个数据元素。

数据结构第1讲---线性表

数据结构第1讲---线性表
type p=^integer; var p1:p; p1
34F2 地址 被释放,变 量P与地址 34F2没有关 系
p1^
200 34F2
34F2
new(p1) ——向计算机申请内存地址 p1^:=200 ——给p1指向的单元赋值 dispose(p1) ——释放存储单元
链式结构——什么是指针
Type p=^integer; arr=array[1..4] of char; arrp = ^arr; Var p1:p; p2:arrp;
线性结构 数据的逻辑结构 数 据 结 构 树形结构 图形结构 数据的存储结构 顺序存储
链式存储
数据结构的基本运算 :查找、插入、删除等
三、线性结构——线性表
1、线性表的概念
线性表是由n(n≥0)个具有相同特性数据元素(结点)
a1,a2,…,an组成的有限序列。
线性表的长度:所含元素的个数,用n表示,n>=0。
在我们生活中有哪些属于线性表的例子,列举几个。 1、英文字母表(A,B,…,Z)是线性表, 表中每个字母是一个数据元素(结点)
2、学生成绩表中,每个学生及其成绩是一
个数据元素,其中数据元素由学号、姓名、
各科成绩及平均成绩等数据项组成。
4、线性表的顺序存储
顺序存储是线性表的一种最 简单的存储结构,存储方式是: 在内存中为线性表开辟一块连 续的存储空间。用数组来存放 每一个节点。
[例4-2] 法雷序列
[问题描述]对任意给定的一个自然数n(n<=100),将 分母小于等于n的不可约的真分数按上升次序排序,并 且在第一个分数前加0/1,而在最后一个分数后加1/1, 这个序列称为n级的法雷序列。 当n=8时序列为:0/1, 1/8, 1/7, 1/6,1/5, 1/4,2/7,1/3,3/8, 2/5,3/7,1/2,4/7,3/5,5/8,2/3,5/7,3/4, 4/5,5/6,6/7,7/8, 1/1 。 编程求出n级的法雷序列,每行输出10个分数。

数据结构第二章:线性表

数据结构第二章:线性表
实现逻辑上相邻—物理地址相邻 实现逻辑上相邻— 实现随机存取 实现随机存取
实现:可用C 实现:可用C语言的一维数组实现
6
V数组下标 0 1
内存 a1 a2
元素序号 1 2
typedef int DATATYPE; #define M 1000 DATATYPE data[M]; 例 typedef struct card { int num; char name[20]; char author[10]; char publisher[30]; float price; }DATATYPE; DATATYPE library[M];
4
{加工型操作 加工型操作} 加工型操作
ClearList( &L ) 初始条件:线性表 L 已存在。 操作结果:将 L 重置为空表。 PutElem( &L, i, &e ) 初始条件:线性表L已存在,1≤i≤LengthList(L)。 操作结果:L 中第 i 个元素赋值同 e 的值 ListInsert( &L, i, e ) 初始条件:线性表 L 已存在,1≤i≤LengthList(L)+1。 操作结果:在 L 的第 i 个元素之前插入新的元素 e,L 的长度增1。 ListDelete( &L, i, &e ) 初始条件:线性表 L 已存在且非空,1≤i≤LengthList(L)。 操作结果:删除 L 的第 i 个元素,并用 e 返回其值,L 的长度减1。 }ADT LIST
3
PriorElem( PriorElem L, cur_e, &pre_e ) 初始条件:线性表 L 已存在。 操作结果:若 cur_e 是 L 中的数据元素,则用 pre_e 返回 它的前驱,否则操作失败,pre_e 无定义。 NextElem( NextElem L, cur_e, &next_e ) 初始条件:线性表 L 已存在。 操作结果:若 cur_e 是 L 中的数据元素,则用 next_e 返 回它的后继,否则操作失败,next_e 无定义。 GetElem( GetElem L, i, &e ) 初始条件:线性表 L 已存在,1≤i≤LengthList(L)。 操作结果:用 e 返回 L 中第 i 个元素的值。 LocateElem( LocateElem L, e, compare( ) ) 初始条件:线性表 L 已存在,compare( ) 是元素判定函数。 操作结果:返回 L 中第1个与 e 满足关系 compare( ) 的元 素的位序。若这样的元素不存在,则返回值为0。 ListTraverse(L, visit( )) ListTraverse 初始条件:线性表 L 已存在,visit( ) 为元素的访问函数。 操作结果:依次对 L 的每个元素调用函数 visit( )。 一旦 visit( ) 失败,则操作失败。

【数据结构】线性表的基本操作

【数据结构】线性表的基本操作

【数据结构】线性表的基本操作【数据结构】线性表的基本操作1:定义1.1 线性表的概念1.2 线性表的特点2:基本操作2.1 初始化操作2.1.1 空表的创建2.1.2 非空表的创建2.2 插入操作2.2.1 在指定位置插入元素2.2.2 在表头插入元素2.2.3 在表尾插入元素2.3 删除操作2.3.1 删除指定位置的元素2.3.2 删除表头的元素2.3.3 删除表尾的元素2.4 查找操作2.4.1 按值查找元素2.4.2 按位置查找元素2.5 修改操作2.5.1 修改指定位置的元素 2.5.2 修改指定值的元素3:综合操作3.1 反转线性表3.2 合并两个线性表3.3 排序线性表3.4 删除重复元素3.5 拆分线性表4:线性表的应用场景4.1 数组的应用4.2 链表的应用4.3 栈的应用4.4 队列的应用附件:无法律名词及注释:- 线性表:根据某种规则排列的一组元素的有限序列。

- 初始化操作:创建一个空的线性表,或者创建一个已经包含一定元素的线性表。

- 插入操作:在线性表的指定位置或者表头、表尾插入一个新元素。

- 删除操作:从线性表中删除掉指定位置或者表头、表尾的元素。

- 查找操作:在线性表中按照指定的元素值或者位置查找元素。

- 修改操作:更改线性表中指定位置或者值的元素。

- 反转线性表:将线性表中的元素顺序颠倒。

- 合并线性表:将两个线性表合并成一个新的线性表。

- 排序线性表:按照某种规则对线性表中的元素进行排序。

- 删除重复元素:将线性表中重复的元素删除,只保留一个。

- 拆分线性表:将一个线性表分成多个不重叠的子线性表。

02331自考数据结构 第二章 线性表

02331自考数据结构 第二章 线性表

return ;
}
if ( L -> length >= ListSize ){
printf (" overflow ");
return ;
}
for ( j - L -> length -1; j >= i -1; j --)
L ->data [ j +1]= L -> data [ j ]; //从最后一个元素开始逐一后移
线性表的基本运算
上述运算仅仅是线性表的基本运算,不是其全部运 算。因为对不同问题的线性表,所需要的运算可能不同。 因此,对于实际问题中涉及其他更为复杂的运算,可用 基本运算的组合来实现。
线性表的基本运算
【例2.1】假设有两个线性表 LA 和 LB 分别表示两个 集合 A 和 B ,现要求一个新集合 A = A∪B 。
线性表的逻辑定义
数据元素“一个接一个的排列”的关系叫做 线性关系,线性关系的特点是“一对一”,在计 算机领域用“线性表”来描述这种关系。另外, 在一个线性表中数据元素的类型是相同的,或者 说线性表是由同一类型的数据元素构成的,如学 生情况信息表是一个线性表,表中数据元素的类 型为学生类型;一个字符串也是一个线性表:表 中数据元素的类型为字符型等等。
,
a2
i
,…,
ai-1
,
a.aii++1.1 , .…,
an
)
an
线性表n的-1逻辑结an构和存储结构都发…生了相应的变化, 与插入运算相反,插…入是向后移动元素,而删除运算则
是向前移M动AX元-1 素,除非i=n 时直接删除终端元素,不需移
动元素。
删除前
删除后

数据结构线性表

数据结构线性表

数据结构线性表一、引言数据结构是计算机存储、组织数据的方式,它决定了数据访问的效率和灵活性。

在数据结构中,线性表是一种最基本、最常用的数据结构。

线性表是由零个或多个数据元素组成的有限序列,其中数据元素之间的关系是一对一的关系。

本文将对线性表的概念、分类、基本操作及其应用进行详细阐述。

二、线性表的概念1.数据元素之间具有一对一的关系,即除了第一个和一个数据元素外,其他数据元素都是首尾相连的。

2.线性表具有唯一的第一个元素和一个元素,分别称为表头和表尾。

3.线性表的长度是指表中数据元素的个数,长度为零的线性表称为空表。

三、线性表的分类根据线性表的存储方式,可以将线性表分为顺序存储结构和链式存储结构两大类。

1.顺序存储结构:顺序存储结构是将线性表中的数据元素按照逻辑顺序依次存放在一组地质连续的存储单元中。

顺序存储结构具有随机访问的特点,可以通过下标快速访问表中的任意一个元素。

顺序存储结构的线性表又可以分为静态顺序表和动态顺序表两种。

2.链式存储结构:链式存储结构是通过指针将线性表中的数据元素连接起来,形成一个链表。

链表中的每个节点包含一个数据元素和一个或多个指针,指向下一个或前一个节点。

链式存储结构具有动态性,可以根据需要动态地分配和释放节点空间。

链式存储结构的线性表又可以分为单向链表、双向链表和循环链表等。

四、线性表的基本操作线性表作为一种数据结构,具有一系列基本操作,包括:1.初始化:创建一个空的线性表。

2.插入:在线性表的指定位置插入一个数据元素。

3.删除:删除线性表中指定位置的数据元素。

4.查找:在线性表中查找具有给定关键字的数据元素。

5.更新:更新线性表中指定位置的数据元素。

6.销毁:释放线性表所占用的空间。

7.遍历:遍历线性表中的所有数据元素,进行相应的操作。

8.排序:对线性表中的数据元素进行排序。

9.合并:将两个线性表合并为一个线性表。

五、线性表的应用1.程序语言中的数组:数组是一种典型的顺序存储结构的线性表,常用于存储具有相同类型的数据元素。

数据结构 线性表

数据结构 线性表

(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

《数据结构》课程课件第二章线性表

《数据结构》课程课件第二章线性表

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

a2
2

……
随表
ai ai+1 ……
i
机中
存的
取元
。素
an
n

空闲区

8
例1 一个一维数组M,下标的范围是0到9,每
个数组元素用相邻的5个字节存储。存储器按字 节编址,设存储数组元素M[0]的第一个字节的地
址是98,则M[3]的第一个字节的地址是 113
应当有1≤i≤L.length
18
删除顺序表的第i个结点L.data[i-1]
SeqList DeleteList(SeqList L, int i){
int j; if(i<1||i>L.length)
{ printf(“position error!\n”); exit(0); }
for(j=i; j<=L.length-1; j++)
需特殊处理; 空表:head==NULL; 非空表:r->next==NULL;
2.空表与非空链表处理不一致。
34
可在单链表的第一个结点之前附设一个结点,称之 为头结点,解决上述复杂性。示意图如下:
head
info
a1
a2

an ^
头指针 头结点 首元结点
空链表: head info ^
35
思考:带头结点的链表的优越性
}
29
以下为在已有链表中插入、删除结点的函数。 “C语言复习”中讲过,不详述。 不同之处:查找方式不同。 ➢ 按值查找插入删除结点的位置; ➢ 按序号查找插入删除结点的位置;
30
ListNode *del(ListNode *head, int i){
ListNode *p,*q; int j=1; p=head;
while( j<i && p!=NULL ){
q=p; p=p->next; j=j+1 ; }
if(j==i){
if(i==1) head=p->next ;
else q->next=p->next ;
(*)
printf("The No. %dth char is deleted\n",i); }
应有1≤i≤ L.length+1 L.length < ListSize
15
将新结点x插入顺序表的第i个结点L.data[i-1]的位置上
SeqList InsertList(SeqList L, int x, int i){
int j; if(i<1||i>L.length+1)
{ printf(“position error!\n”); exit(0); }
于春梅 何仕鹏 王爽 王亚武


性别
女 男 女 男 :
年龄
18 18 18 18 :
班级
2001级电信016班 2001级电信017班 2001级通信011班 2001级通信012班

数据元素都是记录; 元素间关系是线性
5
2.2 顺序表
2.2.1 顺序表的表示(*)
2.2.2 对顺序表操作的实现 2.2.3 顺序表的运算效率分析 本节小结
6
2.2.1 顺序表的表示 线性表的顺序存储结构。 把线性表的结点按逻辑次序依次存放在一组地 址连续的存储单元里。用这种方法存储的线性 表简称为顺序表。
简言之,逻辑上相邻,物理上也相邻
高级语言中实现方法: (一维)数组 V[n]
7
线性表的顺序存储结构示意图
地址
内容
元素在表中的位序
b=LOC(a1) b+L
的核心语句:
head=s;
从空表开始,若读入的字符不为‘\n’,就将 新结点s链到表头。
26
ListNode *CreateListF(){ char ch; ListNode *head,*s; head=NULL; while((ch=getchar())!='\n'){ s=(ListNode *)malloc(sizeof(ListNode)); s->data=ch; s->next=head; head=s; } return head;
数据元素
表头元素
下标:是元素的 序号,表示元素 在表中的位置
ai的直接前趋 ai的直接后继 表尾元素
n=0时称为 空表
n为元素总个 数,即表长
线性表的逻辑结构示意图
3
线性表的特点:(若非空)
(1)存在唯一一个被称作“第一个”的数据元素; (2)存在唯一一个被称作“最后一个”的数据元素; (3)除第一个元素,每个元素均只有一个前驱; (4)除最后一个元素,每个元素均只有一个后继;
解:地址计算通式为: LOC(ai) = LOC(a1) + L *(i-1)
因此:LOC( M[3] ) = 98 + 5 ×(3-0) =113
9
顺序表结构定义
(*)
用一维数组来存放表结点
#define ListSize 100 //表空间的大小,假设为100
typedef struct L{
L.data[j-1]=L.data[j];
L.length--;
return L;
}
19
2.2.3 顺序表的运算效率分析 时间效率分析:
算法时间主要耗费在移动元素的操作上
讨论1:若在长度为 n 的线性表的第 i 位前 插入一 元素则向后移动元素的次数f(n)为:
f(n) = n – i + 1
讨论2:若在长度为n的线性表上删除第i位元素, 向前移动元素的次数f(n)为:
int data[ListSize]; int length; }SeqList;
void main(){ SeqList L; L.length=0;
}
12
查找结点
顺序表L中第i个节点如何表示?
L.data[i-1]
13
数组下标 内存 元素序号
0
a1 1
1
a2 2
数组下标 内存 元素序号
0
a1 1
数据结构课程的内容
唯一的逻辑结构 对应
不唯一的存储结构
运算的实现依赖于 存储结构
1
第2章 线性表
2.1 线性表的类型定义(逻辑结构)
2.2 顺序表(*) 2.3 链 表(*)
2.4 应用举例
2
2.1 线性表的类型定义
线性表:是由n(n>=0)个数据元素(结点)a1,a2…an
组成的有限序列。
(a1, a2, … ai-1,ai, ai+1 ,…, an)
链式存储结构
见2.3节
22
2.3 线性表的链式表示和实现
2.3.1 链表的表示(*)
2.3.2 链表的实现(*)
2.3.3 链表的运算效率分析 2.3.4 应用举例
23
2.3.1 链表的表示
链式存储结构特点:逻辑上相邻的两个数据 元素,物理上不一定相邻。
用C语言描述的单链表如下:
typedef struct Lnode {
char
data;
struct Lnode *next;
}ListNode;
//数据域 //指针域
24
2.3.2 链表的实现
1. 单链表的建立和输出(*) 2. 删除单链表中结点(*) 3. 在单链表中插入结点(*)
4. 其它链表形式
25
建立单链表:(1)头插法建表
方法:
hea/d/ c
b
a^
s d 有关指针操作 s->next=head;
}
27
2.尾插法建表
head
a
b
新结点插到表尾,必须增 加尾指针r,使其始终指向 当前表尾结点;
c
// r
s
d^
核心语句: if(head==NULL)
head=s; else
r->next=s; r=s;
28
ListNode *CreateListR(){ char ch; ListNode *head,*s,*r; head=r=NULL; while((ch=getchar())!='\n'){ s=(ListNode *)malloc(sizeof(ListNode)); s->data=ch; s->next=NULL; if(head==NULL) head=s; else r->next=s; r=s; } return head;
0
a1 1
1
a2 2
V数组下标 内存 元素序号
0
a1 1
1
a2 2
i-1 ai i
i
ai+1 i+1
n-1 an n=L.length
i-1 ai+1 i i ai+2 i+1
n-2 an n-1
n-1
n
删除:删除顺序表L中第i个位置的元素 17
3)删除 删除线性表的第i个位置上的元素 实现步骤: • 将第i +1至第n 位的元素向前移动一个位置; • 表长减1。 注意:事先需要判断,删除位置i 是否合法?
if(head==NULL){ head=s ; s->next=NULL ; }
else{ while(( j<i )&&( p!=NULL )){
q=p; p=p->next; j++; }
相关文档
最新文档