数据结构复习-数组
1.对于数组来说在他们的创建之初他们的存储空间就确定了,所以对于一个创建完成的数组就只有存取元素和修改元素的操作,而并没有添加或者修改元素的操作。另外对于一个n维数组来说,可以看成一个以n-1维数组为元素的一维数组。
2.数组的四大操作(1) InitArray(&a,n,bound1,bound2,.....)创建操作(2)destory(&a)销毁操作a
(3)value(a,&e,index1,index2,.......)取值操作(4)Assign(&a,e,,index1,index2,.......)赋值操作
3.数组的两种存储结构:说明:计算机内所有存储单元的是连续排列的,因此必须按照某种次序来讲多维的数组存放到一维的地址空间中
(1)以行为主序、行优先:就是从右到左,从右上角到左下角,第i行的最后一个数据排在第i+1行的第一个数据之前,C语言就是行为主序。
(2)以列为主序、列优先:就是从左到右,从左上角到右下角,第i列的最后一个数据排在第i+1列的第一个数据之前,FORTRAN语言就是列为主序。
因为数组采用了这两种存储方式以后我们就可以通过函数表达式来表示每一个元素之间的关系,例如对于二维数组:LOC(aij)=Loc(a00)+(∑mi+j)*L (其中mi为每一维的元素个数,L为每一个元素所占的地址空间) 又例如三维数组(按页/行/列存放):LOC(aijk)=LOC(a000)+(n*m*i+m*j+k)*L ,因此我们只要知道了一个数组的基址我们就可以查找到这个数组的所有元素,而且对于每一个元素时间是相同的,所以数组的存储结构是一种随机存储结构。
4.数组的顺序存储表示和实现:
#incluse <stdarg.h>//加了以后可以创建动态数组
#define MAX_ARRAY_DIM 8 //假设维数的最大值
typedef struct {
ElemType *base;//数组元素基址
int dim; //数组维数
int *bounds; //数组维界基址
int *constants;//数组映象函数基址 constants计算方法说明:四维数组A[j][m][k][l] A.constants[3]=1 A.constants[2]=l+1 A.constants[1]=(k+1)*(l+1) A.constants[0]=(k+1)*(l+1)*(m+1)
}Array;
5.数组的矩阵压缩(1)特殊矩阵:特点Aij=Aji ,让每两个对称的元素共享一个存储空间,能节约近一半的存储空间。不失一般性,按“行优先顺序”存储主对角线(包括对角线)以下的元素。所以存储该矩阵只需要存储n(n+1)/2个元素。
怎样确定矩阵元素地址空间里面的位置?假如元素Aij在它之前就有i行和j个元素(因为有 0下标)所以当i>j是即元素在下矩阵那么他的地址计算方法就是k=i(i+1)/2+j 所以0<k<n(n+1)/2 反之当i<=j时,k=j(j+1)/2+i 所以0<k<n(n+1)/2。则可令I=Max(i,j) J=Min(i,j)则k=I(I+1)/2+J 0<k<n(n+1)/2。因此aij的地址可用下列式计算:LOC(aij)=LOC(sa[k]) LOC(sa[0])+k*L=LOC(sa[0])+[I*(I+1)/2+J]*L
故称sa[n(n+1)/2]为n阶对称矩阵A的压缩存储
(2)三角矩阵:分为上三角和下三角两种:除了这两个三角上有元素以外其他元素都为相同的常数,一次可以用sa[0--n(n+1)/2-1]来存储三角区的元素,而最后一个常数就存储在最后一个单元sa[n(n+1)/2]中
(3)对角矩阵:即除了对角线以及主对角线两侧的若干条对角线以外其他元素都为常数。
(4)压缩矩阵:当一个非0元的比率远远小于0元的比率(非0元/总元素<=0.05)时,我们就可以通过压缩矩阵来存储一个矩阵(三元顺序表)。
三元顺序表的定义
#define MAXSIZE 12500//非零元个数最大值
typedef struct {
int i, j;//非零元行、列下标
Elemtype e;
}Triple;
typedef struct {
Triple data[MAXSIZE+1];//非零元三元组表,data[0]未用,用来存储矩阵的相关信息了
int mu,nu,tu;//矩阵的行数、列数和非零元个数
}TSMatrix;
矩阵在计算机存储结构上的运算-转置:一个n*m的矩阵到m*n的矩阵过程
其基本思想是:对A中的每一列 col(1≦col≦n),通过从头至尾扫描三元组a.data,找出所有列号等于col的那些三元组,将它们的行号和列号互换后依次放入b.data中,即可得到B的按行优先的压缩存储表示。
(5)行逻辑连接的顺序表:有时为了方便某些矩阵运算,需知道稀疏矩阵中每行的非零元素在三元组表中的起始位置。#define MAXRC 100//最大行数
typedef struct {
Triple data[MAXSIZE+1];
int rpos[MAXRC+ 1];
int mu,nu,tu;
}RLSMatrix;