优点:使用一次循环就将三元组A转置到B
为啥能够减少一次循环,是由于当扫描元素的时候可以直接通过两个辅助的数组找到对应的元素,符合时间换空间。我开时侯的错误在在于三元数组并非是三维的,它是以二维形式存储的,再以以为的方式串起来;
起始面对稀疏矩阵有个很大的问题就是他的结构是要让他不变的,目的就是为了减少数据量的移动,同时我看代码的能力要加强。数据结构真的是思维完全不同的东西。任然要多练习。
1.A的没一列非零的个数和三元组B的每一行非零个数
2 待转置矩阵每一列的第一个非零元素在b中的正确位置
#define MAXSIZE 1000
#include <stdio.h>
#include <stdio.h>
typedef struct
{
int row,col;
int data;
}Triple;
typedef struct
{
Triple data[MAXSIZE + 1];//多申请一个空间,让长度和下标一致。data[0]是空的
int m, n, len;//矩阵的行数和列数,len是矩阵中非零元素的个数。
} TSMatrix;
void FastTransposeTSMatrix(TSMatrix A, TSMatrix *B)
{
int col, t, p, q;
int num[MAXSIZE], position[ MAXSIZE ];
B->len = A.len; B->n = A.m; B->m = A.n;
if(B->len)
{
for (col = 2; col <= A.n; col++)
num[col] = 0;//初始化num数组
for (t = 1; t < A.len; t++)
num[A.data[t].col]++;//num数组里面下标为col的位置加一
position[1] = 1;
for (col = 2; col <= A.n; col++)//计入a第n列的首个非零位置(n是a一共有n列)
position[col] = position[col - 1] + num[col - 1];
for (p = 1; p < A.n; col++)
{
col = A.data[p].col; q = position[col];
B->data[q].row = A.data[p].col;
B->data[q].col = A.data[p].row;
B->data[q].row = A.data[p].e;
position[col++];
}
}