用C语言或C++给出稀疏矩阵三元组存储结构的定义,并写出矩阵转置的算法。
#define SIZE 10
typedef struct node{ //三元组单元
int i;
int j;
int data;
}node;
typedef struct{
node ARRAY[SIZE];
int x,y,n; //行,列,个数
}THREE;
第一种方法:直接转置,O(n*y)
void invert(THREE *t, THREE *M){
int first = 0;
M->y = t->x;
M->x = t->y;
M->n = t->n;
for(int p=1; p<=t->y; p++){
for(int q=0; q<t->n; q++){
if(t->ARRAY[q].j == p){
M->ARRAY[first].i = t->ARRAY[q].j;
M->ARRAY[first].j = t->ARRAY[q].i;
M->ARRAY[first].data = t->ARRAY[q].data;
first++;
}
}
}
}
方法二:利用两个数组,O(n+y)
void invert(THREE *t, THREE *M){
M->y = t->x;
M->x = t->y;
M->n = t->n;
int cols[t->y+1],start_pos[t->y+1];
for(int q=1;q<t->y+1;q++){
cols[q] = 0;
start_pos[q] = 0;
}
for(int p=1; p<=t->n; p++){ //统计每一列的个数
cols[t->ARRAY[p].j]++;
}
start_pos[1] = 1;
for(int p=2; p<=t->y; p++){ //计算出每一个列的开始位置
start_pos[p] = start_pos[p-1] + cols[p-1];
}
for(int p=1; p<=t->n; p++){
M->ARRAY[start_pos[t->ARRAY[p].j]].j = t->ARRAY[p].i;
M->ARRAY[start_pos[t->ARRAY[p].j]].i = t->ARRAY[p].j;
M->ARRAY[start_pos[t->ARRAY[p].j]].data = t->ARRAY[p].data;
start_pos[t->ARRAY[p].j]++;
}
}