C语言实现特殊矩阵存储

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

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

#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;

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342

推荐阅读更多精彩内容