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++;
}
}
}
}
上一个复杂度相对而言较高,下面是一种以空间换取时间的方法。
#include"stdio.h"
#define SIZE 10
typedef struct node{ //三元组单元
int i;
int j;
int data;
}node;
typedef struct{
node ARRAY[SIZE+1];
int x,y,n; //行,列,个数
}THREE;
void create(THREE *t){
printf("个数:");
scanf("%d",&t->n);
printf("行,列:");
scanf("%d %d",&t->x,&t->y);
for(int p=1; p<=t->n; p++){
printf("第%d个 :",p);
scanf("%d %d %d",&t->ARRAY[p].i,&t->ARRAY[p].j,&t->ARRAY[p].data);
}
}
void show(THREE *t){
for(int p=1; p<=t->n; p++){
printf("%2d %2d %2d\n",t->ARRAY[p].i,t->ARRAY[p].j,t->ARRAY[p].data);
}
}
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]++;
}
}
int main(){
THREE three1,three2;
create(&three1);
invert(&three1,&three2);
show(&three1);
show(&three2);
return 0;
}