数据结构课件第2章

合集下载

《数据结构》课件第二章

《数据结构》课件第二章

线性表的基本操作(逻辑)
➢ 构造一个空表L ➢ 获取L的长度(即元素个数) ➢ 访问L中第i个数据元素的值 ➢ 访问L中第i个数据元素的前驱/后继的值 ➢ 在L中第i个元素之前插入新的元素e ➢ 删除L的第i个数据元素
➢ 注意在插入或者删除之后,线性表的长度应 能随之改变
一 顺序存储
➢ 线性表的顺序表示:用一组地址连续的存储单 元依次存储线性表的数据元素。

将Temp_b插入到 LC的第k个位置上
Temp_a ≤ Temp_b
是 将Temp_a插入到 LC的第k个位置上
否 i ≤ LA.len 否
j← j + 1
i← i + 1
j ≤ LB.len
Temp_a = Temp_b



j← j + 1
k← k + 1
结束

将LA表的第i个元 素插入到LC表的
插入操作的时间复杂度 O(n/2) 链表中的插入、删除操作没有上溢的情况, 并且节省内存资源
思考:若现已知道指向某元素节点的指针 p,希望能在该节点之前插入元素x,该如 何操作?其算法时间复杂度是多少?
3) 单链表的删除
p
删除第i个元素,由e返回值 删除b
a
Hale Waihona Puke bc … 1) 寻找第i-1个结点
2) 保留结点b的地址
9 SHI 5
0
1
1 ZHAO 2
2 QIAN 3
3 SUN 4
4 LI
9
5 ZHOU 6
6 WU 8
7 ZHENG 8
8 WANG 0
9 SHI 5
i=s[i].cur 指针后移

数据结构(严蔚敏)课件 第2章 线性表C(链表的操作)

数据结构(严蔚敏)课件 第2章 线性表C(链表的操作)
//插入非空表的剩余段 //释放Lb的头结点 ?:是条件运算符(为真则取第1项,见P10条件赋值)
22
注:Lc用的是La的头指针

考:
1、不用Lc,直接把La表插到Lb表中;或者 把Lb表插到La表中,怎么修改?
2、重复的数据元素不需要插入,怎么修改?
23
一个带头结点的线性链表类型定义如下 (用类C语言,见P37):
29
续例2:一元多项式的计算 (参见教材P39 – 43) 后续内容
12
(2) 单链表的修改(或读取)
(3) 单链表的插入(P29)
在链表中插入一个元素X 的示意图如下: p a p
b
插 入 X
a
b
p->next
s
X
s->next
链表插入的核心语句: Step 1:s->next=p->next; Step 2:p->next=s ; 思考:Step1和2能互换么?
//链表中元素个数(长度)
表结构
前面的归并算法可改写为P39算法2.21
24
例2:一元多项式的计算 (参见教材P39 – 43) 讨论:
1. 一元多项式的数学通式? 2. 用抽象数据类型如何描述它的定义?
3. 用C语言如何描述它的定义?
4. 如何编程实现两个一元多项式相加?
25
1. 一元多项式的数学通式?
新手特别容易忘记!!
8
void display()
/*字母链表的输出*/
{p=head; sum=0; while (p) //当指针不空时循环(仅限于无头结点的情况) {printf("%c",p->data); p=p->next; //让指针不断“顺藤摸瓜” } sum++; }

数据结构课件第2章线性表

数据结构课件第2章线性表

27
线性表的顺序存储结构适用于数据 元素不经常变动或只需在顺序存取设备 上做成批处理的场合。为了克服线性表 顺序存储结构的缺点,可采用线性表的 链式存储结构。
28
2.3 线性表的链式存储结构
线性表的链式存储表示 基本操作在单链表上的实现 循环链表 双向链表 线性表链式存储结构小结
2.3.1 线性表的链式存储表示 29
2.1.1 线性表的定义
6
一个线性表(linear_list)是 n(n≥0)个具有相同属性的数 据元素的有限序列,其中各元素有着依次相邻的逻辑关系。
线性表中数据元素的个数 n 称为线性表的长度。当 n = 0 时 该线性表称为空表。当 n > 0 时该线性表可以记为:
(a1,a2,a3,…,ai,…,an)
数据域 指针域
结点 data next
31
(2) 线性表的单链表存储结构
通过每个结点的指针域将线性表中 n 个结点按其逻辑顺序链 接在一起的结点序列称为链表,即为线性表 ( a1, a2, a3, …, ai, …, an ) 的链式存储结构。如果线性链表中的每个结点只有一个指针域, 则链表又称为线性链表或单链表 (linked list)。
17
(2) 算法编写
#define OK 1
#define ERROR 0
Int InsList ( SeqList *L, int i, ElemType e ) /*在顺序线性表 L 中第 i 个位置插入新的元素 e。*/ /* i 的合法值为 1≤i ≤L->last+2*/ {
int k; if ( i < 1) ||( i > L->last+2)) /*首先判断插入位置是否合法*/ { printf(“插入位置i值不合法”);

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

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

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初始化单链表 Void InitList(LinkList *head) {/* 初始化单链表 */ head=(LinkList)malloc(Sizeof(ListNode)) /*申请头结点空间,并使头指针head指向头结点 */ head->next=NULL; /* 置链尾标记NULL */ }
2.4线性表的链式存储结构

链式存储结构用一组任意的存储单元依次存储 线性表里元素,这组存储单元可以是连续的, 也可以是不连续的,甚至是零散分布在内存的 任何位置上。

为反映出各元素在线性表中的逻辑关系,对每 个数据元素来说,除了存储其本身的信息之外 ,还需存储一个指示其直接后继的信息(即直 接后继的存储位置)。这两部分信息组成一个 数据元素的存储映象,称为结点(Node)。

例如,图2-4-2所示为线性表(dog,pig,cat,fox,hen,bat ,bee,bird)的单链表存储结构,整个链表的存取需从头指针开始 进行,依次顺着每个结点的指针域next找到线性表的各个元素,直 至next域为空为止。

通常我们用箭头表示链域中的指针:
typedef struct Node {ElemType data; /*数据域*/ struct Node *next; /*指针域*/ }ListNode,*LinkList;
2.3.1 线性表的顺序存储

线性表的顺序存储是指用一组地址连续的存储单元依 次存储线性表中的各个元素,使得线性表中在逻辑结 构上相邻的数据元素存储在相邻的存储单元中 。

假设线性表中有n个数据元素,每个数据元素占K个 存储单元,第一个元素a1的存储地址用LOC(a1)表示 ,第i个数据元素ai的地址用LOC(ai)表示,则: 第i个数据元素的地址为: LOC(ai)=LOC(a1)+(i-1)×K (1≤i≤n)

数据结构课件CHAPTER2

数据结构课件CHAPTER2

a1
a2
a3
a4
a5
a6
直接前驱和直接后继描述了结点之间的逻辑关系 (即邻接关系)
Department of Computer Science & Technology, Nanjing university fall
线性表的抽象基类 template <class T, class E> class LinearList { public: LinearList(); //构造函数 //析构函数 〜~LinearList(); virtual int Size() const = 0; //求表最大大体积 virtual int Length() const = 0; //求表⻓长度 virtual int Search(T x) const = 0; //搜索 virtual int Locate(int i) const = 0; //定位 virtual E* getData(int i) const = 0; //取值 virtual void setData(int i, E x) = 0; //赋值
Nanjing university
fall
删除的主要思想: (1) 在顺序表中查找x,如果x在表中不存在,则 不能删除;
Data Structures
(2)如果x在表中存在,设x在顺序表中的位置 为i; (3) 将顺序表的最后位置减1; (4)把顺序表中原来第i+1至第n-1个表项依次向 前移动一个表项位置
Department of Computer Science & Technology, Nanjing university fall
Data Structures

数据结构课件第2章线性表A

数据结构课件第2章线性表A
22
2.2 线性表的顺序表示和实现
2.2.1 顺序表的表示 2.2.2 顺序表的实现 2.2.3 顺序表的运算效率分析 本节小结 作 业
23
2.2.1 顺序表的表示
线性表的顺序表示又称为顺序存储结构 顺序映像。 顺序存储结构或 线性表的顺序表示又称为顺序存储结构或顺序映像。 顺序存储定义: 顺序存储定义: 把逻辑上相邻的数据元素存储在物 理上相邻的存储单元中的存储结构。 理上相邻的存储单元中的存储结构。 简言之,逻辑上相邻, 简言之,逻辑上相邻,物理上也相邻 顺序存储方法: 顺序存储方法: 用一组地址连续 地址连续的存储单元依次 用一组 地址连续 的存储单元依次 存储线性表的元素,可通过数组V[n]来实现 数组V[n]来实现。 存储线性表的元素,可通过数组V[n]来实现。
9
形式化定义: 形式化定义: Linearlist = (D, R) 其中: 其中:
D = {ai | ai ∈ D0 , i = 0,1,L , n − 1, n > 0} R = {< ai −1 , ai >| ai −1 , ai ∈ D0 , i = 1,2, L , n − 1}
D0为某个数据对象的集合 N为线性表长度 为线性表长度
数据元素都是记录; 数据元素都是记录
元素间关系是线性
13
同一线性表中的元素必定具有相同特性
例3、学生健康情况登记表如下: 姓 名 王小林 陈 红 刘建平 张立立 …….. 学 号 790631 790632 790633 790634 …….. 性 别 年龄 男 女 男 男 ……. 18 20 21 17 ……. 健康情况 健康 一般 健康 神经衰弱 …….
10
线性表的主要操作
初始化 求长度 取元行如下基本运算: 对线性表可进行如下基本运算:

数据结构课件ppt第二章

数据结构课件ppt第二章
答:由于顺序存储结构一旦确定了起始位置, 线性表中的任何一个元素都可以进行随机存 取,即存取速度较高;并且,由于线性表的 总数基本稳定,且很少进行插入和删除,故 这一特点恰好避开了顺序存储结构的缺点。 因此,应选用顺序存储结构。
3. 在单链表和双向链表中,能否从当前结点 出发访问到任一结点?
• 答:在单链表中只能由当前结点访问其后 继的任一结点,但因其没有指向前驱的指 针而无法访问其前驱结点。在双向链表中, 由于当前结点既有指向后继的指针,又有 指向前驱的指针,所以在双向链表中可以 由当前结点出发访问表中的任何一个结点。
data 0
1
a2
2
a1
3
4
a3
cursor 2 4 1
0
data 0
1
a2
2
a1
3
a4
4
a3
cursor 2 3 1
4 0




maxsize-1
maxsize-1
静态链表的C语言描述
//线性表的静态链表存储结构 # define MAXSIZE 100 //链表的最大长度 typedef struct {
D. 循环链表
答案:C,D
A,C,D
写出带头结点的双向循环链表L为空表的 条件:
空表 L
答案:(L==L->next)&&(L==L->prior)
判断题
1. 在具有头结点的链式存储结构中,头指针 指向链表中的数据结点。( )
2. 顺序存储的线性表可以随机存取。( ) 3. 在单链表中,要访问某个结点,只要知道
} DuLNode, *DuLinkList;
2. 循环链表

精品课件-数据结构(刘肖)-第2章

精品课件-数据结构(刘肖)-第2章
的位序(或其存储位置),若这样的元素不存在,则返回零值 (或NULL)。
第2章 线 性 表 (5) 求前趋:若x是线性表中的非第一个数据元素,则返
回x的直接前趋,否则返回空元素。 (6) 求后继:若x是线性表中的非最后一个数据元素,则
返回x的直接后继,否则返回空元素。 (7) 插入:在线性表的第i个数据元素之前插入新的数据
的有限序列。通常将线性表记作: (a1,a2,…,ai,…,an)
第2章 线 性 表 其中,数据元素的个数n称为线性表的长度,当n=0时称
为空表。数据元素ai(1≤i≤n)是一个抽象的符号,在不同情 况下有不同的含义。例如,由26个英文字母构成的线性表 (a,b,c,d,…,x,y,z),每个数据元素就是一个英文字 母。又如某工厂近十年的产值 (万元)(100,125.6,130, 135,136.5,140,142,151,155,158)构成的线性表,其 每个数据元素为一正数。
(1) 存在唯一的被称做“第一个”的数据元素a1; (2) 存在唯一的被称做“最后一个”的数据元素an; (3) 除第一个元素之外,每个数据元素ai有且仅有一个 直接前趋ai-1(1<i≤n); (4) 除最后一个元素之外,每个数据元素ai有且仅有一 个直接后继ai+1 (1≤i<n)。 由于线性表数据元素之间存在这种相邻的线性关系,因此 线性表是一种线性结构。
第2章 线 性 表
2.1.2 线性表的基本运算 对于线性表,常见的基本运算有: (1) 初始化:构造一个空的线性表。 (2) 求表长:返回线性表中数据元素的个数,即线性表
的长度。 (3) 取元素:返回线性表中第i个数据元素的值(或其存
储位置)。 (4) 查找:返回线性表中第一个其值与x相等的数据元素

数据结构课件第2章

数据结构课件第2章

SqStack S; ElemType e;
InitStack_Sq(S, 10, 5); // 栈S的初始容量为10
while(N!=0) {
Push_Sq(S, N%8); // 将N除以8的余数入栈
N /= 8;
// N取值为其除以8的商
}
while(FALSE==StackEmpty_Sq(S)) {
括号匹配
int i = 0; ElemType e; SqStack S; InitStack_Sq(S, n, 5);
Status Matching(char *exp, int n)
while(i<n) { switch(exp[i]) {
当读入完所有括号时,检查栈:
case '(': case '[': Push_Sq(S, exp[i]); i++;
本章主要内容
2.1 典型线性数据结构 2.2 顺序栈 2.3 循环队列 2.4 顺序表 2.5 链栈与链队列 2.6 线性表的链式表示与实现 2.7 线性表两种存储结构的比较
2.1典型的线性结构
栈(stack):只允许在序列末端进行操作的线性结 构;
队列(queue): 只允许在序列两端进行操作的线 性结构;
样式: 数据 指针
或 指针 数据 指针
数据域:存储元素数 值数据
指针域:存储直接后继或者直接前 驱的存储位置
1.7.3节的链表存储结构
链式存储
线性结构的链式存储表示
a1
a2

an ∧
栈、队列和线性表的链式存储表示
链栈 链队列 单链表、双向链表、循环链表、双向循环链表
2.2 栈的顺序表示和实现
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
30 75 42 56 87
0
L.length-1
21 18 30 75 56 87
图2.7 ListDelete_Sq(L, 5, e)的操作示意图
2.2 线性表的顺序表示和实现
2.2.3 线性表基本操作的实现
(4) ListDelete(&L, i, &e) ● 考虑移动元素的平均情况: 假设删除第 i 个元素的概率为 qi, 则在长度为n 的线性表中删除一个元素所需移动元素次数的期 n 望值为:
(4) ListDelete(&L, i, &e)
2.2 线性表的顺序表示和实现
2.2.3 线性表基本操作的实现
(4) ListDelete(&L, i, &e) ● 示例:ListDelete_Sq(L, 5, e)
p = &(L.elem[i-1]); q = L.elem+L.length-1; for (++p; p <= q; ++p) *(p-1) = *p;
2.2 线性表的顺序表示和实现
2.2.3 线性表基本操作的实现
(3) ListInsert(&L,i,e)
Status ListInsert_Sq(SqList &L, int i, ElemType e) { // 在顺序表L的第 i 个元素之前插入新的元素e, // i 的合法范围为 1≤i≤L.length+1 …… q = &(L.elem[i-1]); // q 指示插入位置 for (p = &(L.elem[L.length-1]); p >= q; --p) *(p+1) = *p; // 插入位置及之后的元素右移 *q = e; // 插入e ++ L.length; // 表长增1 return OK; } // ListInsert_Sq
2.2 线性表的顺序表示和实现
2.2.1 线性表的顺序存储结构
线性表的顺序存储是指用一组地址连续的存储单元依次存储线性
表中的各个元素,使得线性表中在逻辑结构上相邻的数据元素存储在相邻 的物理存储单元中,即通过数据元素物理存储的相邻关系来反映数据元素 之间逻辑上的相邻关系。 采用顺序存储结构的线性表通常称为顺序表。 假设线性表中有n个元素,每个元素占k个单元,第一个元素的地址为 loc(a1),则可以通过如下公式计算出第i个元素的地址loc(a -i):
Edl qi ( n i )
i 1
若假定在线性表中任何一个位置上进行删除的概率都是相等的, 则移动元素的期望值为:
1n n 1 Edl ( n i ) n i 1 2
2.3 线性表的链式表示和实现
2.3.1 单链表
(1) 单链表的逻辑结构
单链表包括两个域:数据域用来存储结点的值;指针域
链表存储结构,整个链表的存取需从头指针开始进行,依次顺 着每个结点的指针域找到线性表的各个元素。
2.3 线性表的链式表示和实现
2.3.1 单链表
(1) 单链表的逻辑结构
图2.9 单链表的示例图
2.3 线性表的链式表示和实现
2.3.1 单链表
(1) 单链表的逻辑结构
H A B C D E F G H
21
0
18
30
75
42
56
87
L.length-1
21 18
30
75
66
42
56
87
图2.5 ListInsert_Sq(L, 5, 66)的操作示意图
2.2
2.2.3
线性表的顺序表示和实现
线性表基本操作的实现
(3) ListInsert(&L,i,e) ● 考虑移动元素的平均情况: 假设在第 i 个元素之前插入的概率为qi , 则在长度为n 的线性表中插入一个元素所需移动元素次数的期 n 1 望值为: E p ( n i 1)
// 顺序表
80 10
// 线性表存储空间的初始分配量 // 线性表存储空间的分配增量
// 存储空间基址 // 当前长度 // 当前分配的存储容量 // (以sizeof(ElemType)为单位)
2.2 线性表的顺序表示和实现
2.2.3 线性表基本操作的实现
(1) InitList_Sq(&L) Status InitList_Sq( SqList& L) { // 构造一个最大容量为 maxsize 的顺序表
(2) LocateElem_Sq(L,e,compare())
2.2 线性表的顺序表示和实现
2.2.3 线性表基本操作的实现
(3) ListInsert(&L,i,e)
a1 a2 …
ai-1 ai

an
a1 a2 … ai-1 e
ai
… an
表的长度增加
图2.4 基本操作ListInsert(&L,i,e)的示意图
第2章
线性表
返回总目录

2.1 2.2
2.3 2.4

线性表的类型定义 线性表的顺序表示和实现
线性表的链式表示和实现 一元多项式的表示及相加 返回总目录
●基本要求: 1)了解线性表的概念、逻辑结构、存储结构; 2)掌握线性表的顺序表示和实现; 3)掌握线性表的链式表示和实现; 4)掌握一元多项式的表示及相加; ●学习重点: 1)线性表的链式表示和实现; 2)一元多项式的表示及相加;
图2.10 单链表的逻辑状态
H (a) 带头结点的空单链表
H
a1
a2

an
(b) 带头结点的单链表
图2.11 带头结点的单链表图示
2.3 线性表的链式表示和实现
2.3.1 单链表
(2) 单链表的存储结构描述
单链表的存储结构描述如下:
指针域中的,而第一个结点无前趋,因而应设一个头指针H指 向第一个结点。同时,由于表中最后一个结点没有直接后继, 则指定线性表中最后一个结点的指针域为“空”(NULL)。 这样对于整个链表的存取必须从头指针开始。 (1) 单链表的逻辑结构
例如:图2.9所示为线性表(A, B, C, D, E, F, G, H)的单
返回目录
2.1 线性表的类型定义
2.1.1 线性表的逻辑结构
示例:1)简单的线性表:如英文字母表(A, B, …, Z)。 2)较复杂的线性表:如车辆登记表(见表2.1)。
表2.1 车辆登记表
2.1 线性表的类型定义
2.1.2 线性表的ADT定义
ADT List { 数据对象:D={ ai | ai ∈ElemSet, i=1,2,...,n, n≥0 } 数据关系:R1={ <ai-1 ,ai >|ai-1 ,ai∈D, i=2,...,n } 基本操作: InitList(&L); //构造一个空的线性表 DestroyList( &L ); //销毁线性表L ClearList( &L ); //将L重置为空表 ListEmpty( L ); //判断L是否为空表,是则返回TRUE GetElem( L, i , &e ); //用e返回L中数据元素个数 LocateElem(L,e,compare());//定位首次与e满足compare关系的元素 ListInsert( &L, i , e ); //在L中第i个位置之前插入元素e ListDelete( &L, i , &e ); //删除L的第i个元素,并用e返回 } ADT List
2.2 线性表的顺序表示和实现
2.2.3 线性表基本操作的实现
(3) ListInsert(&L,i,e) ● 示例:ListInsert_Sq(L, 5, 66)
q = &(L.elem[i-1]); // q 指示插入位置 for (p = &(L.elem[L.length-1]); p >= q; --p) *(p+1) = *p; p q p p p
用来存储数据元素的直接后继的地址(或位置)。链表正是通
过每个结点的指针域将线性表的n个结点按其逻辑顺序链接在 一起。由于链表的每个结点只有一个指针域,故将这种链表又 称为单链表。
数据域 指针域
data
next
图2.8 单链表的结点结构
返回目录
2.3 线性表的链式表示和实现
2.3.1 单链表
由于单链表中每个结点的存储地址是存放在其前趋结点的
loc(ai) =loc(a1)+(i-1)×k
其中loc(a -1)称为基地址。
返回目录
2.2 线性表的顺序表示和实现
2.2.1 线性表的顺序存储结构
存储地址 loc(a 1 ) loc(a 1)+k … 内存空间状态 a1 a2 … 逻辑地址 1 2 … i …
loc(a 1)+(i-1)k …
2.2 线性表的顺序表示和实现
2.2.3 线性表基本操作的实现
(2) LocateElem_Sq(L,e,compare())
L.elem
L.listsize
23 75 41 38 54 62 17 p p p p p
L.length = 7
p
i 1 8 4 3 2
e = 38 50
图2.3 基本操作LocateElem_Sq()的动态示意图
2.1 线性表的类型定义
2.1.1 线性表的逻辑结构
图2.1
线性表的逻辑结构
线性表 是n个数据元素的有限序列。
线性表的逻辑结构特点: 1)集合中必存在唯一的一个“第一元 素”; 2)集合中必存在唯一的一个 “最后元素” 3)除最后元素在外,均有 唯一的后继; 4)除第一元素之外,均有 唯一的前驱。
相关文档
最新文档