数据结构 稀疏矩阵的加减运算

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_40990854/article/details/83111523

思路:

首先是要了解矩阵的加减运算法则,即同坐标的进行加减 ,所以只需要将两个矩阵中相同的点进行加减,不同的只需要在三元数组中,要一个新的空间进行存储即可

#include<iostream>
using namespace std;

typedef
	struct Node {
		int row; // 行
		int col; // 列
		int data;
	}Node;

void initList(Node *, int);					// 初始化三元数组
int inputList(Node *, int[][3], int, int);	// 将 稀疏矩阵的数据存入三元数组中
void printList(Node *, int);				// 打印三元数组
void transpositionList(Node * list, int);	// 矩阵的转置
void sort(Node *, int);						// 矩阵转置后的对 行 进行排序

void puls(Node *, int&, Node *, int);		// 矩阵相加,结果为 前一个矩阵
int check(Node *, int,int ,int );			// 在第二个矩阵中 查找 和 第一个矩阵相同的位置坐标,并返回 数据

void Minus(Node *, int&, Node *, int);		// 矩阵相减,结果为 前一个矩阵

int main(void) {
	int arr1[5][3] = { {0,0,1},
					   {2,0,0},
					   {0,3,0},
					   {4,0,0},
					   {5,0,0} };
	Node list1[5 * 3];
	initList(list1, 15);
	int len1 = inputList(list1, arr1, 5, 3);
	cout << "第一个转置前:" << endl;
	printList(list1, len1);
	transpositionList(list1, len1);
	cout << "第一个转置后:" << endl;
	printList(list1, len1);
	cout << "=======================" << endl;
	int arr2[5][3] = { {0,0,1},
					   {2,0,0},
					   {0,3,0},
					   {4,0,0},
					   {5,0,1} };
	Node list2[5 * 3];
	initList(list2, 15);
	int len2 = inputList(list2, arr2, 5, 3);
	cout << "第二个转置前:" << endl;
	printList(list2, len2);
	transpositionList(list2, len2);
	cout << "第二个转置后:" << endl;
	printList(list2, len2);

	cout << "=======================" << endl;
	cout << "矩阵相加:" << endl;
	puls(list1, len1, list2, len2);
	printList(list1, len1);

	cout << "=======================" << endl;
	cout << "矩阵相减:" << endl;
	Minus(list1, len1, list2, len2);
	printList(list1, len1);
	return 0;
}
// 在一个存储中查找相同坐标的点,并返回这个点的数据域部分,并且将此数据域改为 0 ,以便两个矩阵有不相交的点的运算
int check(Node * list2, int len2, int row, int col) {
	for (int i = 0; i < len2; i++)
	{
		if (list2[i].row == row && list2[i].col == col) {
			int tmpNumber = list2[i].data;
			list2[i].data = 0;
			return tmpNumber;
		}
	}
	return 0;
}

void Minus(Node * list1, int& len1, Node * list2, int len2)
{
	for (int i = 0; i < len1; i++)
	{
		list1[i].data -= check(list2, len2, list1[i].row, list1[i].col);
		//cout << check(list2, len2, list1[i].row, list1[i].col) << " ";
	}

	for (int i = 0; i < len2; i++)
	{
		if (list2[i].data != 0)
		{
			list1[len1] = list2[i];
			list1[len1].data = -list1[len1].data;
			len1++;
		}
	}
	sort(list1, len1);
}

void puls(Node * list1, int& len1, Node * list2, int len2) 
{
	for (int i = 0; i < len1;i ++)
	{
		list1[i].data += check(list2, len2, list1[i].row, list1[i].col);
	}

	for (int i = 0; i < len2; i++)
	{
		if (list2[i].data != 0)
		{
			list1[len1++] = list2[i];
		}
	}
	sort(list1,len1);
}

void printList(Node * list, int n)
{
	for (int i = 0; i < n; i++)
	{
		if (list[i].data != 0)
		{
			cout << list[i].row << " " << list[i].col << " " << list[i].data << endl;
		}
	}
	cout << endl;
}

void transpositionList(Node * list, int len)
{
	for (int i = 0; i < len; i++)
	{
		int tmp = list[i].row;
		list[i].row = list[i].col;
		list[i].col = tmp;
	}
	sort(list, len);
}

void sort(Node * list, int len)
{
	for (int i = 1; i < len; i++)
	{
		for (int j = 0; j < len - i; j++)
		{
			if (list[j].row > list[j + 1].row)
			{
				Node tmp = list[j];
				list[j] = list[j + 1];
				list[j + 1] = tmp;
			}
		}
	}
}

int inputList(Node * list, int a[][3], int row, int col)
{
	int count = 0;
	for (int i = 0; i < row; i++)
	{
		for (int j = 0; j < col; j++)
		{
			if (a[i][j] != 0)
			{
				list[count].row = i;
				list[count].col = j;
				list[count++].data = a[i][j];
			}
		}
	}
	return count;
}

void initList(Node * list, int n)
{
	int i;
	for (i = 0; i < n; i++) 
	{
		list[i].col = 0;
		list[i].row = 0;
		list[i].data = 0;
	}
}

猜你喜欢

转载自blog.csdn.net/qq_40990854/article/details/83111523
今日推荐