C语言实现特殊矩阵存储

2018-06-02  本文已影响0人  obsession_me

下面实现的特殊矩阵存储方法

三元组顺序存储方法&转置

#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 12500
// 三元组顺序表示稀疏矩阵
// written at 2018-6-1 23:37:22

typedef int ElemType;
typedef struct{
    int i;  // row
    int j;  // column
    ElemType e;
}tripple;
typedef struct{
    tripple data[MAXSIZE+1];  // 0 not use
    int mu, nu, tu;  // 行,列,非零元总数
}tsMatrix;

tripple init_tribble(int i, int j, ElemType e){
    tripple temp;
    temp.i = i;
    temp.j = j;
    temp.e = e;
    return temp;
}

void print_sparse_matrix(tsMatrix temp){
    printf("**********START************\n");
    printf("i\tj\tv\t\n");
    for (int i=1; i<=temp.tu; i++){
        printf("%d\t%d\t%d\t\n",temp.data[i].i,temp.data[i].j,temp.data[i].e);
    }
    printf("***********END*************\n");
}

void transposeMatrix(tsMatrix m, tsMatrix *t){
    // 按列转置矩阵
    t->mu = m.nu;  // step 1
    t->nu = m.mu;  // step 1
    t->tu = m.tu;
    // step 2 & step 3
    if(t->tu){
        int q=1;
        for (int col=1;col<=m.nu;++col){
            for (int p=1; p<=m.tu;++p){
                if (m.data[p].j == 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;
                    q++;
                }
            }
        }
    }
}

void quickTranspose(tsMatrix m, tsMatrix *t){
    // 通过预先确认M中每一列的第一个非零元在b.data中的应有的位置,则可以省时间
    t->mu = m.nu;
    t->nu = m.mu;
    t->tu = m.tu;
    if (t->tu){
        int num[m.nu + 1];  // 0 not use
        for (int col=1; col<=m.nu; col++) num[col] = 0;  // 初始化num数组
        for (int temp=1; temp<=m.tu; temp++) ++num[m.data[temp].j];
        int cpot[m.nu + 1];  // 0 not use
        cpot[1] = 1; // 第一列中第一个元素肯定是在第一个位置
        // 求第col列中第一个非零元在b.data中的序号
        for (int col=2; col<=m.nu;++col){
            cpot[col]=cpot[col-1]+num[col-1];
        }
        for (int p=1;p<=m.tu;++p){
            int col = m.data[p].j;
            int 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];
        }
    }
}

void main(){
    // init the martix and let the matrix not empty
    tsMatrix temp;
    temp.data[1] = init_tribble(1, 2, 12);
    temp.data[2] = init_tribble(1, 3, 9);
    temp.data[3] = init_tribble(3, 1, -3);
    temp.data[4] = init_tribble(3, 6, 14);
    temp.data[5] = init_tribble(4, 3, 24);
    temp.data[6] = init_tribble(5, 2, 18);
    temp.data[7] = init_tribble(6, 1, 15);
    temp.data[8] = init_tribble(6, 4, -7);
    // 课本97页中的M矩阵
    temp.mu = 6;
    temp.nu = 7;
    temp.tu = 8;
    print_sparse_matrix(temp);
    tsMatrix t;
    tsMatrix t2;
    transposeMatrix(temp, &t2);
    quickTranspose(temp, &t);
    printf("\t按列转置\t\n");
    print_sparse_matrix(t2);
    printf("\t快速转置\t\n");
    print_sparse_matrix(t);
}

输出结果如下:

**********START************
i       j       v
1       2       12
1       3       9
3       1       -3
3       6       14
4       3       24
5       2       18
6       1       15
6       4       -7
***********END*************
        按列转置
**********START************
i       j       v
1       3       -3
1       6       15
2       1       12
2       5       18
3       1       9
3       4       24
4       6       -7
6       3       14
***********END*************
        快速转置
**********START************
i       j       v
1       3       -3
1       6       15
2       1       12
2       5       18
3       1       9
3       4       24
4       6       -7
6       3       14
***********END*************

行逻辑链接的顺序表

#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 12500
/*
行逻辑连接的顺序表
为了便于随机存取任意一行的非零元引入的第二种表示方法
written at 2018-6-2 18:26:30
*/

typedef int ElemType;
typedef struct{
    int i;  // row
    int j;  // column
    ElemType e;
}tripple;
typedef struct RLSMatrix{
    tripple data[MAXSIZE+1];
    int mu, nu, tu;
    int rops[MAXRC + 1];  // 各行第一个非零元的位置表
}RLSMatrix;

上一篇下一篇

猜你喜欢

热点阅读