转载自 重庆邮电大学计算机学院 PPT
数据元素可为结构类型的线性表
数组是由一组具有相同特征的数据元素的组成的.
如果数组元素只含有一个下标,则称为以为数组.若把数据元素的下标顺序变换成线性表的序号,则一维数组就是一个线性表.
如果每个元素有两个下标,则称为二维数组,一个 m x n的矩阵就是一个二维数组.
ADT Array{
数据对象:
ji = 0,…,bi-1, i=1,2,…,n
D = {aj1j2…jn | n称为数组的维数,
bi是数组第i维的长度,
ji是数组元素的第i维下标,
aj1j2…jn ElemSet
R = {R1, R2, …, Rn} //每个元素受到n个关系的约束
Ri = {
0 jk bk-1, 1 k n 且 k i
0 ji bi-2,
aj1…ji…jn, aj1,,,ji+1…jn D, i = 2,…n}
P:
InitArray(&A, n, bound1, …, boundn)
DestoryArray(&A)
Value(A, &e, index1, …, indexn) //取出元素值
Assign(&A, e, index1, …, indexn) //给元素赋值
}ADT Array
数组中各元素都具有统一的类型
d维数组的非边界元素具有d个直接前趋和d个直接后继数组维数确定后,数据元素个数和元素之间的关系不再发生改变,适合于顺序存储
每组有定义的下标都存在一个与其相对应的值
数组通常采用顺序存储方式来实现
n维数组的数据元素的存储问题
必须约定存放次序
因为存储单元是一维的,而数组是多维的
存储方案
以行序为主序,如C, Pascal, Basic等语言采用
以列序为主序,如Fortran语言采用
数组一旦定义了维数和各维长度,便可为其分配存储空间
只要给出一组下标便可求得相应元素的存储位置
n维数组为例
如 int A[b1,b2 ,…,bn],共占用b1*b2 *…*bn个整型存储单元
行序为主序的存储方式
给定下标值j1, j2,…, jn , 求对应元素的存储位置
Loc(j1, j2,…, jn) = Loc(0, 0,…,0) + L *
(b2* …..*bn* j1 +
b3* …*bn* j2 +
… …
bn* jn-1 +
jn )
void TransposeMatrix(int T[][], int M[][], mu, nu) {
//矩阵转置
for (col = 1; col <= nu; ++col)
for (row = 1; row <= mu; ++row)
T[col][row] = M[row][col];
}
void ProductMartrix(int Q[][], int M[][], int N[][], m1, n1, n2) {
//矩阵相乘 Qm1*n2=Mm1*n1*Nm2*n2, n1=m2
for (i = 1; i <= m1; ++i)
for (j = 1; j <= n2; ++j) {
Q[i][j] = 0;
for (k = 1; k <= n1; ++k)
Q[i][j] += M[i][k] * N[k][j];
}
}
#define MAXSIZE 12500 //假设非零元素个数的最大值
typedef struct{
int i, j; //行号,列号
ElemType e;//元素值
}Triple; //三元组
typedef struct{
Triple data[MAXSIZE + 1]; //非零元素三元组表,data[0]未用
int mu, nu, tu; //行数,列数,非零元素个数
}TSMatrix; //三元组顺序表
TSMatrix M; //矩阵M
Status TransposeSMatrix(TSMatrix M, TSMatrix &T) {
T.mu = M.nu; T.nu = M.mu; T.tu = M.tu;
if (T.tu) { //有非零元素,转置
q = 1; //非零元素计数器
for (col = 1; col <= M.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;
}
}
return OK;
}