您的位置:首页 > 编程语言 > C语言/C++

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

2015-11-30 21:10 579 查看
#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
.i=x; a
.j=y; a
.v=z;

n++;

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

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

n++;

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

{

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

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

scanf("%d",&a
.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;

}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: