用三元组实现稀疏矩阵的按列转置

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

步骤:

算法分析:

首先了解稀疏矩阵的概念:设m*n矩阵中有t个非零元素且t<<m*n,这样的矩阵称为稀疏矩阵。由此可以看出,稀疏矩阵中会有大量的零元素,如果依旧按照常规方法顺序分配那将会很浪费内存,尤其是在一些许多科学管理与工程计算中,常常会遇到阶数很高的大型稀疏矩阵。为此提出一种新的存储方法——仅仅存放非零元素。将非零元素所在的行、列以及他的值构成一个三元组(i,j,v),然后按某种规律存储三元组。

所谓矩阵转置,是指变换元素的位置上,把位于(row,col)位置上的元素转换到(col,row)位置上,也就是说,把元素的行、列互换。

程序中设计了三个函数:

①函数InitSPNode()用来建立一个稀疏矩阵的三元组表。

首先输入行数、列数和非零元的值,输入(-1,-1,-1)结束输入。

②函数showMatrix()用来输出稀疏矩阵。

算法中按矩阵a的列进行循环处理,对a的每一列扫描三元组,找出相应的元素,若找到,则交换其行号和列号,并存储到矩阵b的三元组中。

③函数TransposeSMatrix()用来完成稀疏矩阵的转置算法。

    算法主要的工作是在p和col的两重循环中完成,时间复杂度为O(n*t)。如果非零元素个数t和m*n同数量级,则算法的时间复杂度变为O(m*n^2)。

概要设计:

InitSPNode()函数

建立一个稀疏矩阵的三元组表

showMatrix()函数

输出稀疏矩阵

TransposeSMatrix()函数

完成稀疏矩阵的转置算法

程序流程图:

 

代码如下:

#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,val,row,col;//行、列、值、当前最大行、最大列
 	int k;
	row=0;col=0;
	i=j=0;
	k=0; 
	while(i!=-1&&j!=-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(row<i) row=i;
		if(col<j) col=j;
		k++;
	}
	a->m=row;
	a->n=col;
	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)
  		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;
		  }
	  }
	 
  }
  void main()
  {
  	SPMatrix a,b;
  	printf("\n 结束请输入(-1 -1 -1)\n");
	InitSPNode(&a);
	printf(" 输入矩阵为:\n");
	showMatrix(&a);//转置前 
	TransposeSMatrix(&a,&b);
	printf(" 输出矩阵为:\n");
	showMatrix(&b);//转置后 
  }

运行结果:

 

猜你喜欢

转载自blog.csdn.net/weixin_54474126/article/details/121751653