数据结构课件 第二次课
合集下载
《数据结构》课件第二章
线性表的基本操作(逻辑)
➢ 构造一个空表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章线性表
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
线性表的顺序存储结构
2
线性表的顺序存储结构使用数组来存储元素,
可以快速随机访问元素。
3
线性表的常见操作
4
线性表支持常见的操作,包括插入、删除、 查找等,可以灵活地操作其中的元素。
线性表的定义和实现
线性表是一种数据结构,它包含一组有序的 元素,可以通过数组和链表来实现。
线性表的链式存储结构
线性表的链式存储结构使用链表来存储元素, 支持动态扩展和插入删除操作。
第三章 栈与队列
栈的定义和实现
栈是一种特殊的线性表,只能在一 端进行插入和删除操作,遵循后进 先出的原则。
队列的定义和实现
队列是一种特殊的线性表,只能在 一端进行插入操作,在另一端进行 删除操作,遵循先进先出的原则。
栈和队列的应用场景和操作
哈希表是一种高效的查找数据结构, 通过哈希函数将关键字映射到数组 中,实现快速查找。
排序算法包括冒泡排序、插入排序 和快速排序等,可以根据数据规模 和性能要求选择合适的算法。
结语
数据结构的学习心得 总结
学习数据结构需要掌握基本概念 和常见操作,通过实践和练习加 深理解和熟练度。
下一步学习计划的安 排
在掌握基本数据结构的基础上, 可以进一步学习高级数据结构和 算法,提升编程技能。
相关学习资源推荐
推荐一些经典的数据结构教材和 在线学习资源,如《算法导论》 和LeetCode等。
栈和队列在计算机科学中有许多应 用,如函数调用、表达式求值和作 业调度等。
第四章 树与二叉树
树的定义和性质
树是由节点和边组成的一种非线性数据结构,每个 节点可以有多个子节点。
二叉树的遍历方式
二叉树的遍历方式包括前序遍历、中序遍历和后序 遍历,可以按不同顺序输出节点的值。
数据结构课件第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 栈的顺序表示和实现
数据结构课件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
数据结构课件C++版第二章
线性结构的特点
a1
a2
a3
a4
a5
a6
存在一个唯一被称作“第一个”的数据元素; ② 存在一个唯一被称作“最后一个”的数据元素; ③ 除第一个数据元素外,其他元素均有且仅有一个 直接前驱,第一个元素没有前驱; ④ 除最后一个数据元素外,其他元素均有且仅有一 个直接后继,最后一个元素没tructure--Ch2 Linear List mayan
2013-7-14 Data Structure--Ch2 Linear List mayan
2.1 线性表(Linear List)
2.1.4线性表的存储表示
① ②
线性表的存储表示 顺序存储方式 链表存储方式
2013-7-14
Data Structure--Ch2 Linear List
mayan
2.2 顺序表(Sequential List) 2.2.1 定义及特点
定义 线性表的顺序存储方式(顺序表)指的是用一 组地址连续的存储单元依次存储线性表的数据元 素。即它利用元素在物理位置上的邻接关系来表 示表中元素间的逻辑关系。通常用数组来实现。
0 1 ...
...
下标位置 存储状态 存储位置
在表中顺序搜索与给定值 x 匹配的表项,找到 则函数返回该表项是第几个元素,否则函数返回0
2013-7-14 Data Structure--Ch2 Linear List mayan
2.2 顺序表(Sequential List) 2.2.2 类定义及其操作 --表项的插入算法
template <class T > 表项位置i 1 2 bool SeqList<T>::Insert (int i, T& x) { 值 a b last 0 if (last == maxSize-1) return false; //表满 1 i=3 if (i < 0 || i > last+1) return false; //参数i不合理 表项位置 1 for (int j = last; j >= i; j--) //依次后移2 3 值 a b c 新值 a b c data[j+1] = data[j]; 下标 0 1 2 data[i] = x; //插入(第 i 表项在data[i-1]处) last++; return true; //插入成功 }
数据结构课件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. 循环链表
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. 循环链表
1.2 数据与数据结构(二) 课件-2021-2022学年高中信息技术浙教版(2019)选修1
队列 栈 树
Data and data structure
活动二:树
一、分小组讨论,举出在生活和信息系统中用树组织数据的例子。 二、画出其他树结构编队图
队列 栈 树
Data and data structure
巩固练习
B B
队列 栈 树
Data and data structure
巩固练习
Data and data structure
常见的数据结构——队列
先进先出
队列 栈 树
Data and data structure
常见的数据结构——栈
先进后出、后进先出
队列 栈 树
弹匣的装弹过程(入栈)
栈的示例—弹匣
子弹进出弹匣的过程具有下列特点: ①整个装置只有一端开放(最上端),而 且进、出只能在这一端进行。 ②弹匣中的子弹成一纵队排列。 ③任何子弹进出弹匣的规律是“先进后出、 后进先出”,即最先装入弹匣的子弹最后 才能被弹出,而最后装入弹匣的子弹则最 先被弹出。
Data and data structure
常见的数据结构——队列
先进先出
队列 栈 树
用计算机程序处理数据时,有时也需要将数据进行“排队”,并遵循现实中排队的规律,对数 据进行“先进先出” FIFO(First In First Out)且中间不能“插队”的组织和操作,计算机科学家 由此发明了“队列”这种数据结构。
一个元素前面(或上面)只有一个元素,而后面(或下面)却有多个(0个或多个) 元素相邻
数据与数据结构(二)
Data and data structure
活动一:快递拿取
队列 栈 树
栈 2
Data and data str数据结构——树
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
A. O(n) O(
B. O(nl
下面关于线性表的叙述中,错误的是哪一个?( ) A.线性表采用顺序存储,必须占用一片连续的存储单元。 B.线性表采用顺序存储,便于进行插入和删除操作。 C.线性表采用链接存储,不必占用一片连续的存储单元。 D.线性表采用链接存储,便于插入和删除操作。 线性表是具有n 线性表是具有n个( )的有限序列(n>0)。 )的有限序列(n>0)。 A.表元素 B.字符 C.数据元素 D.数据项 E.信息项 若某线性表最常用的操作是存取任一指定序号的元素和在 最后进行插入和删除运算,则利用( )存储方式最节省 时间。 A.顺序表 B.双链表 C.带头结点的双循环链表 D.单循环链表
完成在双循环链表结点p之后插入s 完成在双循环链表结点p之后插入s的操作是 ( ) A. p->next=s ; s->priou=p; sp->next->priou:=s ; s->next:=p->next; >nexts->next:=pB. p->next->priou=s; p->next=s; >nextps->priou=p; s->next=p->next; s->next=pC. s->priou=p; s->next=p->next; s->next=pp->next=s; p->next->priou=s ; p->nextD. s->priou=p; s->next=p->next; s->next=pp->next->priou=s ; p->next:=s; >nextp-
假设有两个按元素值非递减次序排列的线 性表La与Lb,均以单链表形式存储。请编 性表La与Lb,均以单链表形式存储。请编 写算法将这两个单链表归并为一个按元素 值非递减次序排列的单链表,并要求利用 原来两个单链表的结点存放归并后的单链 表。
Void MergeList_L(LinkList &La,LinkList &Lb,LinkList &Lc){ pa=Lapa=La->next; pb=Lb->next; pb=LbLc=pc=La; while (pa&&pb) { if (pa->data<=pb->data){ (pa->data<=pbpc->next=pa; pc=pa; pa=pa->next; pcpa=pa} else {pc->next=pb; pc=pb; pb=pb->next;} {pcpb=pb} pc->next=pa?pa:pb; pcfree(Lb); }
对于顺序存储的线性表,访问结点和增加、 删除结点的时间复杂度为( )。 A.O(n) O(n) B. O(n) O(1) C. O(1) O(n) D. O(1) O(1)
非空的循环单链表head的尾结点p 非空的循环单链表head的尾结点p满足( A.p->link=head B. p-> link=NULL B. C.p=NULL D. D.p= head )。
线性表有两种存储结构:一是顺序表,二是链表。 试问: (1)如果有 n个线性表同时并存,并且在处理过程 中各表的长度会动态变化,线性表的总数也会自 动地改变。在此情况下,应选用哪种存储结构? 为什么? (2)若线性表的总数基本稳定,且很少进行插入和 删除,但要求以最快的速度存取线性表中的元素, 那么应采用哪种存储结构?为什么?
下面是一算法的核心部分,试说明该算法的功能。 pre=Lpre=L->next; {L是一单链表,结点有数据域 data和指针域 next} {L是一单链表,结点有数据域 data和指针域 IF (pre!=NULL) THEN WHILE (pre->next!=NULL) { (prep=prep=pre->next; IF (p->data>=pre->data) THEN pre=p (p->data>=preELSE return(false); } return(true);
else∥ 下面处理L2长度小于等于L1的情况 else∥ 下面处理L2长度小于等于L1的情况 {if(n==0)return(L1);∥L2为空表。 if(n==0)return(L1);∥L2为空表。 else{p=L2; else{p=L2; while(pwhile(p->next!=L2) p=p->next;∥查最后元素结点 p=p->next;∥ p->next=L1->next;∥将L2的元素结点插入到L1 >next=L1->next;∥ L2的元素结点插入到L1 循环单链表的第一元素结点前。 L1->next=L2->next; L1->next=L2free(L2);∥ free(L2);∥释放无用头结点。 } }∥算法结束。
在单链表指针为p的结点之后插入指针为s 在单链表指针为p的结点之后插入指针为s的结点, 正确的操作是:( )。 A.p->next=s; s->next=p->next; s->next=pB. s->next=p->next; p->next=s; >next=ppC.p->next=s; p->next=s->next; p->next=sD. p->next=s->next; p->next=s; >next=sp对于一个头指针为head的带头结点的单链表,判 对于一个头指针为head的带头结点的单链表,判 定该表为空表的条件是( ) A.head==NULL B.head→next==NULL B. C.head→next==head D.head!=NULL D.
在下面的程序段中,对x 在下面的程序段中,对x的赋值语句的频度为(
FOR i:=1 TO n DO FOR j:=1 TO n DO x:=x+1; A. O(2n) B.O(n) C.O(n2) B. C.
)
D. D.O(log2n)
程序段 FOR i:=n-1 DOWNTO 1 DO i:=nFOR j:=1 TO i DO IF A[j]>A[j+1] THEN A[j]与A[j+1]对换; A[j]与A[j+1]对换; 其中 n为正整数,则最后一行的语句频度在最坏情况下是 ( )
已知L1、L2分别为两循环单链表的头结点 已知L1、L2分别为两循环单链表的头结点 指针,m,n分别为L1、L2表中数据结点个数。 指针,m,n分别为L1、L2表中数据结点个数。 要求设计一算法,用最快速度将两表合并 成一个带头结点的循环单链表。
LinkedList Union(LinkedList L1,L2;int m,n) L1,L2;int ∥L1和L2分别是两循环单链表的头结点的指针,m和n分别 L1和L2分别是两循环单链表的头结点的指针,m 是L1和L2的长度。 L1和L2的长度。 ∥本算法用最快速度将L1和L2合并成一个循环单链表。 本算法用最快速度将L1和L2合并成一个循环单链表。 {if(m<0||n<0) {printf(“表长输入错误\n”);exit(0);} if(m<0||n<0) {printf(“表长输入错误\ if(m<n) if(m<n) ∥若m<n,则查L1循环单链表的最后一个结 m<n,则查L1循环单链表的最后一个结 点。 {if(m==0)return(L2);∥L1为空表。 if(m==0)return(L2);∥L1为空表。 else{p=L1; else{p=L1; while(pwhile(p->next!=L1) p=p->next;∥查最后一个元素结点。 p=p->next;∥ p->next=L2->next;∥将L1循环单链表的元素结点插入到 >next=L2->next;∥ L1循环单链表的元素结点插入到 L2的第一元素结点前。 L2的第一元素结点前。 L2->next=L1->next; L2->next=L1free(L1);∥ free(L1);∥释放无用头结点。 } }∥处理完m<n情况 处理完m<n情况
链表不具有的特点是( )
A.插入、删除不需要移动元素 B.可随机访问任一元素 C.不必事先估计存储空间 D.所需空间与线性长度成正比 若长度为n的线性表采用顺序存储结构,在其第i 若长度为n的线性表采用顺序存储结构,在其第i 个位置插入一个新元素的算法的时间复杂度为 ( )(1<=i<=n+1)。 (1<=i<=n+1)。 A. O(0) B. O(1) C. O(n) D. O(n2)