數組與廣義表
例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*/