稀疏矩阵的转置

采用三元组法存储稀疏矩阵

#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR -1
#define MAX_SIZE 12500
typedef int ElemType;//储存数据的类型  可更改
typedef int Status;

三元组结构体

typedef struct
{
    int row, col;//row,col 为行列下标
    ElemType e;
}Triple;

稀疏矩阵的结构体

typedef struct
{
    Triple data[MAX_SIZE + 1];
    int rn;//矩阵的行数
    int cn;//列数
    int tn;//非0元素的个数
}TSMatrix;

创建一个稀疏矩阵

int CreateSMatrix(TSMatrix *M)
{
    int len = 0;
    int pos = 1;
    char c = 'y';

    printf("请输入稀疏矩阵的行数:");
    scanf("%d", &M->rn);
    printf("请输入稀疏矩阵的列数:");
    scanf("%d", &M->cn);
    M->tn = 0;

    while(1)
    {
        if(c == 'y' || c == 'Y')
        {
            printf("请输入行下标:");
            scanf("%d", &M->data[pos].row);
            if(M->data[pos].row > M->rn + 1)
            {
                printf("error!\n");
                printf("是否插入元素(Y/N):");
                getchar();
                scanf("%c", &c);
                continue;
            }
            printf("请输入列下标:");
            scanf("%d", &M->data[pos].col);
            if(M->data[pos].col > M->cn + 1)
            {
                printf("error!\n");
                printf("是否插入元素(Y/N):");
                getchar();
                scanf("%c", &c);
                continue;
            }
            printf("请输入值:");
            scanf("%d", &M->data[pos].e);
            len++;
            printf("-------------\n");
            printf("position:%d\n", pos);
            pos++;
            M->tn++;
            printf("length:%d\n", len);
            printf("M.tu:%d\n", M->tn);
            printf("-------------\n");
        }
        else if(c == 'n' || c == 'N')
        {
            break;
        }
        else
        {
            printf("error.\n");
        }
        printf("是否插入元素(Y/N):");
        getchar();
        scanf("%c", &c);
    }

    return OK;
}

输出稀疏矩阵

void OutPutSMatrix(TSMatrix M)
{
    int i;

    printf("row    col    value\n");

    for(i = 1; i < M.tn + 1; i++)
    {
        printf("%2d", M.data[i].row);
        printf("%7d", M.data[i].col);
        printf("%7d", M.data[i].e);
        printf("\n");
    }
}

稀疏矩阵的转置矩阵
M是原矩阵
M1是转置后的矩阵
num[col]:统计矩阵第col列中非0元素的个数
cpot[col]:指示矩阵第col列第一个非0元素在b.data中的恰当位置

Status TransposeMatrix(TSMatrix *M, TSMatrix *M1)
{
    int cpot[M->cn];
    int num[M->rn];
    int p;
    int q;
    int i;
    int col;

    M1->rn = M->cn;
    M1->cn = M->rn;
    M1->tn = M->tn;

    if(M->tn == 0)
    {
        printf("The Matrix A = 0\n");
    }
    else
    {
        //向量num[col]初始化为0
        for(col=1; col <= M->cn + 1; col++)
        {
            num[col]=0;
        }

        //求原矩阵中每一列非0元素个数
        for(i = 1; i < M->tn + 1; i++)
        {
            num[M->data[i].col] += 1;
        }
        //求第col列中第一个非0元在b.data中的序号
        col = 1;
        while(col <= M->cn + 1)
        {
            if(col == 1)
            {
                cpot[col] = 1;
            }
            else if(col >= 2 && col < M->cn + 1)
            {
                cpot[col] = cpot[col - 1] + num[col - 1];
            }
            col++;
        }
    }

    for(p = 1; p < M->tn + 1; p++)
    {
        q = cpot[M->data[p].col];
        M1->data[q].row = M->data[p].col;
        M1->data[q].col = M->data[p].row;
        M1->data[q].e = M->data[p].e;
        cpot[M->data[p].col] += 1;
    }

    return OK;
}
int main()
{
    TSMatrix M;
    TSMatrix M1;

    CreateSMatrix(&M);
    printf("----------\n");
    OutPutSMatrix(M);
    TransposeMatrix(&M, &M1);
    printf("----转置后----\n");
    OutPutSMatrix(M1);

    return 0;
}

运行结果:
例:
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值