数据结构第5章数组和广义表数组ppt课件
合集下载
第5章数组和广义表PPT课件
A、j(j-1)/2+i-1 B、j(j-1)/2+i C、j(j+1)/2+i-1 D、 j(j+1)/2+i
数据结构(Java版)》叶核亚
5.2.2 稀疏矩阵的压缩存储
表示稀疏矩阵的三元组
0 0 11 0 17 0
0
20
0
0
0
0
行号 row
列号 column
元素值 value
A56
0 19
设矩阵A是一个对称矩阵,为了节省空间,将其下三角部分 按行优先存放在一维数组B中。对下三角矩阵中任一元素 aij(i>=j,j>=1),在一维数组B中下标K的值是:
A、i(i-1)/2+j-1 B、i(i-1)/2+j C、i(i+1)/2+j-1 D、 i(i+1)/2+j
设矩阵A是一个对称矩阵,为了节省空间,将其上三角部分 按列优先存放在一维数组B中。对上三角矩阵中任一元素 aij(i<=j,i>=1),在一维数组B中下标K的值是:
1.多维数组的逻辑结构
数据结构(Java版)》叶核亚
5.1.2 多维数组
2.多维数组的遍历
(1)行优先次序
a1,1 a1,2 a1,n
Amn
a2,1
am,1
a2,2 am,2
a2,n
am,n
a1,1,a1,2,…,a1,n,a2,1,a2,2,…, a2,n,…,am,1,am,2,…,am,n
常见的广义表为:
L=(a,b)
//线性表,长度为2 ,深度为1
T=(c,L)=(c,(a,b)) //L为T的子表,T的长度为2 , 深度为2
数据结构(Java版)》叶核亚
5.2.2 稀疏矩阵的压缩存储
表示稀疏矩阵的三元组
0 0 11 0 17 0
0
20
0
0
0
0
行号 row
列号 column
元素值 value
A56
0 19
设矩阵A是一个对称矩阵,为了节省空间,将其下三角部分 按行优先存放在一维数组B中。对下三角矩阵中任一元素 aij(i>=j,j>=1),在一维数组B中下标K的值是:
A、i(i-1)/2+j-1 B、i(i-1)/2+j C、i(i+1)/2+j-1 D、 i(i+1)/2+j
设矩阵A是一个对称矩阵,为了节省空间,将其上三角部分 按列优先存放在一维数组B中。对上三角矩阵中任一元素 aij(i<=j,i>=1),在一维数组B中下标K的值是:
1.多维数组的逻辑结构
数据结构(Java版)》叶核亚
5.1.2 多维数组
2.多维数组的遍历
(1)行优先次序
a1,1 a1,2 a1,n
Amn
a2,1
am,1
a2,2 am,2
a2,n
am,n
a1,1,a1,2,…,a1,n,a2,1,a2,2,…, a2,n,…,am,1,am,2,…,am,n
常见的广义表为:
L=(a,b)
//线性表,长度为2 ,深度为1
T=(c,L)=(c,(a,b)) //L为T的子表,T的长度为2 , 深度为2
Chapter05_数组和广义表_数据结构(C语言版)_严蔚敏_配套ppt课件
M
1 1 2 3 3 4
1 5 3 1 2 4
3 7 -1 -1 -2 2
N
1 1 2 3 4 5
1 3 3 2 4 1
3 -1 -2 -1 2 7
行列下 标调换
1 5 3 1 2 4
1 1 2 3 3 4
3 7 -1 -1 -2 2
按行下 标排序
法1:
按照矩阵M的列序进行转置,即按三元组A的 第二个字段值(列下标)由小到大的顺序进行转置。 为了找到M中每一列中所有的非零元素,需要对其 三元组表a.data从第一行起整个扫描一遍,由于 a.data是以M的行序为主序来存放每个非零元素 的,对于M中具有相同列下标的非零元来讲,先扫 描到的非零元的行下标一定小于后扫描到的非零元 的行下标,由此得到的恰是b.data应有的顺序。
• 压缩的含义
– 为多个值相同的元素只分配一个存贮空间; – 零元素不分配或少分配存贮空间。
• 特殊矩阵:元素值相同或零元素分布有 一定规律的矩阵。 • 稀疏矩阵:元素值相同或零元素分布没 有规律的矩阵。 • 特殊矩阵的压缩存贮实际是将二维数组 的数据元素压缩到一维数组上。
特殊矩阵的压缩存储
特殊矩阵: 非零元在矩阵中的分布有一定规则
常用的稀疏矩阵的存储方法
三元组表示法 顺序存储 行逻辑联接的顺序表 带辅助行向量的二元组表示法 伪地址表示法 带行指针向量的单链表示法 链接存储 散列存储 行列表示法(十字链表) 多链表示法(正交表)
顺序存储
1、三元组表示法 用一个线性表来表示稀疏矩阵,线性表的每个 结点对应稀疏矩阵的一个非零元素。其中包括三个 域,分别为该元素的行下标、列下标和值。结点间 的先后顺序按矩阵的行优先顺序排列(跳过零元 素),将线性表用顺序的方法存储在连续的存储区 里。
chapter5数组和广义表.ppt
以此类推。
三元组的存储位置
row
col
item
0
0
15
0
3
22
0
5
-15
1
1
11
1
2
3
2
3
6
4
0
9
7 (非零元素个数) 5(行数) 6(列数)
第0列第1个非零元素 第0列有2个非零元素
第1列第1个非零元素
算法思路
引入两个数组作为辅助数据结构:
num[nu]存储矩阵A中某列的非零元素的个数 cpot[nu]表示矩阵A中某列的第一个非零元素
13-Oct-19
3
数组的特点
N
数组中的总元素个数为: bi i 1
数组是一种结构固定,且操作有限制的线性表
数组的结构固定,通常不能改变它的维数,也不能改变每 个维数的长度
通过给定数组元数的下标,人们可以存取相应的数据元素 通过给定数组元数的下标,人们可以修改数据元素的值 通常情况下不能对数组元素做插入和删除操作,常用的操
1
1
11
1
2
3
2
3
6
4
0
9
7 (非零元素个数) 5(行数) 6(列数)
row
col
item
0
0
15
7 (非零元素个数) 6(行数) 5(列数)
三元组表的转置算法1示例
row
col
item
0
0
15
0
3
22
0
5
-15
1
1
11
1
2
3
2
3
6
三元组的存储位置
row
col
item
0
0
15
0
3
22
0
5
-15
1
1
11
1
2
3
2
3
6
4
0
9
7 (非零元素个数) 5(行数) 6(列数)
第0列第1个非零元素 第0列有2个非零元素
第1列第1个非零元素
算法思路
引入两个数组作为辅助数据结构:
num[nu]存储矩阵A中某列的非零元素的个数 cpot[nu]表示矩阵A中某列的第一个非零元素
13-Oct-19
3
数组的特点
N
数组中的总元素个数为: bi i 1
数组是一种结构固定,且操作有限制的线性表
数组的结构固定,通常不能改变它的维数,也不能改变每 个维数的长度
通过给定数组元数的下标,人们可以存取相应的数据元素 通过给定数组元数的下标,人们可以修改数据元素的值 通常情况下不能对数组元素做插入和删除操作,常用的操
1
1
11
1
2
3
2
3
6
4
0
9
7 (非零元素个数) 5(行数) 6(列数)
row
col
item
0
0
15
7 (非零元素个数) 6(行数) 5(列数)
三元组表的转置算法1示例
row
col
item
0
0
15
0
3
22
0
5
-15
1
1
11
1
2
3
2
3
6
数据结构课件-DS05-数组与广义表.ppt
若i > j,数组元素A[i][j]在矩阵的下三角部分,在 数组 B 中没有存放。因此,找它的对称元素A[j][i]。
的 i, 此即为该元素的行号。 j = k - i * (i + 1) / 2
此即为该元素的列号。 例,当 k = 8, 3*4 / 2 = 6 k < 4*5 / 2 =10,
取 i = 3。则 j = 8 - 3*4 / 2 = 2。
第 章 数组和广义表
a00 a01 a02 a03 上
n=4
第 章 数组和广义表
第五章 数组
数组的类型定义和表示方法 特殊矩阵和稀疏矩阵存储方法
及运算的实现 广义表的结构特点
第 章 数组和广义表
数组可以看成是一种特殊的线性表,即线性表 中数据元素本身也是一个线性表
5.1.1 二维数组的定义
定义
)
)
)
(a11 a12 ... ... a1n)
)
)
Amn
(a21
n1
n
aj1ij kj1mk in*l
第 章 数组和广义表
5.2.1 特殊矩阵
为节约存储,只存对角线及对角线以上的元素, 或者只存对角线及对角线以下的元素。前者称为 上三角矩阵,后者称为下三角矩阵。
a00 a01 a02 a0n1
aaan121000
a11
a21 an11
a12
a22 an12
数据元素同构
数组运算
给定一组下标,存取相应的数据元素
给定一组下标,修改数据元素的值
第 章 数组和广义表
矩阵Am×n看成n个列向量的线性表
第 章 数组和广义表
矩阵Am×n看成m个行向量的线性表
第 章 数组和广义表
的 i, 此即为该元素的行号。 j = k - i * (i + 1) / 2
此即为该元素的列号。 例,当 k = 8, 3*4 / 2 = 6 k < 4*5 / 2 =10,
取 i = 3。则 j = 8 - 3*4 / 2 = 2。
第 章 数组和广义表
a00 a01 a02 a03 上
n=4
第 章 数组和广义表
第五章 数组
数组的类型定义和表示方法 特殊矩阵和稀疏矩阵存储方法
及运算的实现 广义表的结构特点
第 章 数组和广义表
数组可以看成是一种特殊的线性表,即线性表 中数据元素本身也是一个线性表
5.1.1 二维数组的定义
定义
)
)
)
(a11 a12 ... ... a1n)
)
)
Amn
(a21
n1
n
aj1ij kj1mk in*l
第 章 数组和广义表
5.2.1 特殊矩阵
为节约存储,只存对角线及对角线以上的元素, 或者只存对角线及对角线以下的元素。前者称为 上三角矩阵,后者称为下三角矩阵。
a00 a01 a02 a0n1
aaan121000
a11
a21 an11
a12
a22 an12
数据元素同构
数组运算
给定一组下标,存取相应的数据元素
给定一组下标,修改数据元素的值
第 章 数组和广义表
矩阵Am×n看成n个列向量的线性表
第 章 数组和广义表
矩阵Am×n看成m个行向量的线性表
第 章 数组和广义表
数据结构之数组与广义表课件PPT课件
对称矩阵有n*n个元素,但只存储n*(n+1)/2 个元素即可. 若以行序为主序,把下三角中的 元素,存储在一个一维数组SA[n*(n+1)/2] 中, 则 A[i,j] 和SA[k] 的对应关系如下:
若 i>=j , 则A[i, j]在下三角中,A[i, j]之前共有 1+2+……+i+j = i*(i+1)/2+j 个元素,因此有
2
3 -1
3
1
-1
6
4
5
2
8
6
1
5
7
6
9
7 7 7
t: 1 3 -1
165 212 258 3 1 -1 634 679
➢ 基本思想:
把S转置成T,就是把S中的每一个三元组的 行号和列号(row 和col)交换,并存储在T 中。但是,这样的结果是按列优先存储的稀 疏矩阵T,所以,还必须重新排列三元组的 顺序。
3.稀疏矩阵的压缩存储
➢ 若一个m*n矩阵,有s个非0元素, 记 e=s/(m*n) e 称为稀疏因子。 当 e0.05时,则称为稀疏矩阵。
例: M=
0 2 -1 0 0 0 0 0000000 -1 0 0 0 0 4 0 0000000 0800000 5000000 0000090
➢ 在稀疏矩阵中,非0元素的排列无规律,所以不 能采用以前的压缩方法。
1. 一维数组的寻址公式
对于一维数组,若其第一个元素的首地
址为Loc(a0),下标为 i 的数组元素A[i]的地
址为Loc(ai),
a a 则 Loc( i) = Loc( 0) + k * i
( 0≤i≤n-1)
数据结构第5章数组和广义表2广义表ppt课件PPT精品文档33页
所以在对应的存储结构中,其存储结点也有相应划分。 对于原子结点,应包含值域; 对于表结点,应包含指示表头的表头指针域(指向
表中的第一个元素)和指示表尾的表尾指针域(指向除 去原表头元素后的广义表)。
4)D=( A , B ,C )
n=3,3个元素都是子表
5)E=(a, E)
n=2,a 为原子,E为子表
D=(A,B,C)=(( ),(e),(a,(b,c,d))),共享表
E=(a,E)=(a,(a,E))= (a,(a,(a,…….))),E为递归表
§5.4 广义表的类型定义
❖试用图形表示下列广义表
§5.4 广义表的类型定义 ❖广义表的特点
▪ 可共享
广义表的元素可以为其他广义表所共享 A = ( a , B ) =( a , ( b , c , d ) )
§5.4 广义表的类型定义
❖例1:求下列广义表的长度
1)A =( )
n=0,因为A是空表
2)B = ( e )
n=1,表中元素e是原子
3)C =( a ,( b , c , d ) ) n=2,a 为原子,(b, c, d)为子表
6. GetHead{ ( ( ) ) }= ( ) .
7. GetTail{ ( ( ) ) }= ( ) .
(a, b)
§5.4 广义表的类型定义 ❖注意:( )和( ( ) )的区别
前者为空表,长度=0,深度=1; 后者长度=1,深度=2,表头、表尾均为( )
§5.5 广义表的存储结构
❖广义表的存储结构
§5.4 广义表的类型定义
❖广义表的特点
▪ 有深度
广义表的深度定义为广义表中括弧的最大重数
如: H = (d, (e,( )))深度为3 注意:(1)空表的深度为1;
表中的第一个元素)和指示表尾的表尾指针域(指向除 去原表头元素后的广义表)。
4)D=( A , B ,C )
n=3,3个元素都是子表
5)E=(a, E)
n=2,a 为原子,E为子表
D=(A,B,C)=(( ),(e),(a,(b,c,d))),共享表
E=(a,E)=(a,(a,E))= (a,(a,(a,…….))),E为递归表
§5.4 广义表的类型定义
❖试用图形表示下列广义表
§5.4 广义表的类型定义 ❖广义表的特点
▪ 可共享
广义表的元素可以为其他广义表所共享 A = ( a , B ) =( a , ( b , c , d ) )
§5.4 广义表的类型定义
❖例1:求下列广义表的长度
1)A =( )
n=0,因为A是空表
2)B = ( e )
n=1,表中元素e是原子
3)C =( a ,( b , c , d ) ) n=2,a 为原子,(b, c, d)为子表
6. GetHead{ ( ( ) ) }= ( ) .
7. GetTail{ ( ( ) ) }= ( ) .
(a, b)
§5.4 广义表的类型定义 ❖注意:( )和( ( ) )的区别
前者为空表,长度=0,深度=1; 后者长度=1,深度=2,表头、表尾均为( )
§5.5 广义表的存储结构
❖广义表的存储结构
§5.4 广义表的类型定义
❖广义表的特点
▪ 有深度
广义表的深度定义为广义表中括弧的最大重数
如: H = (d, (e,( )))深度为3 注意:(1)空表的深度为1;
第五部分数组和广义表教学课件
的 压
常数。下三角矩阵正好相反,它的主对角线上方均为常数, 如图所示。在大多数情况下,三角矩阵常数为零。
缩
存
a00 0 0 …….. 0
储
a10 a11 0 …….. 0
…………………. 0 an-10 an-11 an-12…….. an-1n-1
三角矩阵中的重复元素c可共享一个存储空间,其
矩
余的元素正好有n(n+1)/2个,因此,三角矩阵可压缩
ji =0,...,bi -1, i=1,2,..,n
}
数据关系:
R1={ 0
a a <
j1 … ji…,jn jk bk -1,
1j1
…
kji+1…njn
>| 且k i,
0 ji bi -2, i=2,...,n, 0 ji bi -2,}
二维数组的定义:
数 数据对象:
实
现
以行序为主序(低下标优先)
以列序为主序(高下标优先)
0
a00
按行序为主序存放
1
a01
数
…….
组 的
n-1 a0n-1
顺
n
a10
序 表 示
a00 a01 …….. a0n-1 a10 a11 …….. a0n-1
a11 ……..
和
a1n-1
实
………………….
……….
现
am-10am-11 …….. am-1n-1
定
10
11
1 n-2
义
A
=
m* n
...
... ...
...
a
a
数据结构课件PPT数组和广义表
T.mu=M.nu; T.nu=M.mu; T.tu=M.tu; if (T.tu)
{ q=1; for (col=1;col<=T.mu;++col) for(p=1;p<=M.tu;++p) if ( M.data[p].j==col ) { T.data[q].i=M.data[p].j; T.data[q].j=M.data[p].i; T.data[q].e=M.data[p].e; ++q; } }
(row) (col) (value)
[0] 1 4 22
[0] 1 5 91
[1] 1 7 15
[1] 2 2 11
[2] 2 2 11
[2] 3 6 28
[3] 2 [4] 3来自6 17 4 -6[3] 4 [4] 4
1 22 3 -6
[5] 4 6 39
[5] 6 2 17
[6] 5 1 91
[6] 6 4 39
cpot[1]=1 cpot[col]=cpot[col-1]+num[col-1]
稀疏矩阵的快速转置(算法5.2)
Status FastTransposeSMatrix(TSMatrix M,TSMatrix &T) { T.mu=M.nu; T.nu=M.mu; T.tu=M.tu;
if (T.tu) { for (col=1;col<=M.nu;++col) num[col]=0; for (t=1;t<=M.tu;++t) ++num[M.data[t].j]; cpot[1]=1; for ( col=2;col<=M.nu;++col) cpot[col]=cpot[col-1]+num[col-1]; for (p=1;p<=M.Tu;++p) { col=M.data[p].j; q=cpot[col]; T.data[q].i=M.data[p].j; T.data[q].j=M.data[p].i; T.data[q].e=M.data[p].e; ++cpot[col]; } }
{ q=1; for (col=1;col<=T.mu;++col) for(p=1;p<=M.tu;++p) if ( M.data[p].j==col ) { T.data[q].i=M.data[p].j; T.data[q].j=M.data[p].i; T.data[q].e=M.data[p].e; ++q; } }
(row) (col) (value)
[0] 1 4 22
[0] 1 5 91
[1] 1 7 15
[1] 2 2 11
[2] 2 2 11
[2] 3 6 28
[3] 2 [4] 3来自6 17 4 -6[3] 4 [4] 4
1 22 3 -6
[5] 4 6 39
[5] 6 2 17
[6] 5 1 91
[6] 6 4 39
cpot[1]=1 cpot[col]=cpot[col-1]+num[col-1]
稀疏矩阵的快速转置(算法5.2)
Status FastTransposeSMatrix(TSMatrix M,TSMatrix &T) { T.mu=M.nu; T.nu=M.mu; T.tu=M.tu;
if (T.tu) { for (col=1;col<=M.nu;++col) num[col]=0; for (t=1;t<=M.tu;++t) ++num[M.data[t].j]; cpot[1]=1; for ( col=2;col<=M.nu;++col) cpot[col]=cpot[col-1]+num[col-1]; for (p=1;p<=M.Tu;++p) { col=M.data[p].j; q=cpot[col]; T.data[q].i=M.data[p].j; T.data[q].j=M.data[p].i; T.data[q].e=M.data[p].e; ++cpot[col]; } }
大学数据结构课件--第5章 数组和广义表
a 32 a 33 a 34 0 0
a 43 a 44 a 45 0
a 54 a 55 a 56 a 65 a 66
5.3.2 稀疏矩阵
稀疏矩阵的存储:如何表示非零元素的位置信息 1. 三元组表:每个元素用一个三元组(i,j,v)来表示。 i j v
0 1 6 1 1 6 2 3 8 12 9
2
3 4 5 6 7 8
2
5.2 数组的顺序表示和实现
a00 a00 a10 a01 存储单元是一维结构,而数组是个多维结构 , …… …… 则用一组连续存储单元存放数组的数据元素就有 am-1,0 a0,n-1 个次序约定问题。 a01 a10
a11
……
a11
……
二维数组可有两种存储方式: am-1,1 a1,n-1
……
K=
i*n-i(i-1)/2+j-i n(n+1)/2
当 i≤j 当i>j
0 a11 ... a1n-1 ... ... ... ... 0 0 0 an-1n-1
当i ≤ j时,a[i][j]是非零元素, a[i][j]前面有i行,共有n+(n-1)+(n-2)+…(n-(i-1))
=i(n+[n-(i-1)])/2=i*n-i(i-1)/2个元素,a[i][j]前面有j列,共j-i个非零元素,
A m× n
( a10 a11 … a1,n-1 )
=
注:
( … … …… ) ( am-1,0 am-1,2 … am-1,n-1 ) ( ( ( (
① 数组中的元素都具有统一的类型; ② 数组元素的下标一般都具有固定的上界和下界,即数组一旦 被定义,它的维数和维界就不再发生改变; ③ 数组的基本操作简单:初始化、销毁、存取元素和修改元素值
数据结构(C)严蔚敏(数组与广义表)PPT课件
a00
Am×n
=
a10 ...
am-1,0
a01 a11 ...
am-1,1
a02 a12 ...
am-1,2
... a0,n-1
...
a1,n-1
... ...
... am-1,n-1
Data Structure
03.12.2020
Page 5
按行序为主序存放
0
1
n-1
Am×n
=
a00 a10 ...
a00
Am×n
=
a10 ...
am-1,0
a01 a11 ...
am-1,1
a02 a12 ...
am-1,2
... a0,n-1
...
a1,n-1
... ...
... am-1,n-1
列向量
a00
Am×n
=
a10 ...
am-1,0
a01 a11 ...
am-1,1
a02 a12 ...
初始条件:A 是 n 维数组,e 为元素变量,随后是 n 个下标值。 操作结果:若各下标不超界,则e赋值为所指定的A的元素值,并返回OK。
Assign(&A, e, index1, ..., indexn)
初始条件:A 是 n 维数组,e 为元素变量,随后是 n 个下标值。 操作结果:若下标不超界,则将 e 的值赋给A中指定下标的元素。
a00 a10 ……. am-1,1 a01 a11 …….. am-1,1 ………. a0,n-1 a1,n-1 …….. am-1 ,n-1
Page 7
按行序为主序存放
0
Am×n
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
if (!A.base) return ERROR;
数组基址指针
free(A.base); A.base = NULL; if !(A.bounds) return ERROR;
free(A.bounds); A.bounds=NULL;
各维长度保 存区指针 映保像存函区数指针ci
if !(A.constants) return ERROR; free(A.constants); A.constants=NULL; }
…
………………….
a2n
…
am1 am2 …….. amn
am1
am2
…
amn
§5.2 数组的顺序表示和实现
❖按列优先顺序存放
a11 a21
…
a11 a12 …….. a1n
am1 a12
a21 a22 …….. a2n
a22
…
………………….
am2
am1 am2 …….. amn
… a1n
a2n
一个n维数组可以看成是由若干个n-1维数组组成 的线性表。
§5.1 数组的定义
❖数组的抽象数据类型定义
ADT Array { 数据对象:D={aj1j2…jn | ji=0,…,bi-1, i=1,2,…,n,n(>0)称为数组
的维数,bi是数组第i维的长度,ji是数组元素的第i维下标, aj1…jn∈ElemSet } 数据关系:R={R1, R2,…, Rn} Ri={ < aj1…ji…jn , aj1…ji+1…jn > | 0≤jk≤bk-1, 1≤k≤n 且k≠i, 0≤ji≤bi-2, aj1…ji…jn , aj1…ji+1…jn∈D, i=1,2,…,n 基本操作:
LOC(aij)=LOC(a1,1)+[(j-1)*m+i-1)]*L 得:LOC(a32,58)=2048+[(58-1)*60+32-1)]*2=8950
§5.2 数组的顺序表示和实现
❖数组基本操作的实现(顺序存储表示)
# include<stdarg.h> //标准头文件
//提供宏va_start、va_arg和va_end,用于存取变长参数表
例1〖软考题〗:一个二维数组A,行下标的范围是1到6,列 下标的范围是0到7,每个数组元素用相邻的6个字节存储,存 储器按字节编址。那么,这个数组的体积是 288 个字节。
答: Volume=m*n*L=(6-1+1)*(7- 0 +1)*6=48*6=288
例2:已知二维数组Am,m按行存储的元素地址公式是: Loc(aij)= Loc(a11)+[(i-1)*m+(j-1)]*K , 按列存储的公式是?
A.bounds[i]=va_arg(ap,int); if(A.bounds[i]<0) return UNDERFLOW; ELEMTOTAL *=A.bounds[i]; }
§5.2 数组的顺序表示和实现
❖构造数组
va_end(ap); A.base=(ElemType *)malloc(elemtotal *sizeof(ElemType)); if(!A.base)exit(OVERFLOW); // 求映像函数的常数ci,存入A.constants[i-1], // i=1,…,dim A.constants=(int *)malloc(dim * sizeof(int)); if(!A.constants) exit (OVERFLOW); A.constants[dim-1]=1;
数组基址
其中 cn = L , ci-1 = bi × ci ,
前面若干元素占用 的地址字节总数
ci = bi+1×bi+2 ×…×bn×L
一个元 素长度
第i维长度
与所存元素个数有关的系 数,可用递推法求出
§5.2 数组的顺序表示和实现
❖n维数组的寻址计算公式
数组元素的存储位置是其下标的线性函数, 一旦确定了数组的各维的长度,ci 就是常数。由 于计算各元素存储位置的时间相等,所以存取数 组中任一元素的时间也相等。则称具有这一特点 的存储结构为随机存储结构。
DestroyArray(&A) 结果:销毁数组A
Value(A, &e, index1, ..., indexn) 条件:A是n维数组,e为元素变量,随后是n个下标值 结果:若各下标不超界,则e赋值为所指定的A的元素值,并返回OK
Assign(&A, e, index1, ..., indexn) 条件:同3) 结果:若下标不超界,则将e的值赋给所指定的A的元素,并返回OK
…
amn
§5.2 数组的顺序表示和实现
❖数组寻址公式
无论规定行优先或列优先,只要知道以下三要素 便可随时求出任一元素的地址(这样数组中的任 一元素便可以随机存取!)
①开始结点的存放地址(即基地址) ②维数和每维的上、下界; ③每个数组元素所占用的单元数
§5.2 数组的顺序表示和实现
❖数组寻址公式
# define MAX_ARRAY_DIM 8 //数组维数的最大值
typedef struct{ ElemType * base; //数组元素基址,由InitArray 分配
int dim; //数组维数
int *bounds; //数组维界基址,由InitArray分配
int *constants; //数组映像函数常量基址,由InitArray分配
武汉科技大学
Wuhan University of Science and Technology
张凯 计算机学院 软件工程系
2011年3月12日
§5.1 数组的定义
❖数组的特点
一维数组的特点: 1个下标,ai 是ai+1的直接前驱
二维数组的特点: 2个下标,每个元素ai,j受到两个关系(行关 系和列关系)的约束:
}Array;
即Ci信息保存区
§5.2 数组的顺序表示和实现
❖构造数组
Status InitArray(Array &A, int dim, …){ //若维数dim和各维长度合法,则构造相应的数组A
if( dim<1|| dim>MAX_ARRAY_DIM ) return ERROR; A.dim=dim; A.bounds=(int *)malloc(dim *sizeof(int)); if (!A.bounds) exit(OVERFLOW); //若各维长度合法,存入A.bounds,求元素总数elemtotal elemtotal=1; va_start(ap,dim); //ap为va_list类型,是存放变长参数表信息的数组 for( i=0; i<dim; ++i ){
§5.2 数组的顺序表示和实现
❖计算元素在数组中相对地址
Status Locate(Array A, va_list ap, int &off){ //若ap指示的各下标值合法,求出该元素在A中相对地址off
off=0; for( i=0; i<A.dim; ++i ){
ind = va_arg( ap,int ); if( ind<0 || ind>=A.bounds[i] )
▪ 在C语言中,数组下标的下界为0,则数组中任意 一元素A[i]的寻址公式为: Loc(i)=Loc(0)+i×L 0≤i≤UB-1
§5.2 数组的顺序表示和实现
❖二维数组寻址公式
▪ 若设二维数组A[m][n],m、n分别表示数组的行和 列,用Loc(i,j)表示数组元素A[i][j]的地址, 按行优先顺序存放则寻址公式为: Loc(i,j) = Loc(0,0) + (n×i+j)×L 按列优先存储时的寻址方式为: Loc(i,j) = Loc(0,0) + (m×j+i)×L
return OVERFLOW; off+=A.constants[i]*ind; // } return OK; }
§5.2 数组的顺序表示和实现
❖A的元素值赋给变量e
Status Value(Array A, ElemType &e,…){ //A是n维数组,e为元素变量,随后是n下标值。 //若各下标不超界,则e赋值为所指定的A的元素值
Loc(aij)=Loc(a11)+[(j-1)*m+(i-1)]*K (尽管是方阵,但公式仍不同)
例3:〖00年计算机系考研题〗设数组a[1…60, 1…70]的基地址 为2048,每个元素占2个存储单元,若以列序为主序顺序存储, 则元素a[32,58]的存储地址为 8950 。
答:请注意审题!利用列优先通式:
§5.2 数组的顺序表示和实现
❖例:行序为主序的存储映象
a0,0 a0,1 a0,2 a1,0 a1,1 a1,2
a0,0 a0,1 a0,2 a1,0 a1,1 a1,2
L
LOC(i, j) = LOC(0,0) + (b2×i+j)×L
称为基地址或基址
2维数组的长度
§5.2 数组的顺序表示和实现 ❖三维数组寻址公式
n
LOC[j1,j2,…,jn] = LOC[0,0,…,0] + ci ji i 1
其中 cn = L , ci-1 = bi × ci , ci = bi+1×bi+2 ×…×bn×L
上式称为n维数组的映象函数。
§5.2 数组的顺序表示和实现
❖n维数组的寻址计算公式
n
LOC[j1,j2,…,jn] = LOC[0,0,…,0] + ci ji i 1