2651 - 数据结构/稀疏矩阵/三元组实现

通过次数

0

提交次数

0

时间限制 : 1 秒 内存限制 : 32 MB

实验原理:稀疏矩阵是指非零元素较少的矩阵,如果采用二维数组存储将会导致很大的存储空间浪费。我们可以使用(行号,列号,非零元素值)的三元组的顺序表来存储矩阵中的非零值,这样就可以不存储大量的零元素。

需要注意的是:为了操作高效,我们需要将非零元素按照行顺序排列,同一行里面按列排列。

 

实验步骤

1、实现三元组定义

2、实现稀疏矩阵定义

3、实现稀疏矩阵的元素添加方法

4、实现稀疏矩阵的输出方法

5、实现稀疏矩阵的加法

6、实现稀疏矩阵的减法

7、实现稀疏矩阵的转置

题目输入

每个输入由两个矩阵A和B组成,每个矩阵本身就按三元组的方式输入:每个矩阵的第一行由三个整数组成,n、m和c,表示矩阵的行列数和非零元素数量。

 

题目输出

输出固定文本:A'

然后输出A的转置

 

输出固定文本:A+B

然后输出A+B的结果

 

输入/输出样例

输入格式

3 3 2
0 0 5
1 2 7
3 3 2
0 0 5
2 1 9

输出格式

A'
3 3 2
(0,0)=5
(2,1)=7
A+B
3 3 3
(0,0)=10
(1,2)=7
(2,1)=9

C++解答

// Matrix.cpp : 程欣宇2014年5月7日

#include "stdio.h"
#include "memory.h"

struct Triple{
	int row,col;
	float data;
	Triple(){row=0,col=0,data=0;}
	Triple(int r,int c,float d)
	{
		row=r;col=c;data=d;
	}
	void Show()
	{
		printf("(%d,%d)=%.0f\n",row,col,data);
	}
};

#define MAX_SIZE 100	
struct SparseMatrix
{
	int rows,cols;
	int count;
	Triple elems[MAX_SIZE];
	SparseMatrix(int r,int c)
	{
		rows=r;
		cols=c;
		count=0;
	}

	void AddElement(Triple &t)
	{
		elems[count++]=t;
	}
	void AddElement(int r,int c,float data)
	{
		elems[count++]=Triple(r,c,data);
	}

	SparseMatrix& Transpose()
	{
		SparseMatrix* result=new SparseMatrix(cols,rows);
		result->count=count;//转置前后元素数量不变
		int num[100];
		int cpos[100];
		memset(num,0,sizeof(num));
		memset(cpos,0,sizeof(cpos));
		//统计列的元素数量
		for (int i=0;i<count;i++)
			num[elems[i].col]++;
		//统计每行出现在数组中的开始位置
		for (int i=1;i<cols;i++)
			cpos[i]=cpos[i-1]+num[i-1];
		
		for (int i=0;i<count;i++)
		{
			Triple triple=elems[i];
			result->elems[cpos[triple.col]++]=Triple(triple.col,triple.row,triple.data);
		}
		

		return *result;
	}

	SparseMatrix& Add(SparseMatrix &other)
	{
		SparseMatrix* result=new SparseMatrix(rows,cols);
		//完成元素相加result=this+other
		int i=0,j=0;
		Triple a=elems[i++];
		Triple b=elems[j++];
		while(i<=count && j<=other.count)
		{
			if (a.row==b.row && a.col==b.col)
			{
				result->AddElement(a.row,a.col,a.data+b.data);
				a=elems[i++];
				b=other.elems[j++];
			}else if (a.row<b.row || a.row==b.row && a.col<b.col)
			{
				result->AddElement(a);
				a=elems[i++];
			}else
			{
				result->AddElement(b);
				b=other.elems[j++];
			}
		}
		while (i<=count)
		{
			result->AddElement(a);
			a=elems[i++];
		}
		while (j<=other.count)
		{
			result->AddElement(b);
			b=other.elems[j++];
		}
		return *result;
	}
	SparseMatrix& Sub(SparseMatrix &other)
	{
		SparseMatrix* result=new SparseMatrix(rows,cols);
		//完成元素相减result=this-other
		return *result;
	}

	void ShowTriple()
	{
		printf("%d %d %d\n",rows,cols,count);
		for (int i=0;i<count;i++)
			elems[i].Show();
	}

	void ShowFull()
	{
		int index=0;
		Triple triple=elems[index++];
		for (int r=0;r<rows;r++)
		{
			for (int c=0;c<cols;c++)
			{
				if (r==triple.row && c==triple.col)
				{
					printf("%.2f\t",triple.data);
					triple=elems[index++];
				}
				else
					printf("%d\t",triple.data);
			}
			printf("\n");
		}
		printf("\n");
	}
};

int main()
{
	int n,m,count;
	int r,c,d;
	while(scanf("%d%d%d",&n,&m,&count)==3)
	{
		SparseMatrix A(n,m);
		for (int i=0;i<count;i++)
		{
			scanf("%d%d%d",&r,&c,&d);
			A.AddElement(r,c,d);
		}
		scanf("%d%d%d",&n,&m,&count);
		SparseMatrix B(n,m);
		for (int i=0;i<count;i++)
		{
			scanf("%d%d%d",&r,&c,&d);
			B.AddElement(r,c,d);
		}
		printf("A'\n");
		A.Transpose().ShowTriple();
		printf("A+B\n");
		A.Add(B).ShowTriple();
	}

	return 0;
}