例1〖軟考題〗:一個(gè)二維數(shù)組A,行下標(biāo)的范圍是1到6,列下標(biāo)的范圍是0到7,每個(gè)數(shù)組元素用相鄰的6個(gè)字節(jié)存儲(chǔ),存儲(chǔ)器按字節(jié)編址。那么,這個(gè)數(shù)組的體積是__個(gè)字節(jié)。
答: Volume=m*n*L=(6-1+1)*(7- 0 +1)*6=48*6=288
例2:已知二維數(shù)組Am,n按行存儲(chǔ)的元素地址公式是: Loc(aij)= Loc(a11)+[(i-1)*n+(j-1)]*K , 按列存儲(chǔ)的公式是?
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:〖某考研題〗設(shè)數(shù)組a[1…60, 1…70]的基地址為2048,每個(gè)元素占2個(gè)存儲(chǔ)單元,若以列序?yàn)橹餍蝽樞虼鎯?chǔ),則元素a[32,58]的存儲(chǔ)地址為 __.
利用列優(yōu)先通式:
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 /*一個(gè)足夠大的數(shù)*/
typedef struct
{ int i,j; /*非零元素的行、列*/
datatype v; /*非零元素值*/
}SPNode; /*三元組類型*/2
typedef struct
{ int mu,nu,tu; /*矩陣的行、列及非零元素的個(gè)數(shù)*/
SPNode data[SMAX]; /*三元組表*/
} SPMatrix; /*三元組表的存儲(chǔ)類型*/
轉(zhuǎn)置算法:
void TransM1 (SPMatrix *A)
{ SPMatrix *B;
int p,q,col;
B=malloc(sizeof(SPMatrix)); /*申請(qǐng)
存儲(chǔ)空間*/
B->mu=A->nu; B->nu=A->mu; B->tu=A->tu;
/*稀疏矩陣的行、列、元素個(gè)數(shù)*/
if (B->tu>0) /*有非零元素則轉(zhuǎn)換*/
{ q=0;
for (col=1; col<=(A->nu); col++) /*按A的列序轉(zhuǎn)換*/
for (p=1; p<= (A->tu); p++) /*掃描整個(gè)三元組表*/
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; /*返回的是轉(zhuǎn)置矩陣的指針*/
} /*TransM1*/
改進(jìn)的轉(zhuǎn)置算法:
SPMatrix * TransM2 (SPMatrix *A)
{ SPMatrix *B;
int i,j,k;
int num[n+1],cpot[n+1];
B=malloc(sizeof(SPMatrix)); /*申請(qǐng)
存儲(chǔ)空間*/
B->mu=A->nu; B->nu=A->mu; B->tu=A->tu;
/*稀疏矩陣的行、列、元素個(gè)數(shù)*/
if (B->tu>0) /*有非零元素則轉(zhuǎn)換*/
{ for (i=1;i<=A->nu;i++) num[i]=0;
for (i=1;i<=A->tu;i++) /*求矩陣A中每一列非零元素的個(gè)數(shù)*/
{ j= A->data[i].j;
num[j]++;
}
cpot[1]=1; /*求矩陣A中每一列第一個(gè)非零元素在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; /*當(dāng)前三元組的列號(hào)*/
k=cpot[j]; /*當(dāng)前三元組在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; /*返回的是轉(zhuǎn)置矩陣的指針*/
} /*TransM2*/