题目
设计算法求三对角矩阵在压缩存储下的转置矩阵
代码
#include <stdio.h>
#include <stdlib.h>
#define MAX 100
typedef struct
{
int row, col; //非零元素的行和列
int v; //非零元素的值
}node;
typedef struct
{
int m, n, t; //三对角矩阵的行数、列数和非零元素的个数
node data[MAX]; //存储非零结点的三元组
}Sparsematrix;
//转置
void transMatrix(Sparsematrix * S) //transposition
{
int i;
int temp;
for(i = 0; i < S->t; ++i)
{
temp = S->data[i].row;
S->data[i].row = S->data[i].col;
S->data[i].col = temp;
}
}
//压缩存储
Sparsematrix * compress(int a[][5], int m, int n)
{
Sparsematrix *S = (Sparsematrix *)malloc(sizeof(Sparsematrix));
S->m = m;
S->n = n;
int i, j;
int t = 0; //非零元素的个数
int k = 0;
for (i = 0; i < m; ++i)
{
for (j = 0; j < n; ++j)
{
if (a[i][j] != 0)
{
t++;
S->data[k].row = i;
S->data[k].col = j;
S->data[k].v = a[i][j];
k++;
}
}
}
S->t = t;
return S;
}
//输出数组内容
void print(int * a, int length) //数组首地址和长度
{
int i;
int j = 0;
for(i = 0; i < length; ++i)
{
printf("%d ", a[i]);
j++;
if (j % 5 == 0)
{
printf("\n");
}
}
}
//将三元组以矩阵的形式输出
void printSparsematrix(Sparsematrix * S)
{
int i, j, k;
int temp = 0;
for (i = 0; i < S->m; ++i)
{
for (j = 0; j < S->n; ++j)
{
temp = 0;
for(k = 0; k < S->t; ++k)
{
if (i == S->data[k].row && j == S->data[k].col)
{
temp = S->data[k].v;
break;
}
}
printf("%d ", temp);
}
printf("\n");
}
}
int main(void)
{
int a[5][5] = {
{1, 3, 0, 0, 0},
{4, 5, 2, 0, 0},
{0, 6, 3, 7, 0},
{0, 0, 3, 8, 9},
{0, 0, 0, 5, 1}
};
printf("原矩阵:\n");
print(*a, 25);
Sparsematrix *S = (Sparsematrix *)malloc(sizeof(Sparsematrix));
S = compress(a, 5, 5);
printf("压缩后矩阵形式输出后:\n");
printSparsematrix(S);
transMatrix(S);
printf("转置后:\n");
printSparsematrix(S);
return 0;
}