稀疏矩阵![在这里插入图片描述](https://img-blog.csdnimg.cn/20210529163956936.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzUzMTAwNzQx,size_16,color_FFFFFF,t_70)
![在这里插入图片描述](https://img-blog.csdnimg.cn/2021052916402153.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzUzMTAwNzQx,size_16,color_FFFFFF,t_70)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210529164030635.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzUzMTAwNzQx,size_16,color_FFFFFF,t_70)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210529164036344.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzUzMTAwNzQx,size_16,color_FFFFFF,t_70)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210529164043423.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzUzMTAwNzQx,size_16,color_FFFFFF,t_70)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210529164049974.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzUzMTAwNzQx,size_16,color_FFFFFF,t_70)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210529164055185.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzUzMTAwNzQx,size_16,color_FFFFFF,t_70)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210529164101883.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzUzMTAwNzQx,size_16,color_FFFFFF,t_70)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210529164112563.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzUzMTAwNzQx,size_16,color_FFFFFF,t_70)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210529164118761.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzUzMTAwNzQx,size_16,color_FFFFFF,t_70)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210529164124495.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzUzMTAwNzQx,size_16,color_FFFFFF,t_70)
行逻辑链接的顺序表
稀疏矩阵的链式储存
code
稀疏矩阵求转置
#include<stdio.h>
const int Maxn = 5000;
int a[Maxn + 1][3], b[Maxn + 1][3];
void tri_trans() {
b[0][0] = a[0][1];
b[0][1] = a[0][0];
b[0][2] = a[0][2];
int k = 1;
for (int i = 1; i <= a[0][1]; i++)
for (int j = 1; j <= a[0][2]; j++)
if (a[j][1] == i)
{
b[k][0] = i;
b[k][1] = a[j][0];
b[k][2] = a[j][2];
k++;
}
for (int i = 0; i <= b[0][2]; i++)
{
for (int j = 0; j <= 2; j++)
printf("%d ", b[i][j]);
printf("\n");
}
}
int tri_pos(int x,int y) {
for (int i = 1; i <= b[0][2]; i++)
if (b[i][0] == x && b[i][1] == y)
return(b[i][2]);
return 0;
}
int main() {
for (int j = 0; j <= 2; j++)
scanf("%d", &a[0][j]);
for (int i = 1; i <= a[0][2]; i++)
for (int j = 0; j <= 2; j++)
scanf("%d", &a[i][j]);
tri_trans();
int x , y;
scanf("%d %d",&x,&y);
printf("%d",tri_pos(x,y));
return 0;
}
矩阵乘法精典算法
#include<stdio.h>
const int Maxn = 5000;
int a[Maxn + 1][3], b[Maxn + 1][3], Q[Maxn + 1][3] ,q[Maxn + 1][Maxn + 1];
void tri_multi() {
if (a[0][1] != b[0][0])return; //无法相乘
Q[0][0] = a[0][0];
Q[0][1] = b[0][1];
Q[0][2] = 0;
for (int i = 1; i <= a[0][2]; i++)
for (int j = 1; j <= b[0][2]; j++)
if (a[i][1] == b[j][0])
q[a[i][0]][b[j][1]] += a[i][2] * b[j][2];
for (int i = 1; i <= Q[0][0]; i++){
for (int j = 1; j <= Q[0][1]; j++)
printf("%d ",q[i][j]);
printf("\n");
}
for (int i = 1; i <= Q[0][0]; i++){
for (int j = 1; j <= Q[0][1]; j++)
if (q[i][j])
{
Q[Q[0][2]+1][0] = i;
Q[Q[0][2]+1][1] = j;
Q[Q[0][2]+1][2] = q[i][j];
Q[0][2] += 1;
}
}
for (int i = 0; i <= Q[0][2]; i++)
{
for (int j = 0; j <= 2; j++)
printf("%d ", Q[i][j]);
printf("\n");
}
}
int main() {
for (int j = 0; j <= 2; j++)
scanf("%d", &a[0][j]);
for (int i = 1; i <= a[0][2]; i++)
for (int j = 0; j <= 2; j++)
scanf("%d", &a[i][j]);
getchar();
for (int j = 0; j <= 2; j++)
scanf("%d", &b[0][j]);
for (int i = 1; i <= b[0][2]; i++)
for (int j = 0; j <= 2; j++)
scanf("%d", &b[i][j]);
tri_multi();
return 0;
}
矩阵乘法三元组
#include<stdio.h>
const int Maxn = 5000;
int a[Maxn + 1][3], a_rpos[Maxn + 1], b[Maxn + 1][3], b_rpos[Maxn + 1], temp[Maxn + 1], Q[Maxn + 1][3];
void tri_multi() {
if (a[0][1] != b[0][0])return; //无法相乘
Q[0][0] = a[0][0];
Q[0][1] = b[0][1];
Q[0][2] = 0;
int row = 1, col = 1;
while(row <= Q[0][0]){
for (int i = a_rpos[row]; i < a_rpos[row+1]; i++)
for (int j = b_rpos[a[i][1]]; j < b_rpos[a[i][1]+1]; j++) {
temp[b[j][1]] += a[i][2] * b[j][2];
}
for(col = 1; col <= Q[0][1]; col++)
{
if (temp[col]) //如果结果非零,则记录到结果三元组中
{
if(++Q[0][2] > Maxn)
return;
int k = 0;
k = Q[0][2];
Q[k][0] = row;
Q[k][1] = col;
Q[k][2] = temp[col];
temp[col] = 0;
}
}
row ++;
}
//输出结果三元组
for (int i = 0; i <= Q[0][2]; i++)
{
for (int j = 0; j <= 2; j++)
printf("%d ", Q[i][j]);
printf("\n");
}
}
int main() {
for (int j = 0; j <= 2; j++)
scanf("%d", &a[0][j]);
for (int i = 1; i <= a[0][2]; i++)
for (int j = 0; j <= 2; j++)
scanf("%d", &a[i][j]);
int sign = 1, k = 1;
while(k <= a[0][2])
{
if (a[k][0] == sign){
a_rpos[sign++] = k;
k++;
}
else if(a[k][0] < sign){
k++;
}
else{
a_rpos[sign++] = k;
a_rpos[sign++] = k;
}
}
a_rpos[sign] = a[0][2] + 1;
getchar();
for (int j = 0; j <= 2; j++)
scanf("%d", &b[0][j]);
for (int i = 1; i <= b[0][2]; i++)
for (int j = 0; j <= 2; j++)
scanf("%d", &b[i][j]);
sign = 1, k = 1;
while(k <= b[0][2])
{
if (b[k][0] == sign){
b_rpos[sign++] = k;
k++;
}
else if(b[k][0] < sign){
k++;
}
else{
b_rpos[sign++] = k;
b_rpos[sign++] = k;
}
}
b_rpos[sign] = b[0][2] + 1;
tri_multi();
return 0;
}