【数据结构】(八)稀疏矩阵的加法和乘法运算(代码)

稀疏矩阵的加法和乘法运算

【数据结构】(八)稀疏矩阵的加法和乘法运算(代码)_第1张图片
上节学了类的友元,这节开始矩阵加法和乘法运算:
(一)加法:
三元组.h文件

#pragma once
#include
using namespace std;
#include 
#define Max 100
#define ERROR 0
#define OK 1

typedef struct  //三元组
{
     
	int line;   //行
	int row;    //列
	int item;   //值
}Trip;


class TripMN
{
     
private:
	Trip  dat[Max];
	int L, R, num;   //行 ,列, 非零元个数
public:
	TripMN()       //自我构造
	{
     
		L = 0;
		R = 0;
		num = 0;
	}

	TripMN(int m, int n)   //创建对象时完成对属性的初始化
	{
     
		L = m;
		R = n;
		num = 0;
	}

	~TripMN()
	{
     
		//空
	}

	int set_Item(int line, int row, int item)   //根据行号列号添加一个三元组
	{
     
		//******检查******//
		if (line > L || row > R)  //越界
		{
     
			return ERROR;
		}
		if (num == Max)    //已存元素个数num达到过三元组可以存储的最大位
		{
     
			return ERROR;
		}
		if (item == 0)     //输入的数组元素值为0,则不做插入,直接返回
		{
     
			return OK;
		}
		//******插入*******//
		int index = 0;   //存储元素应该插入的位置
		while (index < num)    
		{
     
			    //作比较时看你时先插第一行之后下一行,然后在下一行,三元组如果是按这个方式,就先查行进行插入
			if (line>dat[index].line)    
			{
     
				index++;        //先比行,行小于三元组行时,向后继续比较
			}
			else if (line == dat[index].line && (row > dat[index].row))
			{
     
				index++;        //当行相等,列号大的时候,向后继续比较
			}
			else
			{
     
				break;          //找到了位置
			}
		}
		if (line == dat[index].line && row == dat[index].row)
		{
     
			dat[index].item = item;  //如果所插正好相等,就覆盖
		}
		for (int i = num ; i > index ; i--)
		{
     
			dat[i].line = dat[i - 1].line;
			dat[i].row = dat[i - 1].row;
			dat[i].item = dat[i - 1].item;     //**从尾部开始移位
		}
		dat[index].item = item;     //插入
		dat[index].line = line;
		dat[index].row = row;
		num++;    //个数加一
		return OK;
	}

	int get_Ttem(int line, int row)   //根据行号和列号获得一个三元组
	{
     
		if (line > L || row > R)   //越界检查
		{
     
			return 0;
		}
		
		for (int i = 0; i < num; i++)   //遍历三元组
		{
         //如果发现行号列号匹配三元组,返回非零元素值
			if (dat[i].line == line && dat[i].row == row)
			{
     
				return dat[i].item;
			}
		}
		return 0;	
	}

	void  printMatrix()    //按矩阵方式打印稀疏矩阵
	{
     
		int index = 0;   //三元组下标
		cout << "《打印稀疏矩阵》: " << endl;
		for (int i = 1; i <= L; i++)
		{
     
			for (int j = 1; j <= R; j++)
			{
     
				if (i == dat[index].line && j == dat[index].row)
				{
     
					cout << dat[index].item << "\t";
					index++;
				}
				else
				{
     
					cout << "0\t";
				}
			}
			cout << "\n";
		}
		cout << "矩阵行数: " << L << "\n" << "矩阵列数:" << R << "\n" << "矩阵非零元个数: " << num << endl;
	}

	void printTrip()     //打印三元组
	{
     
		cout << "\n";
		int index = 0;
		cout << "打印三元组数组(行,列,值): " << endl;
		for(int i = 0; i < num; i++)
		{
     
			cout << "(" << dat[i].line << ", " << dat[i].row << ", " << dat[i].item << ")" << endl;
		}
	}

	friend bool TripADD(TripMN& A, TripMN& B, TripMN& C);    //加法 ,矩阵:A+B=C 友元
};                                                            //需要被传出去的才加&

bool TripADD(TripMN& A, TripMN& B, TripMN& C)
{
     
	if (A.L != B.L || B.L != C.L || A.R != B.R || B.R != C.R )
	{
     
		return false;   //检查行列是否相等,矩阵加法前提
	}
	else
	{
     
		for (int i = 0; i < A.L; i++)
		{
     
			for (int j = 0; j < A.R; j++)
			{
     
				int item = A.get_Ttem(i,j) + B.get_Ttem(i,j);  //将A,B矩阵值相加
				//如果计算出来不为零,则插入矩阵之中
				if (item != 0)
				{
     
					C.set_Item(i, j, item);
				}
			}
		}
		return true;
	}
}

三元组.cpp文件

#include"三元组.h"

void input(int m,int n, int num, TripMN& trip)     //初始化三元组
{
     
	int line, row, item;
	for (int i = 1; i <= num; i++)
	{
     
		cout << "请依次输入,行,列,和非零元:";
		cin >> line >> row >> item;
		if (item != 0)
		{
     
			if(trip.set_Item(line, row, item)==ERROR)
			{
     
				cout << "行号列号不正确,或者三元组已满 !!!";
				break;
			}
		}
	}
}


int main()
{
      
	int m, n, num;
	cout << "请输入第(一)个矩阵A行数列数,非零元个数: ";
	cin >> m;
	cin >> n;
	cin >> num;
	TripMN A(m,n);     //类的人工初始化
	input(m, n, num, A);    //创建一个矩阵
	//trip.printTrip();
	A.printMatrix();

	cout << "请输入第(二)个矩阵B行数列数,非零元个数: ";
	cin >> m;
	cin >> n;
	cin >> num;
	TripMN B(m, n);     //类的人工初始化
	input(m, n, num, B);    //创建一个矩阵
	//trip.printTrip();
	B.printMatrix();

	TripMN C(m, n);
	bool resurt = TripADD(A, B, C);
	if (resurt)
	{
     
		cout << "矩阵相加后C:" << endl;
		C.printMatrix();
	}
	else
	{
     
		cout << "矩阵不能相加!!!" << endl;
	}
	return 0;
}

【数据结构】(八)稀疏矩阵的加法和乘法运算(代码)_第2张图片

(二).乘法:
有i,j, k三个变量,i表示A矩阵的行,j表示A矩阵的列==B矩阵的行,k表示B矩阵的列。
【数据结构】(八)稀疏矩阵的加法和乘法运算(代码)_第3张图片
.h文件

#pragma once
#include
using namespace std;
#include 
#define Max 100
#define ERROR 0
#define OK 1

typedef struct  //三元组
{
     
	int line;   //行
	int row;    //列
	int item;   //值
}Trip;


class TripMN
{
     
private:
	Trip  dat[Max];
	int L, R, num;   //行 ,列, 非零元个数
public:
	TripMN()       //自我构造
	{
     
		L = 0;
		R = 0;
		num = 0;
	}

	TripMN(int m, int n)   //创建对象时完成对属性的初始化
	{
     
		L = m;
		R = n;
		num = 0;
	}

	~TripMN()
	{
     
		//空
	}

	int set_Item(int line, int row, int item)   //根据行号列号添加一个三元组
	{
     
		//******检查******//
		if (line > L || row > R)  //越界
		{
     
			return ERROR;
		}
		if (num == Max)    //已存元素个数num达到过三元组可以存储的最大位
		{
     
			return ERROR;
		}
		if (item == 0)     //输入的数组元素值为0,则不做插入,直接返回
		{
     
			return OK;
		}
		//******插入*******//
		int index = 0;   //存储元素应该插入的位置
		while (index < num)    
		{
     
			    //作比较时看你时先插第一行之后下一行,然后在下一行,三元组如果是按这个方式,就先查行进行插入
			if (line>dat[index].line)    
			{
     
				index++;        //先比行,行小于三元组行时,向后继续比较
			}
			else if (line == dat[index].line && (row > dat[index].row))
			{
     
				index++;        //当行相等,列号大的时候,向后继续比较
			}
			else
			{
     
				break;          //找到了位置
			}
		}
		if (line == dat[index].line && row == dat[index].row)
		{
     
			dat[index].item = item;  //如果所插正好相等,就覆盖
		}
		for (int i = num ; i > index ; i--)
		{
     
			dat[i].line = dat[i - 1].line;
			dat[i].row = dat[i - 1].row;
			dat[i].item = dat[i - 1].item;     //**从尾部开始移位
		}
		dat[index].item = item;     //插入
		dat[index].line = line;
		dat[index].row = row;
		num++;    //个数加一
		return OK;
	}

	int get_Ttem(int line, int row)   //根据行号和列号获得一个三元组
	{
     
		if (line > L || row > R)   //越界检查
		{
     
			return 0;
		}
		
		for (int i = 0; i < num; i++)   //遍历三元组
		{
         //如果发现行号列号匹配三元组,返回非零元素值
			if (dat[i].line == line && dat[i].row == row)
			{
     
				return dat[i].item;
			}
		}
		return 0;	
	}

	void  printMatrix()    //按矩阵方式打印稀疏矩阵
	{
     
		int index = 0;   //三元组下标
		cout << "《打印稀疏矩阵》: " << endl;
		for (int i = 1; i <= L; i++)
		{
     
			for (int j = 1; j <= R; j++)
			{
     
				if (i == dat[index].line && j == dat[index].row)
				{
     
					cout << dat[index].item << "\t";
					index++;
				}
				else
				{
     
					cout << "0\t";
				}
			}
			cout << "\n";
		}
		cout << "矩阵行数: " << L << "\n" << "矩阵列数:" << R << "\n" << "矩阵非零元个数: " << num << endl;
	}

	void printTrip()     //打印三元组
	{
     
		cout << "\n";
		int index = 0;
		cout << "打印三元组数组(行,列,值): " << endl;
		for(int i = 0; i < num; i++)
		{
     
			cout << "(" << dat[i].line << ", " << dat[i].row << ", " << dat[i].item << ")" << endl;
		}
	}

	friend bool TripADD(TripMN& A, TripMN& B, TripMN& C);    //加法 ,矩阵:A+B=C 友元
															  //需要被传出去的才加&
	friend bool TripXXX(TripMN& A, TripMN& B, TripMN& C);    //乘法法则

};                                                            

bool TripXXX(TripMN& A, TripMN& B, TripMN& C)
{
     
	int sum;
	if (A.R != B.L)
	{
     
		return false;
	}
	else
	{
     
		for (int i = 1; i <= A.L; i++)
		{
     
			for (int j = 1; j <= B.R; j++)
			{
     
				sum = 0;
				for (int k = 1; k <= A.R; k++)   //A.R==B.L
				{
     
					sum = A.get_Ttem(i, k) * B.get_Ttem(k, j) + sum;  //行列分别相加
				}
				if(sum!=0)
				C.set_Item(i, j, sum);
			}
		}
		return true;
	}
}

bool TripADD(TripMN& A, TripMN& B, TripMN& C)
{
     
	if (A.L != B.L || B.L != C.L || A.R != B.R || B.R != C.R )
	{
     
		return false;   //检查行列是否相等,矩阵加法前提
	}
	else
	{
     
		for (int i = 0; i < A.L; i++)
		{
     
			for (int j = 0; j < A.R; j++)
			{
     
				int item = A.get_Ttem(i,j) + B.get_Ttem(i,j);  //将A,B矩阵值相加
				//如果计算出来不为零,则插入矩阵之中
				if (item != 0)
				{
     
					C.set_Item(i, j, item);
				}
			}
		}
		return true;
	}
}

.cpp文件

#include"三元组.h"

void input(int m,int n, int num, TripMN& trip)     //初始化三元组
{
     
	int line, row, item;
	for (int i = 1; i <= num; i++)
	{
     
		cout << "请依次输入,行,列,和非零元:";
		cin >> line >> row >> item;
		if (item != 0)
		{
     
			if(trip.set_Item(line, row, item)==ERROR)
			{
     
				cout << "行号列号不正确,或者三元组已满 !!!";
				break;
			}
		}
	}
}


int main()
{
      
	int m, n, num;
	cout << "请输入第(一)个矩阵A行数列数,非零元个数: ";
	cin >> m;
	cin >> n;
	cin >> num;
	int CL = m;     //乘法中C矩阵的行
	TripMN A(m,n);     //类的人工初始化
	input(m, n, num, A);    //创建一个矩阵
	//trip.printTrip();
	A.printMatrix();
	cout << endl;

	cout << "请输入第(二)个矩阵B行数列数,非零元个数: ";
	cin >> m;
	cin >> n;
	cin >> num;
	int CR = n;    //乘法中C矩阵的列
	TripMN B(m, n);     //类的人工初始化
	input(m, n, num, B);    //创建一个矩阵
	//trip.printTrip();
	B.printMatrix();
	cout << endl;

	TripMN C(CL,CR);
	bool resurt = TripXXX(A, B, C);
	if (resurt)
	{
     
		cout << "矩阵相乘后C:" << endl;
		C.printMatrix();
	}
	else
	{
     
		cout << "矩阵不能相乘!!!" << endl;
	}
	return 0;
}

【数据结构】(八)稀疏矩阵的加法和乘法运算(代码)_第4张图片

你可能感兴趣的:(数据结构,数据结构,稀疏矩阵的加法和乘法,算法)