浙教版高中信息技术选修1——链表的概念、特性、基本操作 教学PPT
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
测试结果
课堂小结
选择性必修1《数据与数据结构》
第二章 数组与链表
2.2.1链表的概念、特性、基本操作
情境导入——排队与插队
数组的缺点:
• 插入和删除元素操作需要 移动大量的元素
• 频繁增、删数据导致数据 规模不稳,形成存储空间 “碎片”
• 需要限定最大空间,造成 资源浪费
链表基本概念
整队前的位置和链接关系
链表基本概念: 链表指的是将需要处理的数据对象以结点的 形式,通过指针串联在一起的一种数据结构。 链表结点结构
Item=[ ] Head=-1 其中head值为–1,表示头指针指向为空,该链表为空链表。
链表的基本操作——链表结点的插入与删除
New data next
head data1 nneext
data2 next
data3 -1
在单向链表data1和data2所处结点的中间位置插入一个新结点
1. 在单向链表中插入新结点时,指针指向的修改是否必须有先后?如果将其顺序逆转,能否完成 新结点的插入?为什么?
head
New data next
data1 next
data2 next
data3 -1
链表的基本操作——链表结点的插入与删除
描述未删除列表前链表结点的链接关系:
data:
2
实现语句:
data[8][1]=data[1][1] data[1][1]=8
参考上图,描述出在有8个结点的单向链表中删除第一个结点、中间 结点及尾结点的过程。
tmp=data_a[i-1][0]-randint(1,5) data_a.append(_[t_m_p_,_d_a_ta__a_[_i-_1_][_1_]]_) _d_a_ta___a_[_i-_1_][_1_]=_i________ print(" 链表结构的原始数据序列一 ") print(data_a)
print(" 链表结构的合并后数据序列 ") print(data_a) print(" 按链表链接顺序输出数据序列 ") tmp=head_a while data_a[tmp][1]!=-1:
print(data_a[tmp][0],end=" ") tmp=data_a[tmp][1] print(data_a[tmp][0])
测试结果
链表的基本操作——数据合并程序实现
程序
while k_b!=-1: data_a.append(_[_d_a_ta__b_[_k___b_]_[0_]_,-1]) data_a[q_a][1]=_le_n_(_d_a_t_a__a_)-_1 q_a=_d__a_ta___a_[_q___a_][_1_]__ k_b=data_b[k_b][1]
保存数据元素 保存相邻结点的存储地址 头指针(head)作用: 一是链表的入口,只有通过头指针才能进入链表 二是为循环链表设立一个边界,便于数据处理时 的边界判断和处理
链表基本概念
链表的基本概念
根据每个结点中指针的数量分为:
单向链表:
双向链表:
循环链表:
第一个结点和最后一个结点使用指针链接, 这样就形成了循环链表。
在指定节点后插入新数据 list
两
一
个
个
一
二
维
维
列
列
表 放
next[s] = next[p] list[s][1] =list[p][1]
表 放
数 据
next[p] =s
list[p][1]=s
数 据
和
和
地
地
址
址
删除结点
s
p
q
两
一
个
个
一
二
维
维
列
列
表
表
放
next[s] = next[p]
list[s][1] =list[p][1]
黄刚
王林 李丰
吴坚
• 根据指针数量分为:单向链表、循环链表
链表基本概念
单向链表中各个结点在内存中可以随意存 储,每个结点使用指针指向其后继结点的存储 地址。进入链表只能通过头指针head,其他结 点则需要经过所有在它之前的结点才可以访问, 尾结点的指针指向为null,表示指向为空。
链表的特性
测试结果 ([tmp,data_a[i-1][1]]
链表的基本操作——数据合并程序实现
程序
tmp=randint(95,100) data_b.append([tmp,head_b]) head_b=0 for i in range(1,3):
tmp=data_b[i-1][0]-randint(1,5) d_a_t_a__b_.a_p_p_e_n_d_(_[t_m_p_,_d_a_ta___b_[_i-_1_][1]]) _d_a_ta___b_[_i-_1_][_1_]=_i_____________ print(" 链表结构的原始数据序列二 ") print(data_b)
链表的基本操作——数据合并
q_a
k_a
data_a:
19
16
12
8
head_a k_b
data_b:
20
15
14
3
head_b
5^ 2^
链表的基本操作——数据合并程序实现
程序
from random import randint data_a=[] head_a=-1 data_b=[] head_b=-1 tmp=randint(95,100) data_a.append([tmp,head_a]) head_a=0 for i in range(1,4):
#初始化列表索引
k_来自百度文库=head_a q_a=head_a k_b=head_b
测试结果
链表的基本操作——数据合并程序实现
程序
while(k_a!=-1 and k_b!=-1): if data_a[k_a][0]>=data_b[k_b][0]: _q___a_=_k___a______ _k__a_=_d_a_ta___a_[_k_a_][1] else: if k_a==head_a: # 在链表 data_a 的头部插入结点 data_a.append([data_b[k_b][0],head_a]) head_a=_le_n_(_d_a_t_a__a_)-_1_ q_a=__h_e_a_d___a____ k_b=_d_a_t_a___b_[_k__b_][1] else: data_a.append_(_[d_a_t_a___b_[_k___b_][_0],k_a]) data_a[q_a][1]=_l_e_n_(_d_a_ta___a_)_-_1____ q_a=_d_a_t_a___a_[q__a_]_[_1] k_b= data_b[k_b][1]
放
数
数
据
据
和
和
地
地
址
址
链表的基本操作——数据合并
(1)算法设计 ①初始化两个空链表data_a和data_b,并使用head_a和head_b作为两个链表的头指针,其中 data_a作为存储结果的链表。 ②使用随机函数randint(start,end)模拟生成两个降序序列数据,生成新的结点在尾部插入。
(1)同一链表中每个结点的结构均相同
数据类型相同 指针数量和功能相同 (2)每个链表必定有一个头指针,以实现对链表的引用和边界处理
head
(3)链表占用的空间不固定
链表的基本操作——链表的创建
创建链表时,首先要根据问题特点规划结点的数据域和指针域,然后根据规划创建一个空表和 头结点。接下来就可以根据输入的实际数据形成结点并逐步插入到已有的链表中。