数组
按一定格式排列起来的,具有相同类型的数据元素集合
定义后维数和维界不再改变(结构固定) 且一般不做插入和删除操作,因此一般采用顺序存储结构
-
一维数组:线性表中的数据元素为非结构的简单元素
- 线性结构(定长线性表)
- 声明格式:数据类型 变量名称[长度];例:int a[5];
-
二维数组:一维数组中的数据元素又是一位数组结构
-
逻辑结构:
-
线性结构(定长的线性表):该线性表中的每个元素(行/列)也是一个定长的线性表
-
非线性结构:每一个元素既在一个行表中又在一个列表中
-
-
声明格式: 数据类型 变量名称[行数][列数]
-
定义:
typedef int array2[5][8]; 等价于 typedef int array1[8]; typedef array1 array2[5];
-
-
三维数组:二维数组中的每个元素是一个一维数组
-
n维数组:n-1维数组中的每个元素是一个一维数组
抽象数据类型定义
基本操作:
lnitArray (&A,n,bound1, ...,boundn)
DestroyArray(&A)
Value(A,&e,index1,...,indexn)
Assign(A,&e,index1,...,indexn)
}ADT Array
数组的顺序存储
数组可以是多维的,但是存储数据元素的内存单元地址是一维的
因此在存储数组结构之前,需要解决将多维关系映射到一维关系的问题
一维数组
L为每个元素占用字节数
二维数组A(m,n)
-
以行序为主序(低下标优先):BASIC,COBOL,PASCAL,C,JAVA
位置:LOC(i,j)=LOC(0,0)+(i*n+j)*L
通常矩阵用二维数组存储:运算简单、可随机存取,存储密度为1
矩阵的压缩存储:为多个相同的非零元素只分配一个存储空间,零元素不分配存储空间
-
对称矩阵:在n*n矩阵中,满足aij=aji(i>=1,j<=n)
只存储上(下)三角包括主对角线的元素,共占用n*(n+1)/2个元素空间
对应存放在一维数组中的下标为aij前面的元素个数
-
三角矩阵:对角线以下(上)的元素不包括对角线全部为常数c
重复元素c共享一个存储单元,共占用n*(n+1)/2+1个元素空间
-
对角矩阵:所有非零元素都集中在以主对角线为中心的区域中,其余都是0
例:五对角矩阵(五条非零对角线)
按对角线存储:
-
稀疏矩阵:非零元素的个数<=5%
用三元组来存储(i,j,value)
M由{(1,2,12),(1,3,9),(3,1,-3),(3,6,14),(4,3,24),(5,2,18),(6,1,15),(6,4,-7)}和矩阵维数(6,7)唯一确定
三元组顺序表/有序的双下标法:通常用第1行表示行数、列数、非零元素个数
- 优:非零元素在表中按行序有序存储,便于进行按行进行行处理的矩阵运算
- 缺:不能随机存取,需从头开始查找
0 6 7 8 1 1 2 12 2 1 3 9 3 3 1 -3 4 3 6 14 5 4 3 24 6 5 2 18 7 6 1 15 8 6 4 -7
稀疏矩阵的链式存储结构:灵活插入、删除元素
十字链表:
矩阵的每个非零元素有一个结点表示:(row,col,value)+right(用于链接同一行的下一个非零元素)+down(用于链接同一列的下一个非零元素)
-
-
以列序为主序(高下标优先):FORTRAN
三维数组a[m1][m2][m3]
按页/行/列存放(页优先)
位置:LOC(i1,i2,i3)=a+i1*m2*m3+i2*m3+i3
n维数组
各维元素个数为m1, m2, m3, ..., mn
下标为i1,i2,i3,...,in 的数组元素的存储位置:
LOC(i1,i2,…,in ) = a + i1* m2* m3*...*mn+i2* m3* m4*…* mn+...…+ i(n-1) * mn