数据结构——稀疏矩阵的转置

熟悉稀疏矩阵的三元组顺序存储方式。

稀疏矩阵如图所示,输出矩阵和三元组表用转置算法;
求转置矩阵并输出转置后的矩阵和三元组表
在这里插入图片描述

#include <malloc.h>
#include <stdio.h> 

int main(int argc, char** argv) {
	
	ElemType a[8][8]={{0,0,-3,0,0,0,0,0},
					  {0,0,0,0,0,0,37,0},
					  {0,0,0,0,0,0,0,0},
					  {0,0,0,24,0,0,0,0},
					  {0,0,0,0,0,0,0,0},
					  {0,15,0,0,0,0,0,0},
					  {0,0,0,0,0,0,88,0},
					  {0,0,0,0,0,0,0,0},
					  };
	TSMatrix MM;
	CreatMat(MM,a);
	printf("初始矩阵为:\n");
	DispMatrix(MM);
	printf("矩阵的三元组顺序表为:\n");	
	DispMat(MM);
	
	printf("\n\n"); 

	TSMatrix T;
	TranTat(MM,T); 
	printf("转置后矩阵为:\n");
	DispMatrix(T);
	printf("\n转置后的三元组顺序表为:\n");	
	DispMat(T);

	return 0;
}
typedef int ElemType;
#define M 8
#define N 8

#define MaxSize 100

typedef struct {
     int r;
	 int c;   //该非零元的行下标和列下标
     ElemType  d;   //该非零元的值
 }TupNode;     // 三元组类型
typedef struct{
    TupNode data[MaxSize]; 
    int rows;
	int cols;
	int nums; // 行数、列数、非零元个数
}TSMatrix;    // 稀疏矩阵类型

void CreatMat(TSMatrix &t,ElemType A[M][N])
{
	int i,j; 	
	t.rows=M; t.cols=N; t.nums=0;
	for(i=0;i<M;i++)
	{
		for(j=0;j<N;j++)
		if(A[i][j]!=0)		//只存储非零元素
        {  
			t.data[t.nums].r=i;
            t.data[t.nums].c=j;
     	    t.data[t.nums].d=A[i][j];
            t.nums++;
        }
    }
}

void DispMatrix(TSMatrix TM)		//输出矩阵 
{
	int row=TM.rows;
	int col=TM.cols;
	int num=TM.nums;
	
	bool flag=true;
	int z=0;
	
	for(int i=0;i<row;i++)
	{
		for(int j=0;j<col;j++)
		{
			for(int z=0;z<num;z++)
			{
				if(TM.data[z].r == i && TM.data[z].c == j)
				{
					printf("%4d",TM.data[z].d);
					flag = false;
				}	
			}
			if(flag==true)
			{
				printf("%4d",0);	
			}
			else
			{
				flag = true;
			}
		}
		printf("\n");
	}
}

void DispMat(TSMatrix t)    //输出三元组
{
	int i;
	if(t.nums<=0) return;
	printf("\t%d\t%d\t%d\n",t.rows,t.cols,t.nums);
    printf("  ----------------------------\n");
    for(i=0;i<t.nums;i++)
		printf("\t%d\t%d\t%d\n",t.data[i].r, t.data[i].c, t.data[i].d);
}

void TranTat(TSMatrix t,TSMatrix &tb)	//转置 
{
	int p,q=0,v;				//q为tb.data的下标
	tb.rows=t.cols;tb.cols=t.rows;tb.nums=t.nums;
	if (t.nums!=0)			//当存在非零元素时执行转置
	{
		for (v=0;v<t.cols;v++)		
		//tb.data[q]中的记录以c域的次序排列
	    for (p=0;p<t.nums;p++)	//p为t.data的下标
	    	if (t.data[p].c==v)
	        {      
				tb.data[q].r=t.data[p].c;
				tb.data[q].c=t.data[p].r;
				tb.data[q].d=t.data[p].d;
				q++;
			}
	}
}

运行效果:在这里插入图片描述

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值