基本数据结构1
…
∧
a2
ai-1
ai
ai+1
an-1 an
带头结点的单向链表
单链表中插入元素
将元素ai所在结点的地址赋给元素e结点的指针域: S->next = P->next;
修改元素ai-1所在结点指针域的值: P->next = S;
P
…
ai-1 ②
ai ①
S e
…
ai+1
单链表中删除元素ai
修改元素ai-1所在结点指针域的值: P->next = P->next ->next;
head ∧
a1
… … a2
ai
an-1
an
∧
(a) 双向链表
a1
a2
…
an-1
an
(b) 循环单链表
tail
单链表的插入和删除
链式存储:任意存储单元存储元素 链表结点包括数据域和指针域 插入或删除一个元素,只需修改结点指针域 访问任一元素必须从链表头指针开始
head
a1 头结点
…
Any command in which a =
b or in which a and b are in
the same stack of blocks is
an illegal command. All 6 illegal commands should be
7 ignored and should have no
0123456789
0123456789
Initial Block World
格子 编号
处理过程(续):
10 move 9 onto 1 move 8 over 1 move 7 over 1 move 6 over 1 pile 8 over 6 pile 8 over 5 move 2 over 1 move 4 over 9 quit
9 012345678 0123456789
处理过程(续) :
10 move 9 onto 1 move 8 over 1 move 7 over 1 move 6 over 1 pile 8 over 6 pile 8 over 5 move 2 over 1 move 4 over 9 quit
6
7
9
8
012345
0123456789
处理过程(续) :
10 move 9 onto 1 move 8 over 1 move 7 over 1 move 6 over 1 pile 8 over 6 pile 8 over 5 move 2 over 1 move 4 over 9 quit
6
集合
线性结构
❖ 线性表: 由n个元素组成的有限序列。每个元素 有确定的前驱和后继。
元素之间的关系仅限于前趋、后继关系
➢表、栈、队列、串
元素的存储方式
➢数组 ➢链表
线性结构
由n个元素组成的有限序列。每个元素有确定的 前驱和后继。
表头元素 (a1,a2,…,ai,…,an) 表尾元素
a1
an
ai+1
链表结点
链式存储:任意存储单元存储元素 链表结点包括数据域和指针域 插入或删除一个元素,只需修改结点指针域 访问任一元素必须从链表头指针开始
指针next 数据data
struct Node { ElemType data; //数据元素 struct Node *next; //指向后继结点的指针
例2:The Blocks Problem
编号为0~n-1的n个木块,放在编号为0~n-1的n个格子 里, 可对它们进行四种有效的操作。
0 1 2 3 4 ... n-1
Initial Block World
❖ move a onto b :先将a和b上的其他木块移回到它们的初始
位置,然后将木块a摞在木块b上.
0123456789
输入数据样本
input: 10 move 9 onto 1 move 8 over 1 move 7 over 1 move 6 over 1 pile 8 over 6 pile 8 over 5 move 2 over 1 move 4 over 9 quit
output:
例如:由n个元素构成的一维数组a 由下标确定数组元素a[i]: Loc(ai)=Loc(a1)+(i-1)*d (1≤i≤n)
a1
d
a2
...
ai ai+1
...
an
... ... ...
链表
链式存储:任意存储单元存储元素 链表结点包括数据域和指针域 插入或删除一个元素,只需修改结点指针域a2 访问任一元素必须从链表头指针开始 ai
ACM/ICPC程序设计
基本数据结构 及其在程序设计中的应用
程序=数据结构+算法
数据结构(Data Structure)是数据的计算机表示 和相应的一组操作。
算法(Algorithm)就是解决问题的方法或过程。
基本数据结构
线性结构 ➢ 线性表 ➢栈 ➢ 队列 ➢串
非线性结构
➢ 树结构 ➢ 图结构
算法思路: 一个正整数m可表示如下:
m = (p1)j1 * (p2)j2 * … *(pn)jn Ugly number = 2j1 * 3j2 * 5j3 (j1,j2,j3>=0)
在已知序列中,找一个最小的数,使得它乘以2比已知序列最后一个元素 大;找一个最小的数,使得它乘以3比最后一个元素大;找一个最小的数, 使得它乘以5比最后一个元素大. 在这三个乘积中找最小的添加到表尾, 反复按此规则构造递增序列,直到表中有1500个元素。 可以用数组预先分配1500个单元,也可以用链表动态分配.
0: 0 1: 1 9 2 4 2: 3: 3 4: 5: 5 8 7 6 6: 7: 8: 9:
处理过程:
10 move 9 onto 1 move 8 over 1 move 7 over 1 move 6 over 1 pile 8 over 6 pile 8 over 5 move 2 over 1 move 4 over 9 quit
output:
0: 0
1: 1 9 2 4
2:
3: 3
4:
4
6
5: 5 8 7 6
2
7
6:
9
8
7:
01 3 5
8:
0 1 2 3 4 5 6 7 8 9 9:
分析
设计的操作: f(i): 把叠在木块i上的其他木块放回初始位置. m(i,j): 把i及其以上的木块全叠到包含j的上方.
move a onto b => f(a),f(b),m(a,b) move a over b => f(a),m(a,b) pile a onto b => f(b),m(a,b) pile a over b => m(a,b)
的那一堆木块上面.
move a onto b
先将a和b上的其他木块移回到它们的初始位置,然 后将木块a摞在木块b上.
Example: move 3 onto 6
2
4
7
01 3 56 89
0123456789
3 0123456789 0123456789
move a over b
先将木块a上的其他木块移到它们的初始位置后,然 后将木块a摞到包含了木块b的那一堆木块上面.
6 7 8 9 012345 0123456789
处理过程(续) :
10 move 9 onto 1 move 8 over 1 move 7 over 1 move 6 over 1 pile 8 over 6 pile 8 over 5 move 2 over 1 move 4 over 9 quit
6
2
7
9
8
01 3 5
0123456789
处理过程(续) :
10 move 9 onto 1 move 8 over 1 move 7 over 1 move 6 over 1 pile 8 over 6 pile 8 over 5 move 2 over 1 move 4 over 9 quit
按以上规则,用链表的操作直接模拟即可.
数据结构设计
设计的数据结构:
struct Node { Bplace[0] 0 Station[0]
4
6
2
7
9
8
01 3 5
0123456789
处理结果
input: 10 move 9 onto 1 move 8 over 1 move 7 over 1 move 6 over 1 pile 8 over 6 pile 8 over 5 move 2 over 1 move 4 over 9 quit
8 9 01234567 0123456789
处理过程(续) :
10 move 9 onto 1 move 8 over 1 move 7 over 1 move 6 over 1 pile 8 over 6 pile 8 over 5 move 2 over 1 move 4 over 9 quit
Example: move 3 over 6
2
4
7
01 3 56 89
0123456789
3 7 0123456 89 0123456789
pile a onto b
先将木块b上的所有木块移回到它们的初始位置,然 后将木块a及其上的木块移到木块b上.