## @【数据结构】(稀疏矩阵)

@【数据结构】(稀疏矩阵)

使用三元组存储一个稀疏矩阵,函数实现稀疏矩阵的输入,稀疏矩阵的输出,稀疏矩阵的转置,两个稀疏矩阵的加法

#include<iostream>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
#define M 10
#define N 10
typedef int Datatype;
typedef struct
{
	int row, col;        //非零元素的行、列
	Datatype data;       //非零元素值
}TruNode;                //三元组定义
#define MAX_NUM 1024
typedef struct
{
	int rows, cols;           //矩阵的行、列
	int num;                  //非零元素的个数
	TruNode data[MAX_NUM];         //三元组表
} TRUMATRIX;                      //三元组表的存储类型

void input(TRUMATRIX *&A, int m, int n)
{
	int r, c, x, k = 0;
	A->rows = m; A->cols = n;
	cout << "请输入稀疏矩阵的元素:(行,列,值),输入0 0 0结束" << endl;
	cin >> r >> c >> x;
	while (r != 0)
	{
		k++;
		A->data[k].row = r;
		A->data[k].col = c;
		A->data[k].data = x;
		cin >> r >> c >> x;
	}
	A->num = k;
}
//三元组形式输出
void output(TRUMATRIX *A)
{
	int i;
	if (A->num <= 0)     // 无非零元素时返回
		return;
	cout << "矩阵行数.矩阵列数:非零元素个数";
	cout << A->rows << '.' << A->cols << ':' << A->num << endl;
	cout << "--------------------------------------" << endl;
	for (i = 1; i <= A->num; i++)
		cout << A->data[i].row << '.' << A->data[i].col << ':' << A->data[i].data << endl;
}
//矩阵形式输出
void Output(TRUMATRIX *A)
{
	int m = A->rows;
	int n = A->cols;
	int B[10][10];
	//矩阵的全部元素都赋值为0
	for (int i = 1; i <= m; i++)
		for (int j = 1; j <= n; j++)
			B[i][j] = 0;
	//非零元素赋值
	for (int i =1; i <= A->num; i++)
		B[A->data[i].row][A->data[i].col] = A->data[i].data;
	for (int i =1 ; i <= m; i++)
	{
		for (int j = 1; j <= n; j++)
			cout << B[i][j] << "   ";
		cout << endl;
	}
}
void trans(TRUMATRIX *A)
{
	TRUMATRIX *C;
	C = (TRUMATRIX*)malloc(sizeof(TRUMATRIX));
	int p, q, col;
	C->rows = A->cols; C->cols = A->rows; C->num = A->num;
	if (C->num > 0)
	{
		q = 1;
		for (col = 1; col <= A->cols; col++)
			for (p = 1; p <=A->num; p++)
				if (A->data[p].col == col)
				{
					C->data[q].row = A->data[p].col;
					C->data[q].col = A->data[p].row;
					C->data[q].data = A->data[p].data;
					q++;
				}
	}
	cout << "转置后以三元组形式输出:" << endl;
	output(C); cout << endl;
	cout << "转置后以二维矩阵形式输出:" << endl;
	Output(C); cout << endl;
}
void AddTSM(TRUMATRIX *A, TRUMATRIX *B)
/* 三元组表示的稀疏矩阵加法: C=A+B */
{
	TRUMATRIX *C;
	C = (TRUMATRIX*)malloc(sizeof(TRUMATRIX));
	int ai, bi, ci, aj, bj, cj, ap, bp, cp;
	ap = bp = cp = 1;
	if (A->rows != B->rows || A->cols != B->cols) 
	{
		cout<<" ERROR"<<endl;
	}
	C->rows = A->rows; C->cols = A->cols;
	while (ap <= A->num && bp <= B->num) {
		ai = A->data[ap].row;
		bi = B->data[bp].row;
		if (ai > bi) {
			ci = bi;
			while (ci == B->data[bp].row)
			{
				C->data[cp].row = ci;
				C->data[cp].col= B->data[bp].col;
				C->data[cp].data = B->data[bp].data;
				++bp;
				++cp;
			}
		}
		else if (ai < bi) {
			ci = ai;
			while (ci == A->data[ap].row) 
			{
				C->data[cp].row = ci;
				C->data[cp].col = A->data[ap].col;
				C->data[cp].data = A->data[ap].data;
				++ap;
				++cp;
			}
		}
		else if (ai == bi)
		{
			ci = ai;
			aj = A->data[ap].col;
			bj = B->data[bp].col;
			if (aj > bj) 
			{
				C->data[cp].row = ci;
				C->data[cp].col = bj;
				C->data[cp].data = B->data[bp].data;
				++cp;
				++bp;
			}
			else if (aj < bj)
			{
				C->data[cp].row = ci;
				C->data[cp].col = aj;
				C->data[cp].data =A->data[ap].data;
				++cp;
				++ap;
			}
			else if (aj == bj)
			{
				if (A->data[ap].data + B->data[bp].data != 0) {
					C->data[cp].row = ci;
					C->data[cp].col = aj;
					C->data[cp].data = A->data[ap].data+ B->data[bp].data;
					++cp;
				}
				++ap;
				++bp;
			}
		}
	}
	//以上为稀疏矩阵A或B中的元素完全加完的情况
	//以下为稀疏矩阵A或B中的元素部分剩余的情况
	while (ap <= A->num)
	{
		C->data[cp].row = A->data[ap].row;
		C->data[cp].col = A->data[ap].col;
		C->data[cp].data = A->data[ap].data;
		++cp;
		++ap;
	}
	while (bp <= B->num) 
	{
		C->data[cp].row = B->data[bp].row;
		C->data[cp].col = B->data[bp].col;
		C->data[cp].data = B->data[bp].data;
		++cp;
		++bp;
	}
	C->num= --cp;
	output(C);
	cout << "二维矩阵形式输出:" << endl;
	Output(C);
}
void main()
{
	TRUMATRIX *A;
	A = (TRUMATRIX*)malloc(sizeof(TRUMATRIX));
	A->rows = 0; A->cols = 0; A->num = 0;   //初始化
	int m, n;
	cout << "输入稀疏矩阵A纬度:";
	cin >> m >> n;
	input(A, m, n);
	cout << endl;
	cout << "三元组形式输出矩阵:" << endl;
	output(A);
	cout << "二维矩阵形式输出:" << endl;
	Output(A);
	cout << endl << endl;;
	cout << "矩阵转置:" << endl;
	trans(A);

	TRUMATRIX *B;
	B = (TRUMATRIX*)malloc(sizeof(TRUMATRIX));
	B->rows = 0; B->cols = 0; B->num = 0;   //初始化
	cout << "稀疏矩阵相加:" << endl; cout << endl;
	cout << "输入同维度的稀疏矩阵B:" << endl;;
	input(B, m, n);
	AddTSM(A, B);
	system("pause");
}


测试:
输入&输出:
在这里插入图片描述
稀疏矩阵转置:
在这里插入图片描述
稀疏矩阵相加:

emmmmm相加子函数记得好像存在亿点点问题……

发布了25 篇原创文章 · 获赞 1 · 访问量 287

猜你喜欢

转载自blog.csdn.net/gsgs1234/article/details/104956502
今日推荐