编写程序用三元组表实现稀疏矩阵的按列转置操作

内容

编写程序用三元组表实现稀疏矩阵的按列转置操作

1.算法分析

使用三元组表实现。

2.设计概要

程序中设计了三个函数:
函数InitSPNode()用来建立一个稀疏矩阵的三元组表。
首先输入行数、列数和非零元的值,输入(-1,-1,-1)结束输入。
函数showMatrix()用来输出稀疏矩阵。
算法中按矩阵a的列进行循环处理,对a的每一列扫描三元组,找出相应的元素,若找到,则交换其行号与列号,并存储到矩阵b的三元组中。
函数TransposeSMatrix()用来完成稀疏矩阵的转置算法。
算法主要的工作是在p和col的两重循环中完成,时间复杂度为O(n*t)。如果非零元素个数t和m*n同数量级,则算法的时间复杂度变为O(m*n2)。

3.测试,测试代码的设计与实现,测试结果截屏

#define _CRT_SECURE_NO_WARNINGS 1

#include<stdio.h>

#include<string.h>

#define OK 1

#define Maxsize 10   //用户自定义三元组最大长度



/*定义三元组表*/

typedef struct

{

    int i, j;  //非零元素的行列

    int v;    //非零元素值

}SPNode;

/*定义三元组表*/

typedef struct

{

    SPNode data[Maxsize];  //三元组表

    int m, n, t;             //矩阵行,列及三元组表长度

}SPMatrix;                 //三元组表的存储类型



/*输入三元组表*/

void InitSPNode(SPMatrix* a)

{

    int i, j, k, val, maxrow, maxcol;

    maxrow = 0;

    maxcol = 0;

    i = j = 0;

    k = 0;

    while (i != -1 && j != -1)  //row=-1&&col=-1结束输入

    {

       printf("输入(行列值):");

       scanf("%d%d%d", &i, &j, &val);

       a->data[k].i = i;

       a->data[k].j = j;

       a->data[k].v = val;

       if (maxrow < i)maxrow = i;

       if (maxcol < j)maxcol = j;

       k++;

    }

    a->m = maxrow; a->n = maxcol; a->t = k - 1;

}



/*输出稀疏矩阵*/

void showMatrix(SPMatrix* a)

{

    int p, q;

    int t = 0;

    for (p = 0; p <= a->m; p++)

    {

       for (q = 0; q <= a->n; q++)

       {

           if (a->data[t].i == p && a->data[t].j == q)

           {

              printf(" %d  ", a->data[t].v);

              t++;

           }

           else printf(" 0  ");

       }

       printf("\n");

    }

}



/*稀疏矩阵转置*/

void TransposeSMatrix(SPMatrix* a, SPMatrix* b)

{

    int q, col, p;

    b->m = a->n; b->n = a->m; b->t = a->t;

    if (b->t)

    {

       q = 0;

       for (col = 0; col <= a->n; ++col)   /*按a的列序转置*/

           for (p = 0; p < a->t; ++p)     /*扫描整个三元组表*/

              if (a->data[p].j == 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;

                  ++q;

              }

    }

}

int main()

{

    SPMatrix a, b;

    printf("\n 结束请输入(-1-1-1)\n");

    InitSPNode(&a);

    printf(" 输入矩阵为:\n");

    showMatrix(&a);     //转置前

    TransposeSMatrix(&a, &b);

    printf(" 输出矩阵为: \n");

    showMatrix(&b);     //转置后

}

编译环境为:vs2019为避免scanf函数溢出在头文件前加入

#define _CRT_SECURE_NO_WARNINGS 1

运行结果:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值