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

来源:互联网 发布:usb3.0端口 编辑:程序博客网 时间:2024/05/01 07:01
#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;      /*初始化为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[]) /*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[]){ /*pos-->统计每列非零元素的位置*/
    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;      /*初始化为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);   /*num-->统计每列非零元素的个数*/
    fillPos(num,pos,a); /*pos-->统计每列非零元素的位置*/
    ZZ(a,pos,b);      /*三元组快速转置,元素置于b数组*/
    print2(b,x,y,n,a);/*输出新矩阵,不可用print()输出*/
    return 0;

}


2 0
原创粉丝点击