设计算法并编程实现用三元组顺序表解决稀疏矩阵的转置问题,第一种方法是普通的方法,也就是书上给出的方法,这不是一种高效的算法,下面给出代码和解释,其中注释已经解释的很清楚了。还有一种快速转置方法,将在我下一篇文章介绍

#include<stdio.h>
#define M 6//行数
#define N 6//列数
#define Maxsize 8

typedef struct
{
    int r;//行号
    int c;//列号
    int d;//元素值
}TupNode;//三元组类型


typedef struct
{
    int rows;//行数
    int cols;//列数
    int num;//非零元个数
    TupNode data[Maxsize];//非零元素的行列以及元素值的三元组信息
}TSMatrix;//三元表类,一个三元表相当于一个稀疏矩阵


void CreateMat(TSMatrix &t,int a[M][N])//创建一个三元表,从a数组里面获取数据
{
  int i,j;
   t.rows=M;t.cols=N;t.num=0;//初始化一张三元表
        for(i=0;i<M;i++)//逐行扫描
        {
            for(j=0;j<N;j++)//逐列扫描
            {
                if(a[i][j]!=0)
                {
                    t.data[t.num].r=i;//更新最大行数
                    t.data[t.num].c=j;//更新最大列数
                    t.data[t.num].d=a[i][j];//插入元素值
                    t.num++;//非零元素个数+1,因为是从0开始,所以只要执行if语句,个数就+1;
                }
            }
        }
}

void DispMat(TSMatrix  t)//输出一个稀疏矩阵的三元表
{
    int k;
    if(t.num<=0) return;//没有非零元素时直接返回
    printf("\t%d\t%d\t%d\n",t.rows,t.cols,t.num);//表头:行数,列数,非零元素数
    printf("\t---------------------------------\n");
    for(k=0;k<t.num;k++)//输出每一个非零元素的三元信息
    {
        printf("\t%d\t%d\t%d\n",t.data[k].r,t.data[k].c,t.data[k].d);
    }
}

void TranTat(TSMatrix t,TSMatrix &tb)//转置函数
{
    int k,k1=0,v;
    tb.rows=t.cols;//列数变行数
    tb.cols=t.rows;//行数变列数
    tb.num=t.num;
    if(t.num!=0)
    {
        for(v=0;v<t.cols;v++)//按列号从小到大排列
        {
            for(k=0;k<t.num;k++)//扫描t的所有元素,看有没有符合t的列号等于v的元素
            {
                if(t.data)
                {
                    tb.data[k1].r=t.data[k].c;
                    tb.data[k1].c=t.data[k].r;
                    tb.data[k1].d=t.data[k].d;
                    k1++;
                }
            }
        }
    }
}

void show(TSMatrix t)
{
    int a[M][N];
    int m,n,k;
    for (m=0;m<M;m++)
    {

        for(n=0;n<N;n++)
        {
            a[m][n]=0;
        }
            
    }
    for(k=0;k<t.num;k++)
    {
        n=t.data[k].c;
        m=t.data[k].r;
        a[m][n]=t.data[k].d;
    }

    for (m=0;m<M;m++)
    {

        for(n=0;n<N;n++)
        {
            printf("%3d",a[m][n]);
        }
        printf("\n");
            
    }

}

int main()
{
    int a[6][6]={{0,12,9,0,0,0},{0,0,0,0,0,0},{-3,0,0,0,0,0},{0,0,0,24,0,0}
                   , {0,18,0,0,0,0},{15,0,0,-7,0,14}};
    
    TSMatrix t,tb;
    CreateMat(t,a);
    printf("原矩阵三元表:\n");
    DispMat(t);
    printf("矩阵为\n\n");
    show(t);
    printf("转置后三元表\n");
    TranTat(t,tb);

    DispMat(tb);
    printf("矩阵为\n\n");
    show(tb);

}


0 条评论

发表回复

Avatar placeholder

您的邮箱地址不会被公开。 必填项已用 * 标注