【数据结构】稀疏矩阵的二种转置方法

稀疏矩阵

  • 稀疏矩阵每个元素由3个元素组成,所以原数据1/3以下存储划算。
  • 矩阵的转置如果简单调换行和列,会使行优先变成列优先。

代码收获

  • 稀疏矩阵里嵌套的结构体是数组形式,分配给总的那个结构体空间后不用另外给他分配空间。
  • 插入数据除了自己写方法外,还可以使用数组插入int a[]={1,2,4,5,6}然后使用循环把数据弄进去。
  • 快速定位就是算位置,最后调换过程直接想容易搞蒙,一步步写出中间过程就会很简单。
  • 快速定位的2个数组存数据方法还是比较巧妙的。思路值得学习一下。
#include<stdio.h>
#include<stdlib.h>
# define MAXSIZE 100
//稀疏矩阵,每一个元素所在位置的结构体
typedef struct threeele{
    int row,col;
    int data;
}thele;
//矩阵的结构体
typedef struct matr{
    thele ele[MAXSIZE+1];//利用前面顺序存储思想,下面的非零个数是从1开始的。
    int m ,n,len;//矩阵长宽非零个数
}matrix,*matrixp;
void initialmatrix(matrixp* T){
    *T =(matrixp)malloc(sizeof(matrix));
    (*T)->len=0;
    (*T)->m=20;
    (*T)->n=20;
}
void addele(matrixp T,int row,int col,int data){//添加数据
    int num;
    num = T->len;
    T->ele[num+1].row=row;
    T->ele[num+1].col=col;
    T->ele[num+1].data=data;
    T->len=num+1;
}
void Printmatrix(matrixp T){//打印矩阵
    int num,i;
    num=T->len;
    for(i=1;i<=num;i++){
        printf("%d ",T->ele[i].row);
        printf("%d ",T->ele[i].col);
        printf("%d ",T->ele[i].data);
        printf("\n");
    }
}
//方法一 扫描转置 时间复杂度O(n*len)
void matter1(matrixp T,matrixp P){
    P->len=T->len;
    int num,i,k=1;
    for(num=1;num<T->n;num++){//列变成行,所以扫T所有列,作为P行
        for(i=1;i<=T->len;i++){//有几个数组元素
            if(T->ele[i].col==num){//如果扫描到,就加到新矩阵里
                P->ele[k].row=T->ele[i].col;
                P->ele[k].col=T->ele[i].row;
                P->ele[k].data=T->ele[i].data;
                k++;
            }
        }
    }
}
//方法二 快速定位 时间复杂度O(len+n)
void fastmatter(matrixp T,matrixp P){//对列进行扫 找个数组保num[k]存扫k列元素个数 position[k]表示k列第一个元素的位置
    int num[MAXSIZE+1]={0};
    int positon[MAXSIZE+1]={0};
    int i,k,j;
    for(i=1;i<=T->len;i++){//获取i列元素个数
        num[T->ele[i].col]++;
    }
    positon[1]=1;//初始值 有元素的话就放在第一行
    for(k=2;k<=T->n;k++){
        positon[k]=positon[k-1]+num[k-1];
    }
    for(j=1;j<=T->len;j++){
        int liehao=T->ele[j].col;
        int hanghao=positon[liehao];
        P->ele[hanghao].col=T->ele[j].row;
        P->ele[hanghao].row=T->ele[j].col;
        P->ele[hanghao].data=T->ele[j].data;
        positon[liehao]++;//同行号的赋值过,下一个行号就会加一
    }
    P->len=T->len;
}
void main(){
    matrixp T ,P;
    initialmatrix(&T);
    initialmatrix(&P);
    addele(T,1,2,11);
    addele(T,1,3,12);
    addele(T,3,1,13);
    addele(T,3,6,14);
    addele(T,4,3,15);
    addele(T,5,2,16);
    addele(T,6,2,17);
    Printmatrix(T);
//    matter1(T,P);
    fastmatter(T,P);
    printf("转制后\n");
    Printmatrix(P);
}

1 2 11
1 3 12
3 1 13
3 6 14
4 3 15
5 2 16
6 2 17
转制后
1 3 13
2 1 11
2 5 16
2 6 17
3 1 12
3 4 15
6 3 14
Process finished with exit code 8

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

业火之理

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值