C语言源码:
Java源码:
#include <stdio.h>
#include <malloc.h>
#define maxsize 12500
typedef struct{
int i,j;
int e;
}Triple;
typedef struct{
Triple data[maxsize+1];
int mu,nu,tu;
}TSMatrix;
int input(TSMatrix &M)
{
int i;
printf("请输入行数,列数,非零元个数:\n");
scanf("%d%d%d",&M.mu,&M.nu,&M.tu);
for(i=1;i<=M.tu;i++)
{
printf("输入行标,列标和非零元素的值\n");
scanf("%d %d %d",&M.data[i].i,&M.data[i].j,&M.data[i].e);
}
return 1;
}
int FastTransposeSMatrix(TSMatrix M,TSMatrix &T)
{
int t,p,q,n, col,num[200],cpot[200];
T.mu=M.nu;
T.nu=M.mu;
T.tu=M.tu;
if(T.tu)
{
for(col=1;col<=M.nu;col++)
num[col]=0;
for(t=1;t<=M.nu;t++)
{
for(n=1;n<=M.tu;n++)
{if(M.data[n].j==t)
num[t]++;}
}
for(n=1;n<=M.nu;n++)
{
if(num[n]!=0)
printf("列数为%d的数有%d个\n",n,num[n]);
}
cpot[1]=1;
for(col=2;col<=M.nu;col++)
cpot[col]=cpot[col-1]+num[col-1];
for(p=1;p<=M.tu;++p)
{
col=M.data[p].j;
q=cpot[col];
T.data[q].i=M.data[p].j;
T.data[q].j=M.data[p].i;
T.data[q].e=M.data[p].e;
++cpot[col];
}
}
return 1;
}
int output(TSMatrix L)
{
int n;
printf("行 列 数据:\n");
for(n=1;n<=L.tu;n++)
printf("%d %d %d\n",L.data[n].i,L.data[n].j,L.data[n].e);
return 1;
}
void main()
{
TSMatrix M,T;
input(M);
FastTransposeSMatrix(M,T);
output(M);
output(T);
}
Java源码:
import java.util.Scanner;
//非零元素的下标和值
class Triple {
int i;
int j;
Object e;
}
//行数列数非零元素个数
class TsMatrix {
Triple[] data;
int mu, nu, tu;
}
public class FastTransposeDemo {
TsMatrix t = new TsMatrix();
TsMatrix m = new TsMatrix();
Scanner in = new Scanner(System.in);
//输入非零元素
public void input(TsMatrix m) {
System.out.println("请输入行数,列数,非零元素个数:");
m.mu = in.nextInt();
m.nu = in.nextInt();
m.tu = in.nextInt();
System.out.println(m.mu + " " + m.nu + " " + m.tu);
m.data = new Triple[m.tu+1];
for (int i = 1; i <= m.tu; i++) {
m.data[i] = new Triple();
}
for (int i = 1; i <= m.tu; i++) {
System.out.println("输入行标,列标和非零元素的值");
m.data[i].i = in.nextInt();
m.data[i].j = in.nextInt();
m.data[i].e = in.nextLine();
// System.out.println("i" + m.data[i].i + "j" + m.data[i].j + "e"
// + m.data[i].e);
}
}
//快速转置算法
int FastTransposeSMatrix(TsMatrix M, TsMatrix T) {
int t, p, q, n, col;
int[] num = new int[200];
int[] cpot = new int[200];
T.mu = M.nu;
T.nu = M.mu;
T.tu = M.tu;
T.data = new Triple[T.tu+1];
for (int i = 1; i <= T.tu; i++) {
T.data[i] = new Triple();
}
if (T.tu > 0) {
for (col = 0; col < M.nu; col++)
num[col] = 0;
for (t = 0; t < M.nu; t++) {
for (n = 1; n <= M.tu; n++) {
if (M.data[n].j == t)
num[t]++;
}
}
for (n = 0; n <= M.nu; n++) {
if (num[n] != 0)
System.out.println("列数为" + n + "的数有" + num[n] + "个");
}
//计算每列元素个数
cpot[0] = 1;
for (col = 1; col <= M.nu; col++)
cpot[col] = cpot[col - 1] + num[col - 1];
//转置
for (p = 1; p <= M.tu; ++p) {
col = M.data[p].j;
System.out.println("`````````````````" + p);
//printf("``````````````````````````%d ",p);
q = cpot[col];
T.data[q].i = M.data[p].j;
T.data[q].j = M.data[p].i;
T.data[q].e = M.data[p].e;
++cpot[col];
}
}
return 1;
}
//输出结果
public void output(TsMatrix L) {
int n;
System.out.println("行 列 数据:");
for (n = 1; n <= L.tu; n++) {
System.out.println(L.data[n].i + " " + L.data[n].j + " "
+ L.data[n].e);
}
//printf("%d %d %d\n",L.data[n].i,L.data[n].j,L.data[n].e);
}
public static void main(String[] args) {
TsMatrix M = new TsMatrix();
TsMatrix T = new TsMatrix();
FastTransposeDemo f = new FastTransposeDemo();
f.input(M);
f.FastTransposeSMatrix(M, T);
f.output(M);
f.output(T);
}
}