例1〖软考题〗:一个二维数组A,行下标的范围是1到6,列下标的范围是0到7,每个数组元素用相邻的6个字节存储,存储器按字节编址。那么,这个数组的体积是__个字节。
答: Volume=m*n*L=(6-1+1)*(7- 0 +1)*6=48*6=288
例2:已知二维数组Am,n按行存储的元素地址公式是: Loc(aij)= Loc(a11)+[(i-1)*n+(j-1)]*K , 按列存储的公式是?
Loc(aij)=Loc(a11)+[(j-1)*m+(i-1)]*K (尽管是方阵,但公式仍不同)
Loc(aij)=Loc(a00)+(i*n+j)*K;
Loc(aij)=Loc(a00)+(j*m+i)*K;
例3:〖某考研题〗设数组a[1…60, 1…70]的基地址为2048,每个元素占2个存储单元,若以列序为主序顺序存储,则元素a[32,58]的存储地址为 __.
利用列优先通式:
LOC(aij)=LOC(ac1,c2)+[(j-c2)*(d1-c1+1)+i-c1)]*L
得:LOC(a32,58)=2048+[(58-1)*(60-1+1)+32-1)]*2=8950
。
稀疏矩阵:
define SMAX 1024 /*一个足够大的数*/
typedef struct
{ int i,j; /*非零元素的行、列*/
datatype v; /*非零元素值*/
}SPNode; /*三元组类型*/2
typedef struct
{ int mu,nu,tu; /*矩阵的行、列及非零元素的个数*/
SPNode data[SMAX]; /*三元组表*/
} SPMatrix; /*三元组表的存储类型*/
转置算法:
void TransM1 (SPMatrix *A)
{ SPMatrix *B;
int p,q,col;
B=malloc(sizeof(SPMatrix)); /*申请
存储空间*/
B->mu=A->nu; B->nu=A->mu; B->tu=A->tu;
/*稀疏矩阵的行、列、元素个数*/
if (B->tu>0) /*有非零元素则转换*/
{ q=0;
for (col=1; col<=(A->nu); col++) /*按A的列序转换*/
for (p=1; p<= (A->tu); p++) /*扫描整个三元组表*/
if (A->data[p].j==col )
{ B->data[q].i= A->data[p].j ;
B->data[q].j= A->data[p].i ;
B->data[q].v= A->data[p].v;
q++; }/*if*/
} /*if(B->tu>0)*/
return B; /*返回的是转置矩阵的指针*/
} /*TransM1*/
改进的转置算法:
SPMatrix * TransM2 (SPMatrix *A)
{ SPMatrix *B;
int i,j,k;
int num[n+1],cpot[n+1];
B=malloc(sizeof(SPMatrix)); /*申请
存储空间*/
B->mu=A->nu; B->nu=A->mu; B->tu=A->tu;
/*稀疏矩阵的行、列、元素个数*/
if (B->tu>0) /*有非零元素则转换*/
{ for (i=1;i<=A->nu;i++) num[i]=0;
for (i=1;i<=A->tu;i++) /*求矩阵A中每一列非零元素的个数*/
{ j= A->data[i].j;
num[j]++;
}
cpot[1]=1; /*求矩阵A中每一列第一个非零元素在B.data中的位置*/
for (i=2;i<=A->nu;i++)
cpot[i]= cpot[i-1]+num[i-1];
for (i=1; i<= (A->tu); i++) /*扫描三元组表*/
{ j=A->data[i].j; /*当前三元组的列号*/
k=cpot[j]; /*当前三元组在B.data中的位置*/
B->data[k].i= A->data[i].j ;
B->data[k].j= A->data[i].i ;
B->data[k].v= A->data[i].v;
cpot[j]++;
} /*for i */
} /*if (B->tu>0)*/
return B; /*返回的是转置矩阵的指针*/
} /*TransM2*/