天天看点

稀疏矩阵的快速转置(C语言版)

#include <stdio.h>

#include <stdlib.h>

#define MAX 100

typedef struct node{

    int i,j,v;

}SYZ;

void createlist(SYZ *L,SYZ a[MAX],int x,int y,int z){

    int n=0;

    a[n].i=x;  a[n].j=y;  a[n].v=z;

    n++;

    printf("请输入数字所在的行数、列数以及对应的数值:\n\n");

    scanf("%d",&a[n].i);scanf("%d",&a[n].j);scanf("%d",&a[n].v);

    n++;

    for(;n <= z;n++)

    {

      scanf("%d",&a[n].i);

      scanf("%d",&a[n].j);

      scanf("%d",&a[n].v);

    }

}

void DataSort(SYZ *L,int x,SYZ a[MAX])

{

    int s,t,k,temp1,temp2,temp3;

    for(s=1;s<x;s++)

    {   t=s;

        for(k=s+1;k<=x;k++)

        {

            if(a[t].i>a[k].i){ t=k; }

        }

        if(t!=s)

        {

            temp1=a[s].i;      

            a[s].i=a[t].i;

            a[t].i=temp1;

            temp2=a[s].j;        

            a[s].j=a[t].j;

            a[t].j=temp2;

            temp3=a[s].v;        

            a[s].v=a[t].v;

            a[t].v=temp3;

        }

    }

}

void print(SYZ a[MAX],int x,int y,int m[x][y])

{

    printf("稀疏矩阵为:\n\n");

    int i,j,k,s,r,t;

    for(i=0;i<x;i++)

        for(k=0;k<y;k++)

            m[i][k]=0;      

    for(i=1;i<=a[0].v;i++){

        s=a[i].i;r=a[i].j;t=a[i].v;

        m[s-1][r-1]=t;      

    }

    for(i=0;i<x;i++)

    {

        for(j=0;j<y;j++) printf("%6d",m[i][j]);

        printf("\n");

    }

}

void fillNum(SYZ a[],int num[])

{

    int i=0,k;

    for(i=1;i<=a[0].v;i++) num[i]=0;

    for(i=1;i<=a[0].v;i++) { k=a[i].j;num[k]++;}

}

void fillPos(int num[],int pos[],SYZ a[]){

    int i;

    for(i=2;i<=a[0].j;i++){ pos[1]=1;pos[i]=pos[i-1]+num[i-1];}

}

void ZZ(SYZ a[],int pos[],SYZ b[])

{

    int i=1,ma,p;

    for(;i<=a[0].v;i++){

        ma=a[i].j;p=pos[ma];

        b[p].i=a[i].j;

        b[p].j=a[i].i;

        b[p].v=a[i].v;

        pos[ma]++;

    }

}

void print2(SYZ b[],int x,int y,int n[y][x],SYZ a[])

{

    printf("\n转置后的矩阵为:\n");

    int i,j,k,s,r,t;

    for(i=0;i<y;i++)

        for(j=0;j<x;j++)

            n[i][j]=0;      

    for(k=1;k<=a[0].v;k++){

        s=b[k].i;r=b[k].j;t=b[k].v;

        n[s-1][r-1]=t;      

    }

    for(i=0;i<y;i++)

    {

        for(j=0;j<x;j++) printf("%6d",n[i][j]);

        printf("\n");

    }

}

int main()

{

    SYZ L;

    int x,y,z;

    printf("请依次输入矩阵总的行数、列数、以及非零字符的个数:\n");

    scanf("%d",&x);scanf("%d",&y);scanf("%d",&z);

    SYZ a[MAX];            

    createlist(&L,a,x,y,z);

    DataSort(&L,x,a);      

    int m[x][y],n[y][x];

    print(a,x,y,m);        

    SYZ b[MAX];      

    int num[y],pos[y];

    fillNum(a,num);  

    fillPos(num,pos,a);

    ZZ(a,pos,b);      

    print2(b,x,y,n,a);

    return 0;

}

稀疏矩阵的快速转置(C语言版)