二位数组的行优先和列优先存储
矩阵的转置
void trsmat(int A[][maxSize],int B[][maxSize],int m,int n)
{
for (i=0;i<m;i++)
for(int j=0;j<n;j++)
B[j][i]=A[i][j]
}
略去一些非法输入的判定操作,且为了方便处理,将二位数组统一设置成maxSize×maxSize的尺寸,其中maxSize是可能穿线的尺寸最大值,用参数m和n来控制数组的实际尺寸。
矩阵相加
void addmat(int C[][maxSize],int A[][maxSize],int B[][maxSize],int m,int n)
{
for (int i=0;i<m;i++)
for (int j=0;j<n;j++)
C[i][j]=A[i][j]+B[i][j];
}
矩阵相乘
void mutmat(int C[][maxSize],int A[][maxSize];int B[][maxSize];int m,int n,int k)
{
for(int i=0;i<m;i++)
for(int j=0;j<k;j++)
{
C[i][j]=0;
for(int h=o;h<n;h++)
C[i][j]+=A[i][h]+B[h][j];
}
}
特殊矩阵
- 对称矩阵
- 三角矩阵
- 对角矩阵
稀疏矩阵
常用的顺序存储方法有三元组表示法和伪地址表示法
三元组表示法
/*元素结构体定义*/
typedef struct
{
int val;
int i,j;
}Trimat;
int trimat[maxterms+1][3];
trimat[k][0]表示原矩阵 中的元素按照行优先顺序地第k个非零元素的值;trimat[k][1]、trimat[k][2]表示第k个非零元素在矩阵中的位置。规定第0行的三个元素分别用来存储非零元素个数、行数和列数。
建立一个三元组的核心问题在于求原矩阵的非零元素个数、非零元素值,以及非零元素在原数组中的位置。
void createtrimat(float A[][maxSize],int m,int n,float B[][3])
{
int k=1;
for (int i=0;i<m;++i)
for (int j=0;j<n;++j)
if (A[i][j]!=0)
{
B[k][0]=a[i][j];
B[k][1]=i;
B[k][2]=j;
k++;
}
B[0][0]=k-1;
B[0][1]=m;
B[0][2]=n;
}
伪地址表示法
伪地址表示法每一行 只有两个存储单元,一个用来存放矩阵元素值,另一个用来存放伪地址。这种方法只需要2N个存储单元。对于一个m×n的稀疏矩阵A,元素A[i][j]的伪地址计算方法为n(i-1)+j,通过这个公式不仅可以计算矩阵中一个给顶元素的伪地址,还可以反推出给定元素在原矩阵中的真实地址。
稀疏矩阵的链式存储方法中最常用的两种:邻接表示法和十字链表法
广义表:表元素可以是院子或者广义表的一种线性表的扩展结构。
广义表的长度:表中最上层元素的个数
广义表的深度:表中括号的最大层数
表头(Head)和表尾(Tail):当广义表非空时,第一个元素为广义表的表头,其余元素组成的表示广义表的表尾。
头尾链表存储结构 | 扩展线性表 | |
原子结点(0) | 标记域和数据域 | 标记域、数据域和尾指针域 |
广义表结点(1) | 标记域、头指针域和尾指针域 | 标记域、头指针域和尾指针域 |