您的位置: 网站首页 > 程序开发 > 数据结构 > 第4章 串、数组和广义表 > 【4.6 数组的顺序表示和实现】

4.6 数组的顺序表示和实现

 

4.6  数组的顺序表示和实现

1.数组存储的排列顺序

数组存储在一片相邻的存储单元里,以二维数组为例,当A[m][n]按“行优先顺序”存储时,其线性排列次序为:

a0,0a0,1,…,a0,n-1a1,0a1,1,…,a1,n-1,…,am-1,0am-1,1,…,am-1,n-1

元素ai,j的地址计算为(假设每个单元占k个地址单元):

LOC(ai,j) = LOC(a0,0)+(i*n+j)*k

按“列优先顺序”存储时,其线性排列次序为:

a0,0a1,0,…,am-1,0a0,1a1,1,…,am-1,1,…,a0,n-1a1,n-1,…,am-1,n-1

元素ai, j的地址计算为(假设每个单元占k个地址单元):

LOC(ai,j) = LOC(a0,0)+(j*m+i)*k

【例4-1对于二维数组A[0..2][0..5],当按“行优先顺序”存储时,元素A[2][3]是第几个元素?当按“列优先顺序”存储时,元素A[2][4]是第几个元素?

解:这里m=3n=6,当按“行优先顺序”存储时,元素A[2][3]的序号(i=2j=3):

1+i*n+j=1+2*6+3=16

当按“列优先顺序”存储时,元素A[2][4]的序号(i=2j=4):

1+j*m+i=1+4*3+2=15

2.数组的基本运算

下面以二维数组Am×n即矩阵来讨论多维数组的基本运算。

1)转置矩阵运算算法。

转置是一种最简单的矩阵运算,对于一个m×n的矩阵Am×n,其转置矩阵是一个n×m的矩阵Bn×m,且B[i][j]=A[j][i]0i<m0j<n)对应的算法如下:

void TransMat(MatType A,MatType B,int m,int n)

{

int i,j;

    for(i=0;i<m;i++)

        for(j=0;j<n;j++)

              B[j][i]=A[i][j];

}  

2)矩阵相加运算算法。

两个大小均为m×n的矩阵的元素相加后得到一个m×n的矩阵C,其运算是把AB的相同位置的元素相加得到C,即C[i][j]=A[i][j]+B[i][j]0i<m0j<n)对应的算法如下:

void AddMat(MatType A,MatType B,MatType C,int m,int n)

{

int i,j;

for(i=0;i<m;i++)

    for(j=0;j<n;j++)

         C[i][j]=A[i][j]+B[i][j];   

}

3)矩阵相乘运算算法。

矩阵相乘是另一种常用的矩阵运算,其方法是我们所熟悉的,设C=A×B,其中Am×n矩阵,Bn×k矩阵,则Cm×k矩阵,对应的算法如下:

void MutMat(MatType A,MatType B,MatType C,int m,int n,int k)

{

   int i,j,l;

   for(i=0;i<m;i++)

   for (j=0;j<k;j++)

   {

      C[i][j]=0;

      for(l=0;l<n;l++)

         C[i][j]=C[i][j]+A[i][l]*B[l][j];

   }

}

4)输出矩阵运算算法。

以行列方式显示矩阵的所有元素。

void DispMat(MatType A)

{

   int i,j;

   for(i=0;i<n;i++)

   {

      for(j=0;j<n;j++)

         cout<<setw(4)<<A[i][j];

         cout << endl;

   }

}