数据结构 C语言 JAVA语言 顺序存储稀疏矩阵三元组表 一般转置法和快速转置法


//顺序存储稀疏矩阵三元组表 一般转置法和快速转置法
#include<stdio.h>
#include<stdlib.h>

#define MaxSize 1000
typedef int DataType;
typedef struct {
    int i, j;
    DataType v;
}TriTupleNode;

typedef struct {
    TriTupleNode data[MaxSize];
    int m, n, t;
}TSMatrix;


//建立一个顺序存储稀疏矩阵三元组表
void CreateTriTable(TSMatrix *b,int a[][5],int m,int n) {
    int  k = 0;
    int i, j;
    for (i = 0; i < m;i++) {
        for (j = 0; j < n; j++) {
            if (a[i][j]!=0) {
                b->data[k].i = i;
                b->data[k].j = j;
                b->data[k].v = a[i][j];
                k++;
            }
        }
        
    }
    b->m = m;
    b->n = n;
    b->t = k;
}

//一般转置算法
void TransMatirx(TSMatrix* a, TSMatrix* b) {
    int p,col,q=0;
    
    b->m = a->n;
    b->n = a->m;
    b->t = a->t;
    if (b->t<0) {
        printf("M中无非零元素");
    }else {
        for (col = 0; col < a->n;col++) {
            for (p = 0; p < a->t;p++) {
                if (col == a->data[p].j) {
                    b->data[q].i = a->data[p].j;
                    b->data[q].j = a->data[p].i;
                    b->data[q].v = a->data[p].v;
                    q++;
                }
            }
        }
    }
}


//快速转置法
void FastTran(TSMatrix* a, TSMatrix* b) {
    
    int col,t,p,q;
    int* num, * rownext;
    num = (int *)calloc(a->n + 1, 4);
    rownext = (int *)calloc(a->m + 1, 4);
    b->m = a->n;
    b->n = a->m;
    b->t = a->t;
    if (b->t) {
        for (col = 0; col < a->n;col++) {
            num[col] = 0;
        }
        for (t = 0; t < a->t; t++) {
            ++num[a->data[t].j];
        }
        rownext[0] = 0;
        for (col = 1; col < a->n; col++) {
            rownext[col] = rownext[col-1]+ num[col-1];
        }
        for (p = 0; p < a->t;p++) {
            col = a->data[p].j;
            q = rownext[col];
            b->data[q].i = a->data[p].j;
            b->data[q].j = a->data[p].i;
            b->data[q].v = a->data[p].v;
            ++rownext[col];
        }
    }
}


int main() {

    int a[][5]= { {0,3,0,5,0}, {0,0,-2,0,0}, {1,0,0,0,6}, {0,0,8,0,0}};
    TSMatrix *t = new TSMatrix;
    CreateTriTable(t, a, 4, 5);
    TSMatrix* b = new TSMatrix;

    //TransMatirx(t, b);
    FastTran(t, b);
}

//JAVA语言

public class TsMatirx {
    private static final int maxSize = 10000;
    private TriTupleNode data[] = new TriTupleNode[maxSize];
    //行数
    private int m = 0;
    //列数
    private int n = 0;
    //非 零个数
    private int t = 0;

    //建立一个顺序存储稀疏矩阵三元组表
    public  void createTriTable(TsMatirx b, int a[][], int m, int n) {
        int k = 0, i, j;
        for (i = 0; i < m; i++) {
            for (j = 0; j < n; j++) {
                if (a[i][j] != 0) {
                    TriTupleNode triTupleNode = new TriTupleNode();
                    triTupleNode.i = i;
                    triTupleNode.j = j;
                    triTupleNode.v = a[i][j];
                    b.data[k] = triTupleNode;
                    k++;
                }
            }
        }
        b.m = m;
        b.n = n;
        b.t = k;
    }

    //一般转置算法
    public  void transMatirx(TsMatirx a, TsMatirx b) throws Exception {
        int col, p, q = 0;
        if (a.t < 1) {
            throw new Exception("无非零元素");
        } else {
            b.m = a.n;
            b.n = a.m;
            b.t = a.t;
            for (col = 0; col < a.n; col++) {
                for (p = 0; p < a.t; p++) {
                    if (col == a.data[p].j) {
                        TriTupleNode triTupleNode = new TriTupleNode();
                        triTupleNode.i = a.data[p].j;
                        triTupleNode.j = a.data[p].i;
                        triTupleNode.v = a.data[p];
                        b.data[q] = triTupleNode;
                        q++;
                    }
                }
            }
        }
    }


    public void fastTran(TsMatirx a, TsMatirx b) throws Exception {
        int col, t, p, q;
        if (a.t < 1) {
            throw new Exception("无非零元素");
        } else {
            b.m = a.n;
            b.n = a.m;
            b.t = a.t;
            int num[] = new int[a.n];
            int rownext[] = new int[a.n];
            for (col = 0; col < a.n; col++) {
                num[col] = 0;
                rownext[col] = 0;
            }
            for (t = 0; t < a.t; t++) {
                num[a.data[t].j] = ++num[a.data[t].j];
            }
            for (col = 1; col < a.n; col++) {
                rownext[col] = rownext[col - 1] + num[col - 1];
            }

            for (p = 0; p < a.t; p++) {
                q = rownext[a.data[p].j];
                TriTupleNode triTupleNode = new TriTupleNode();
                triTupleNode.i = a.data[p].j;
                triTupleNode.j = a.data[p].i;
                triTupleNode.v = a.data[p];
                b.data[q] = triTupleNode;
                rownext[a.data[p].j] = ++rownext[a.data[p].j];
            }

        }


    }



    private class TriTupleNode {
        public int i = 0;
        public int j = 0;
        public Object v = 0;

    }

    public static void main(String[] args) throws Exception {
        int a[][] = {{0, 3, 0, 5, 0}, {0, 0, -2, 0, 0}, {1, 0, 0, 0, 6}, {0, 0, 8, 0, 0}};
        TsMatirx t = new TsMatirx();
        t.createTriTable(t,a,4,5);
        TsMatirx b = new TsMatirx();
        b.transMatirx(t,  b);
        TsMatirx c = new TsMatirx();
        b.fastTran(t,c);

        System.out.println();

    }
}

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值