《数据结构》课件(C语言)第05章
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第五章 数组与广义表
复习提问
1.设栈的输入序列是1,2,3,4,则( )不可能是其出栈序列。 A. 1,2,4,3, B. 2,1,3,4,C. 1,4,3,2, D. 4,3,1,2, E. 3,2,1,4 2.设一个栈的输入序列是 1,2,3,4,5,则下列序列中,是栈的合 法输出序列的是( )。 A. 5 1 2 3 4 B. 4 5 1 3 2 C. 4 3 1 2 5 D. 3 2 1 5 4 3.输入序列为ABC,可以变为CBA时,经过的栈操作为( ) A. push,pop,push,pop,push,pop B. push,push,push,pop,pop,
2
复习提问
1.下面关于串的的叙述中,哪一个是不正确的?( )
A.串是字符的有限序列
B.空串是由空格构成的串
C.模式匹配是串的一种重要运算
D.串既可以采用顺序存储,也可以采用链式存储
2.设有两个串p和q,其中q是p的子串,求q在p中首次出现的位
置的算法称为( )
A.求子串 B.联接 C.匹配 D.求串长
R R1, R2 ,, Rn
ck
jk
dk ,1 k
ห้องสมุดไป่ตู้
n且k
i
Ri
a , a j1 , ji jn
j1 , ji 1 jn
ci
ji
di 1
说明:
a , a D j1 ji jn
j1 ji 1 jn
1)n维数组的元素个数为n1·n2·····nn= ni. 2)n维数组中每个数据元素都属于n个向量(受n个关系制约) ,除边界上的元素外,均可以有n个前趋和n个后继。
pop C. push,push,pop,pop,push,pop D. push,pop,push,push,pop,pop 4.表达式a*(b+c)-d的后缀表达式是( )。 A.abcd*+- B. abc+*d- C. abc*+d- D. -+*abcd 5.栈和队列都是线性表,只是在插入和删除时受到了一些限制。 6.设Q[0..N-1]为循环队列,其头、尾指针分别为P和R,则队Q中当 前所含元素个数为_______。
把n维数组的元素按上述方式顺序存放在存储单元中,则每 个元素的存储地址可以用一个公式计算出来,这个公式称为“地 址公式”。
计算存储地址:对于A[1..m, 1..n],设每个数组元素占L个存
储单元。
LOC[1,1]
j
不同程序设计语言中
数组的起始下标不完全相 同,C语言起始下标为0, Pascal为1,某些4GL则允 许定义起始下标。
↓
a11a12
A
i→
a21a22
am1am2
↓ aij
a1n
a2n
amn
注. 以左下标为主序,指主序变化最慢(实现时为最外层循环)
18
数组的顺序存储结构
以二维数组为例,先讨论简化情况(c1=1,d1=m, c2=1, d2=n),再讨论一般情况(下标分别为c1,d1, c2,d2).
Amn
a21a22
a2 n
am1am2 amn
10
数组的逻辑结构
2) 二维数组也可以看作是这样一个线性表:它的每一个数据 元素是一个线性表。从而对二维数组可以进行递归定义,即它是 数据元素为一维数组的线性表。可把Am×n看成是由m个行向量所 组成的向量(线性表),也可以看成是n个列向量所组成的向量。
16
数组的顺序存储结构
示例: w是一个3*4的整数数组(起始下标从1开始)。 设二维数组变量w的诸数据组元素值如下表所示
1234 1 0 -1 4 5 2 8 2 0 -3 3 -5 1 2 0
以列序为主序的存储方式——
列优先序
0 8
第1列
-5
-1 2
第2列
1
4 0 第3列
2
5 -3 第4列 0
ik 1
cnk 1 ik dnk 1
A(k ) ik
,
A(k ) ik 1
D
在这递归定义中,一个k维数组是其数据元素为k-1维数组的线
性表,cn-k+1和dn-k+1是第k维下标的一对界偶。 n维数组是一种较复杂的数据结构,但它可以由简单的数据结
构13 ——线性表辗转合成而得。
数组的逻辑结构
Col={<aij, ai+1, j>| i=1,2,···,m-1, j=1,2,···,n, aij, ai+1, j ∈D}
记作Am×n,即A为m行n列的二维数组(起始下标为1)。
说明: 1) 用于二维数组的抽象可称之为矩阵,它是对向量的推广,其 元素个数为m×n个。
a11a12 a1n
数组的操作
一个数组中所有的数据元素都必须属于同一数据类型。 对于数组,通常只有两种基本操作:
1)给定一组下标,存取相应的数据元素。 2)给定一组下标,修改相应数据元素中的某一个或 几个数据项的值。
注. 对于二维数组的抽象即矩阵,可包含取值、赋值
和初始化等操作。编译程序用线性存储器来实现矩阵。
14
数组的顺序存储结构
3.若串S=’software’,其子串的数目是( )。
A.8 B.37
C.36
D.9
4. KMP算法的特点是在模式匹配时指示主串的指针不会变小。
()
5.设模式串的长度为m,目标串的长度为n,当n≈m且处理只匹配
一次的模式时,朴素的匹配(即子串定位函数)算法所花的时
间代价可能会更为节省。( )
3
复习提问
15
数组的顺序存储结构
数组的顺序存储结构:用一组连续的存储单元 顺序地存放数组中的诸数组元素。
数据元素的存放次序问题:解决存储单元是一 维结构,而数组是个多维结构的矛盾。 (指多维数组)
二维数组元素间次序的排列方法:行优先与列 优先序。
(行列优)先序:按以行(序列为) 主序进行排列,就是把 数组元素按行表次(序列、) 第i+1行的(元j+素1列紧)跟在第i行元 素后面(进j列行)存储。
12
数组的逻辑结构
N维数组的递归定义
K _ Array (D(k ) , R(k) )(1 k n) 其中
(5 3)
D(k)
kAi(kk )1c时n,k
1 A(k )
ik
ik
d D0
nk
1
k
1时,
A(k ik
)是k
1维数组
R(k) AR
AR
A , A (k ) (k )
ik
8
数组的逻辑结构
9
数组的逻辑结构
若c1=1, d1=m, c2=1, d2=n, 则有 D={aij|i=1,2,···,m, j= 1,2 ,···,n,∈D0}
R={Row,Col}
Row={<aij, ai, j+1>| i=1,2,···,m, j=1,2,···,n-1, aij, ai, j+1∈D}
记a11的存储地址为LOC[1,1],它即是 二维数组A的起始存储位置,C语或言称起基始地下址标(从0开始,则 首地址),L为元素所占L的oc单[i元,j]数=。Loc[0,0] + ( n*i + j ) * L
记aij(1≤i≤m, 1≤j≤n)的存储地址为LOC[i,j],
则
LOC[1,1]
LOC[i,j]=LOC[1,1]+ [n*(i-1)+(j-1)]*L.
以行序为主序的存储方式——
行优先序 0
-1 4
第1行
5
8
2 0
第2行
-3
-5
1 2
第3行
0
FORTRAN中采用
C,Pascal, BASIC, PL/1, COBOL等中采用
下面讨论的是按行为主序规则存储的情形。
17
数组的顺序存储结构
同样,对于n维数组也有上述两种不同的顺序存储方式:以 左下标为主序的存储方式和以右下标为主序的存储方式。
1.已知串S=‘aaab’,其Next数组值为( )。 A.0123 B.1123 C.1231 D.1211 2.串 ‘ababaaababaa’ 的next数组为( )。 A.012345678999 B.012121111212 C.011234223456 D.0123012322345 3.串是一种数据对象和操作都特殊的线性表。( ) 4.串的长度是指( ) A.串中所含不同字母的个数 B.串中所含字符的个数 C.串中所含不同字符的个数 D.串中所含非空格字符的个数 5.两个字符串相等的充分必要条件是_______。
4) 每个元素aij有两个前趋结点ai-1, j和ai, j-1(2≤i≤m, 2≤j≤n),两 个后继结点ai+1, j和ai, j+1(1≤i≤m-1, 1≤j≤n-1),其中a11无前趋,amn无 后继。边界上的结点a1j(j=2,···,n),amj(j=1,···,n-1)和ain(i=1,···,m-1) 都只有一个后继结点或者只有一个前趋结点。
↓
a11a12
一般地,对于A[c1..d1,c2..d2],则有 Loc[i,j] = Loc[c1,c2] + [(d2-c2+1)(i- c1)+(j- c2)]*L
A i→a21a22 am1am2
j
↓ aij
a1n
a2n
amn
其中LOC[c1,c2]是二维数组A的基地址。
19
1)
1.
20
上已推导出,对于三维数组A[c1..d1, c2..d2, c3..d3], 设基地址为LOC[c1,c2, c3],则
LOC[ j1 , j2 , j3 ] LOC[c1 , c2 , c3 ]
3
i ( ji ci ) i 1
LOC[c1, c2 , c3 ]
2
3
[ i 1
( ji
ci
)
k
(d
i 1
k
ck
1) (
j3
c3 )] l
3
LOC[c1, c2 , c3 ] i ( ji ci )
i 1
其中
3
i l k i1 (dk ck 1),1 i 3
当i
3
3时,
令
k
(d
i 1
k
ck
4
内容和要求
●内容和要求
数组和广义表的 概念、存储结构和矩 阵的压缩存储方法。 要求对数组和广义表 有较深刻的了解。掌 握数组和广义表的概 念,熟悉它们的存储 结构及基本应用。
● 重点
数组和广义表的存储 特性,稀疏矩阵存储。
5
多维数组的定义
✓ 一维数组
►一维数组可以看成是一个线性表或一个向量,它在计算机 内是存放在一块连续的存储单元中,适合于随机查找。
11
数组的逻辑结构
n(n>2)维数组的逻辑结构
n维数组的逻辑结构的形式定义
n Array (D, R) 其中
(5 2)
D
a
j1
,
j2
jn
ji ci , ci1,, di , i 1,2,n(n 0)
a j1 , j2 jn
D0
,
且ci
和d
(5 2)
均
i
为
整数
n Array (D, R)
数组的顺序存储结构
对于三维数组A[c1..d1, c2..d2, c3..d3],设基地址为LOC[c1,c2, c3], 则
LOC[j1,j2, j3]=LOC[c1,c2, c3]+[(d2-c2+1) (d3-c3+1)(j1-c1)+(d3-c3+1) (j2-c2)+ (j3-c3)]*L
Am×n=(α1, α 2, ···, α p) (p=m或n)
若α i为行向量 :α i = (ai1, ai2,···, ain) 1≤i≤m 若α j为列向量 :α j = (a1j, a2j,···, amj) 1≤j≤n
3) 二维数组中的每个元素都属于两个向量:第i行的行向量和 第j列的列向量(对元素aij而言 )。
►把三维以上的数组称为多维数组, ►可有多个直接前驱和多个直接后继 ►是一种非线性结构。
7
多维数组的定义
在C语言中的描述
typedef int datatype; datatype array1[N];
datatype array2[M][N];
datatype array3[X][Y][Z];
数组一旦被定义,它的维数和维界就不再改 变。因此,数组只有存取元素和修改元素值的 操作。
►有一个直接前驱和一个直接后继
✓ 二维数组
►二维数组可以看成是向量的推广。
►有两个直接前驱和两个直接后继
a00 a01 ……
a0n-1
a10 a11 ……
a1n-1
………………………….
A=
a a m-1 0 m-1 1 ……
am-1 n-1
6
多维数组的定义
✓ 三维数组
►最多可有三个直接前驱和三个直接后继 ✓多维数组
两种顺序存储方式
✓ 行优先顺序——将数组元素按行排列
►在PASCAL、C语言中,数组就是按行优先顺序存储的。
✓ 列优先顺序——将数组元素按列向量排列
►在FORTRAN语言中,数组就是按列优先顺序存储的。
✓ 推广到多维数组的情况:
►行优先顺序:先排最右下标,从右到左,最后排最左下标 ►列优先顺序:先排最左下标,从左向右,最后排最右下标。
复习提问
1.设栈的输入序列是1,2,3,4,则( )不可能是其出栈序列。 A. 1,2,4,3, B. 2,1,3,4,C. 1,4,3,2, D. 4,3,1,2, E. 3,2,1,4 2.设一个栈的输入序列是 1,2,3,4,5,则下列序列中,是栈的合 法输出序列的是( )。 A. 5 1 2 3 4 B. 4 5 1 3 2 C. 4 3 1 2 5 D. 3 2 1 5 4 3.输入序列为ABC,可以变为CBA时,经过的栈操作为( ) A. push,pop,push,pop,push,pop B. push,push,push,pop,pop,
2
复习提问
1.下面关于串的的叙述中,哪一个是不正确的?( )
A.串是字符的有限序列
B.空串是由空格构成的串
C.模式匹配是串的一种重要运算
D.串既可以采用顺序存储,也可以采用链式存储
2.设有两个串p和q,其中q是p的子串,求q在p中首次出现的位
置的算法称为( )
A.求子串 B.联接 C.匹配 D.求串长
R R1, R2 ,, Rn
ck
jk
dk ,1 k
ห้องสมุดไป่ตู้
n且k
i
Ri
a , a j1 , ji jn
j1 , ji 1 jn
ci
ji
di 1
说明:
a , a D j1 ji jn
j1 ji 1 jn
1)n维数组的元素个数为n1·n2·····nn= ni. 2)n维数组中每个数据元素都属于n个向量(受n个关系制约) ,除边界上的元素外,均可以有n个前趋和n个后继。
pop C. push,push,pop,pop,push,pop D. push,pop,push,push,pop,pop 4.表达式a*(b+c)-d的后缀表达式是( )。 A.abcd*+- B. abc+*d- C. abc*+d- D. -+*abcd 5.栈和队列都是线性表,只是在插入和删除时受到了一些限制。 6.设Q[0..N-1]为循环队列,其头、尾指针分别为P和R,则队Q中当 前所含元素个数为_______。
把n维数组的元素按上述方式顺序存放在存储单元中,则每 个元素的存储地址可以用一个公式计算出来,这个公式称为“地 址公式”。
计算存储地址:对于A[1..m, 1..n],设每个数组元素占L个存
储单元。
LOC[1,1]
j
不同程序设计语言中
数组的起始下标不完全相 同,C语言起始下标为0, Pascal为1,某些4GL则允 许定义起始下标。
↓
a11a12
A
i→
a21a22
am1am2
↓ aij
a1n
a2n
amn
注. 以左下标为主序,指主序变化最慢(实现时为最外层循环)
18
数组的顺序存储结构
以二维数组为例,先讨论简化情况(c1=1,d1=m, c2=1, d2=n),再讨论一般情况(下标分别为c1,d1, c2,d2).
Amn
a21a22
a2 n
am1am2 amn
10
数组的逻辑结构
2) 二维数组也可以看作是这样一个线性表:它的每一个数据 元素是一个线性表。从而对二维数组可以进行递归定义,即它是 数据元素为一维数组的线性表。可把Am×n看成是由m个行向量所 组成的向量(线性表),也可以看成是n个列向量所组成的向量。
16
数组的顺序存储结构
示例: w是一个3*4的整数数组(起始下标从1开始)。 设二维数组变量w的诸数据组元素值如下表所示
1234 1 0 -1 4 5 2 8 2 0 -3 3 -5 1 2 0
以列序为主序的存储方式——
列优先序
0 8
第1列
-5
-1 2
第2列
1
4 0 第3列
2
5 -3 第4列 0
ik 1
cnk 1 ik dnk 1
A(k ) ik
,
A(k ) ik 1
D
在这递归定义中,一个k维数组是其数据元素为k-1维数组的线
性表,cn-k+1和dn-k+1是第k维下标的一对界偶。 n维数组是一种较复杂的数据结构,但它可以由简单的数据结
构13 ——线性表辗转合成而得。
数组的逻辑结构
Col={<aij, ai+1, j>| i=1,2,···,m-1, j=1,2,···,n, aij, ai+1, j ∈D}
记作Am×n,即A为m行n列的二维数组(起始下标为1)。
说明: 1) 用于二维数组的抽象可称之为矩阵,它是对向量的推广,其 元素个数为m×n个。
a11a12 a1n
数组的操作
一个数组中所有的数据元素都必须属于同一数据类型。 对于数组,通常只有两种基本操作:
1)给定一组下标,存取相应的数据元素。 2)给定一组下标,修改相应数据元素中的某一个或 几个数据项的值。
注. 对于二维数组的抽象即矩阵,可包含取值、赋值
和初始化等操作。编译程序用线性存储器来实现矩阵。
14
数组的顺序存储结构
3.若串S=’software’,其子串的数目是( )。
A.8 B.37
C.36
D.9
4. KMP算法的特点是在模式匹配时指示主串的指针不会变小。
()
5.设模式串的长度为m,目标串的长度为n,当n≈m且处理只匹配
一次的模式时,朴素的匹配(即子串定位函数)算法所花的时
间代价可能会更为节省。( )
3
复习提问
15
数组的顺序存储结构
数组的顺序存储结构:用一组连续的存储单元 顺序地存放数组中的诸数组元素。
数据元素的存放次序问题:解决存储单元是一 维结构,而数组是个多维结构的矛盾。 (指多维数组)
二维数组元素间次序的排列方法:行优先与列 优先序。
(行列优)先序:按以行(序列为) 主序进行排列,就是把 数组元素按行表次(序列、) 第i+1行的(元j+素1列紧)跟在第i行元 素后面(进j列行)存储。
12
数组的逻辑结构
N维数组的递归定义
K _ Array (D(k ) , R(k) )(1 k n) 其中
(5 3)
D(k)
kAi(kk )1c时n,k
1 A(k )
ik
ik
d D0
nk
1
k
1时,
A(k ik
)是k
1维数组
R(k) AR
AR
A , A (k ) (k )
ik
8
数组的逻辑结构
9
数组的逻辑结构
若c1=1, d1=m, c2=1, d2=n, 则有 D={aij|i=1,2,···,m, j= 1,2 ,···,n,∈D0}
R={Row,Col}
Row={<aij, ai, j+1>| i=1,2,···,m, j=1,2,···,n-1, aij, ai, j+1∈D}
记a11的存储地址为LOC[1,1],它即是 二维数组A的起始存储位置,C语或言称起基始地下址标(从0开始,则 首地址),L为元素所占L的oc单[i元,j]数=。Loc[0,0] + ( n*i + j ) * L
记aij(1≤i≤m, 1≤j≤n)的存储地址为LOC[i,j],
则
LOC[1,1]
LOC[i,j]=LOC[1,1]+ [n*(i-1)+(j-1)]*L.
以行序为主序的存储方式——
行优先序 0
-1 4
第1行
5
8
2 0
第2行
-3
-5
1 2
第3行
0
FORTRAN中采用
C,Pascal, BASIC, PL/1, COBOL等中采用
下面讨论的是按行为主序规则存储的情形。
17
数组的顺序存储结构
同样,对于n维数组也有上述两种不同的顺序存储方式:以 左下标为主序的存储方式和以右下标为主序的存储方式。
1.已知串S=‘aaab’,其Next数组值为( )。 A.0123 B.1123 C.1231 D.1211 2.串 ‘ababaaababaa’ 的next数组为( )。 A.012345678999 B.012121111212 C.011234223456 D.0123012322345 3.串是一种数据对象和操作都特殊的线性表。( ) 4.串的长度是指( ) A.串中所含不同字母的个数 B.串中所含字符的个数 C.串中所含不同字符的个数 D.串中所含非空格字符的个数 5.两个字符串相等的充分必要条件是_______。
4) 每个元素aij有两个前趋结点ai-1, j和ai, j-1(2≤i≤m, 2≤j≤n),两 个后继结点ai+1, j和ai, j+1(1≤i≤m-1, 1≤j≤n-1),其中a11无前趋,amn无 后继。边界上的结点a1j(j=2,···,n),amj(j=1,···,n-1)和ain(i=1,···,m-1) 都只有一个后继结点或者只有一个前趋结点。
↓
a11a12
一般地,对于A[c1..d1,c2..d2],则有 Loc[i,j] = Loc[c1,c2] + [(d2-c2+1)(i- c1)+(j- c2)]*L
A i→a21a22 am1am2
j
↓ aij
a1n
a2n
amn
其中LOC[c1,c2]是二维数组A的基地址。
19
1)
1.
20
上已推导出,对于三维数组A[c1..d1, c2..d2, c3..d3], 设基地址为LOC[c1,c2, c3],则
LOC[ j1 , j2 , j3 ] LOC[c1 , c2 , c3 ]
3
i ( ji ci ) i 1
LOC[c1, c2 , c3 ]
2
3
[ i 1
( ji
ci
)
k
(d
i 1
k
ck
1) (
j3
c3 )] l
3
LOC[c1, c2 , c3 ] i ( ji ci )
i 1
其中
3
i l k i1 (dk ck 1),1 i 3
当i
3
3时,
令
k
(d
i 1
k
ck
4
内容和要求
●内容和要求
数组和广义表的 概念、存储结构和矩 阵的压缩存储方法。 要求对数组和广义表 有较深刻的了解。掌 握数组和广义表的概 念,熟悉它们的存储 结构及基本应用。
● 重点
数组和广义表的存储 特性,稀疏矩阵存储。
5
多维数组的定义
✓ 一维数组
►一维数组可以看成是一个线性表或一个向量,它在计算机 内是存放在一块连续的存储单元中,适合于随机查找。
11
数组的逻辑结构
n(n>2)维数组的逻辑结构
n维数组的逻辑结构的形式定义
n Array (D, R) 其中
(5 2)
D
a
j1
,
j2
jn
ji ci , ci1,, di , i 1,2,n(n 0)
a j1 , j2 jn
D0
,
且ci
和d
(5 2)
均
i
为
整数
n Array (D, R)
数组的顺序存储结构
对于三维数组A[c1..d1, c2..d2, c3..d3],设基地址为LOC[c1,c2, c3], 则
LOC[j1,j2, j3]=LOC[c1,c2, c3]+[(d2-c2+1) (d3-c3+1)(j1-c1)+(d3-c3+1) (j2-c2)+ (j3-c3)]*L
Am×n=(α1, α 2, ···, α p) (p=m或n)
若α i为行向量 :α i = (ai1, ai2,···, ain) 1≤i≤m 若α j为列向量 :α j = (a1j, a2j,···, amj) 1≤j≤n
3) 二维数组中的每个元素都属于两个向量:第i行的行向量和 第j列的列向量(对元素aij而言 )。
►把三维以上的数组称为多维数组, ►可有多个直接前驱和多个直接后继 ►是一种非线性结构。
7
多维数组的定义
在C语言中的描述
typedef int datatype; datatype array1[N];
datatype array2[M][N];
datatype array3[X][Y][Z];
数组一旦被定义,它的维数和维界就不再改 变。因此,数组只有存取元素和修改元素值的 操作。
►有一个直接前驱和一个直接后继
✓ 二维数组
►二维数组可以看成是向量的推广。
►有两个直接前驱和两个直接后继
a00 a01 ……
a0n-1
a10 a11 ……
a1n-1
………………………….
A=
a a m-1 0 m-1 1 ……
am-1 n-1
6
多维数组的定义
✓ 三维数组
►最多可有三个直接前驱和三个直接后继 ✓多维数组
两种顺序存储方式
✓ 行优先顺序——将数组元素按行排列
►在PASCAL、C语言中,数组就是按行优先顺序存储的。
✓ 列优先顺序——将数组元素按列向量排列
►在FORTRAN语言中,数组就是按列优先顺序存储的。
✓ 推广到多维数组的情况:
►行优先顺序:先排最右下标,从右到左,最后排最左下标 ►列优先顺序:先排最左下标,从左向右,最后排最右下标。