稀疏矩阵转置

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;
}

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值