用C语言写一个将稀疏矩阵转换为三元组顺序表存储
时间: 2024-05-11 08:16:35 浏览: 103
用C语言实现稀疏矩阵的三元组转置
可以参考以下代码:
```
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100 // 最大非零元个数
typedef struct{
int i, j; // 非零元素的行和列下标
int e; // 非零元素的值
}Triple;
typedef struct{
Triple data[MAXSIZE + 1]; // 存储三元组的顺序表,data[0]不使用
int mu, nu, tu; // 矩阵的行数,列数和非零元素的个数
}TSMatrix;
int getpos(int i, int j, TSMatrix M) // 查找(i,j)在三元组数组中的位置
{
for(int k = 1; k <= M.tu; k++)
if(M.data[k].i == i && M.data[k].j == j)
return k;
return 0;
}
void getsparse(TSMatrix *M) // 读入稀疏矩阵
{
printf("请输入矩阵的行数、列数和非零元素个数:\n");
scanf("%d %d %d", &M->mu, &M->nu, &M->tu);
printf("请输入所有非零元素的行、列、值:\n");
for(int k = 1; k <= M->tu; k++)
scanf("%d %d %d", &M->data[k].i, &M->data[k].j, &M->data[k].e);
}
void transposetuple(TSMatrix M, TSMatrix *T) // 稀疏矩阵转置
{
T->mu = M.nu;
T->nu = M.mu;
T->tu = M.tu;
if(T->tu){
int q = 1;
for(int col = 1; col <= M.nu; col++) // 对每一列进行转置
for(int p = 1; p <= M.tu; p++) // 扫描M中所有元素
if(M.data[p].j == col){ // 将列号为col的元素插入到T中
T->data[q].i = M.data[p].j;
T->data[q].j = M.data[p].i;
T->data[q].e = M.data[p].e;
q++;
}
}
}
void printsparse(TSMatrix M) // 输出三元组矩阵
{
printf("该矩阵的三元组表示:\n");
for(int i = 1; i <= M.tu; i++){
printf("(%d,%d,%d)", M.data[i].i, M.data[i].j, M.data[i].e);
if(i % 5 == 0)
printf("\n");
}
printf("\n");
}
void printtuple(TSMatrix M) // 输出三元组矩阵的行列式
{
printf("该稀疏矩阵的三元组顺序表存储:\n");
printf(" i j e\n");
for(int i = 1; i <= M.tu; i++){
printf("%5d%5d%5d\n", M.data[i].i, M.data[i].j, M.data[i].e);
}
}
int main()
{
TSMatrix M, T;
getsparse(&M);
printtuple(M); // 打印三元组矩阵
transposetuple(M, &T);
printsparse(T); // 打印转置后的三元组矩阵
return 0;
}
```
以上代码通过定义三元组结构体和稀疏矩阵结构体,实现了将稀疏矩阵转换为三元组顺序表存储的功能。在转置时,对每一列扫描M中所有元素,将列号为col的元素插入到T中,最后得到转置后的三元组矩阵。
阅读全文