第五章数组和广义表
第五章 数组和广义表
5.1数组的定义 52数组的顺序表示和实现 53矩阵的压缩存储
5.1 数组的定义 5.2 数组的顺序表示和实现 5.3 矩阵的压缩存储
0一维数组具有线性表的结构,但操作简单,一般不 进行插入和删除操作,只定义给定下标读取元素和 修改元素的操作 0二维数组中,每个数据元素对应一对数组下标,在 行方向上和列方向上都存在一个线性关系,即存在 两个前驱(前件)和两个后继(后件)。也可看作 是以线性表为数据元素的线性表 n维数组中,每个数据元素对应n个下标,受n个关 系的制约,其中任一个关系都是线性关系。可看作 是数据元素为n-1维数组的一维数组。 0因此,多维数组和广义表是对线性表的扩展:线性 表中的数据元素本身又是一个多层次的线性表
一维数组具有线性表的结构,但操作简单,一般不 进行插入和删除操作,只定义给定下标读取元素和 修改元素的操作 二维数组中,每个数据元素对应一对数组下标,在 行方向上和列方向上都存在一个线性关系,即存在 两个前驱(前件)和两个后继(后件)。也可看作 是以线性表为数据元素的线性表。 n维数组中,每个数据元素对应n个下标,受n个关 系的制约,其中任一个关系都是线性关系。可看作 是数据元素为n-1维数组的一维数组。 因此,多维数组和广义表是对线性表的扩展:线性 表中的数据元素本身又是一个多层次的线性表
对于多维数组,有两种存储方式: 是以行为主序(或先行后列)的顺序存放,如 BASIC、 PASCAL、C等程序设计语言中用的是以行为 主的顺序分配,即一行分配完了接着分配下一行。 另一种是以列为主序(先列后行)的顺序存放, 如 FORTRAN语言中,用的是以列为主序的分配顺序 即一列一列地分配。 不论按何种方式存储,只要确定了数组的首地址以 及每个数组元素所占用的单元数,就可以将数组元素的 存储地址表示为其下标的线性函数。设有m×n二维数组 mn 以“以行为主序”的分配为例,按照元素的下标确 定其地址的计算方法如下
对于多维数组,有两种存储方式: 一是以行为主序(或先行后列)的顺序存放,如 BASIC、PASCAL、C等程序设计语言中用的是以行为 主的顺序分配,即一行分配完了接着分配下一行。 另一种是以列为主序(先列后行)的顺序存放, 如FORTRAN语言中,用的是以列为主序的分配顺序, 即一列一列地分配。 不论按何种方式存储,只要确定了数组的首地址以 及每个数组元素所占用的单元数,就可以将数组元素的 存储地址表示为其下标的线性函数。设有m×n二维数组 Amn,以“以行为主序”的分配为例,按照元素的下标确 定其地址的计算方法如下
设数组的基址为LOC(a1),每个数组元素占据L个地 址单元,计算a:的物理地址的函数为: LOC(ai)=LOC(a1)+((-1)*n+j-1)*L 同理,对于三维数组A-n,即m×n×p数组,对于数 组元素a1其物理地址为: LOC(aik=loc(a1+((i-1)*n*p+g-1)*p+k-1))L 注意: 在C语言中,数组中每一维的下界定义为0,则 LOC(aii=LOC(aoo)+(i*n+j)*L
设数组的基址为LOC(a11),每个数组元素占据L个地 址单元,计算aij的物理地址的函数为: LOC(aij) = LOC(a11) + ( (i-1)*n + j-1 ) * L 同理,对于三维数组Amnp,即m×n×p数组,对于数 组元素aijk其物理地址为: LOC(aijk)=LOC(a111)+( ( i-1) *n*p+ (j-1)*p +k-1) )*L 注意: 在C语言中,数组中每一维的下界定 义为0,则: LOC(aij) = LOC(a00) + ( i*n + j ) * L
51数组的定义 ADT Array 数据对象D 具有相同类型的数据元素构成的有序集合。 数据关系R 对于n维数组,其每一个元素均位于n 个向量中,每个元素最多具有n个前驱结点 和n个后继结点
5.1 数组的定义 ADT Array{ 数据对象D: 具有相同类型的数据元素构成的有序集合。 数据关系R: 对于n维数组,其每一个元素均位于n 个向量中,每个元素最多具有n个前驱结点 和n个后继结点
基本操作: InitArray (&A,n, index1,-, index) 新建一个n维数组A,其每维的大小由 index1, index2, index确定。 DestroyArray (&A) 销毁数组A,收回其占用的空间。 Value(A, &x, index1, a,index) 取出A[ indexlltindex2] index数组元素的值存入变量x中。 Assign(&A, e, index1,a,index) 将表达式e的值赋给数组元素 A[index1index2…… index] JADT Array
基本操作: InitArray(&A,n,index1,…, indexn) 新建一个n维数组A,其每维的大小由index1,index2,……,indexn确定。 DestroyArray(&A) 销毁数组A,收回其占用的空间。 Value(A,&x,index1,…,indexn) 取出A[index1][index2]……[indexn]数组元素的值存入变量x中。 Assign(&A,e,index1,…,indexn) 将表达式e的值赋给数组元素A[index1][index2]……[indexn] }ADT Array
52数组的顺序表示 0多维数组用一维的存储单元存放需约定次序。 PASCALI和c语言是以行序为主序, FORTRAN以 列序为主序。 0给定维数和各维长度,数组的存储空间确定。 0二维数组中任一元素a的存储地址 aLoc()=Loc(0,0)+(b2+1+j)L n维数组:教材p93 Loc(j1j2,…jn)=Loc(0,0,…,0)+∑cj 口其中cnL,c1=bc1n
5.2 数组的顺序表示 多维数组用一维的存储单元存放需约定次序。 PASCAL和C语言是以行序为主序,FORTRAN以 列序为主序。 给定维数和各维长度,数组的存储空间确定。 二维数组中任一元素aij的存储地址: Loc(i,j)=Loc(0,0)+(b2*i+j)*L n维数组:教材p93 Loc(j1,j2,…,jn)=Loc(0,0,…,0)+ ∑ci j i 其中 cn=L, ci-1=bi *ci , 1<i≤n
类型定义 Include # define MAX ARRAY Din8∥数组维数最大值 typedef structI Elem Type * base;数组元素基址 int dim. ∥数组维数 int *bounds; J数组维界基址 int *constants ∥数组映象函数常量基址 ARray
类型定义 #include #define MAX_ARRAY_DIM 8 //数组维数最大值 typedef struct{ ElemType *base; //数组元素基址 int dim; //数组维数 int *bounds; //数组维界基址 int *constants; //数组映象函数常量基址 }Array;
53矩阵的压缩存储 0矩阵一般可用二维数组实现,特殊矩阵采用压缩存储。 0压缩存储:为多个值相同的元只分配一个存储空间, 对零元不分配空间。 0特殊矩阵:值相同的元素或者零元素在矩阵中的分布 有一定规律 0稀疏矩阵:非零元较零元少,且分布没有一定规律的 矩阵
5.3 矩阵的压缩存储 矩阵一般可用二维数组实现,特殊矩阵采用压缩存储。 压缩存储:为多个值相同的元只分配一个存储空间, 对零元不分配空间。 特殊矩阵:值相同的元素或者零元素在矩阵中的分布 有一定规律 稀疏矩阵:非零元较零元少,且分布没有一定规律的 矩阵