一个数据结构矩阵地址问题

设矩阵A(aij,1<=i,j<=10)的元素满足:
aij=/0(i>=j,1<=i,j<=10)
aij=0(i<j,1<=i,j<=10)
现将A的所有非0元素以行序为主序存放在首地址为2000的存储区域中,每个元素占4个单元,则元素【9,5】的首地址为?
答案是2160
有人知道怎么解的吗?麻烦讲得详细些,谢谢!!!

//scanf()中变量 要加 地址符 & ; E[m][n] ->E[i][j] C[k]=-1
#include "stdio.h"
#define m 6
#define n 8
#define max 50
// 稀疏矩阵存储在数组中
void creatematrix(int A[m][n],int B[50])
{
int i,j,k=0;
for(i=0;i<m;i++)
for(j=0;j<n;j++)
if (A[i][j]!=0)
{
B[k]=i;
k++;
B[k]=j;
k++;
B[k]=A[i][j];
k++;
}
B[k]=-1;
}
//两个稀疏矩阵存储到两个数组中后相加存储到另一个数组中
void matrixadd(int A[max],int B[max],int C[max])
{
int i=0,j=0,k=0;
while (A[i]!=-1&&B[j]!=-1)
{
if (A[i]==B[j])
{
if (A[i+1]==B[j+1])
{
C[k]=A[i];
C[k+1]=A[i+1];
C[k+2]=A[i+2]+B[j+2];
k=k+3;
i=i+3;
j=j+3;
}
else if (A[i+1]<B[j+1])
{
C[k]=A[i];
C[k+1]=A[i+1];
C[k+2]=A[i+2];
k=k+3;
i=i+3;
}
else
{
C[k]=B[j];
C[k+1]=B[j+1];
C[k+2]=B[j+2];
k=k+3;
j=j+3;
}
}
else if (A[i]<B[j])
{
C[k]=A[i];
C[k+1]=A[i+1];
C[k+2]=A[i+2]+B[j+2];
k=k+3;
i=i+3;
}
else
{
C[k]=B[j];
C[k+1]=B[j+1];
C[k+2]=B[j+2];
k=k+3;
j=j+3;
}
}
if (A[i]==-1)
{
while (B[j]!=-1)
{
C[k]=B[j];
C[k+1]=B[j+1];
C[k+2]=B[j+2];
k=k+3;
j=j+3;
}
}
else
{
while(A[i]!=-1)
{
C[k]=A[i];
C[k+1]=A[i+1];
C[k+2]=A[i+2];
k=k+3;
i=i+3;
}

}
C[k]=-1;

}
//主函数
void main()
{
int E[m][n],F[m][n],A[max],B[max],C[max];
int i,j,k;
printf("输入稀疏矩阵E(%d,%d):\n",m,n);
for(i=0;i<m;i++) //输入稀疏矩阵E
{
for(j=0;j<n;j++)
{
scanf("%d",&E[i][j]);
}
}
printf("输入稀疏矩阵F(%d,%d):\n",m,n);
for(i=0;i<m;i++)//输入稀疏矩阵F
{
for(j=0;j<n;j++)
{
scanf("%d",&F[i][j]);
}
}
creatematrix(E,A);// E稀疏矩阵存储在数组A中
creatematrix(F,B);// F稀疏矩阵存储在数组B中
matrixadd(A,B,C);//相加
i=0;j=0;k=0;
printf("A数组内容如下:\n");
while(A[i]!=-1)
{
printf("%5d,%5d,%5d\n",A[i],A[i+1],A[i+2]);
i=i+3;
}
printf("B数组内容如下:\n");
while(B[j]!=-1)
{
printf("%5d,%5d,%5d\n",B[j],B[j+1],B[j+2]);
j=j+3;
}
printf("C数组内容如下:\n");
while(C[k]!=-1)
{
printf("%5d,%5d,%5d\n",C[k],C[k+1],C[k+2]);
k=k+3;
}
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-12-26
Loc(aij)=Loc(a00)+(i*n+j)*d ,这是以行为主求物理地址的公式~a00是首地址,d为每个数组元素占据的地址单元,从二三行条件看出是下三角矩阵,所以a[9,5]之前有多少元素呢?这个应该知道
k=i(i-1)/2+j-1(因为i j从1开始的),k=(8*9)/2+4=40,所以2000+40*4=2160.不知道够不够详细~本回答被提问者采纳
第2个回答  2024-02-27
aij!=0(i>=j,1<=i,j<=10)
aij=0(i<j,1<=i,j<=10)
所以这是一个下三角矩阵
11
21 22
3132 33 . . . . 5
.
.
.
9... .. .. ..95
以行序为主序存放
第一行一个,第二行两个,
(1+8)*8/2 + 4 = 40
后面*4 =160
+2000 = 2160