数据结构实验三:利用三元组表实现矩阵相加

实验要求
1、实现数组的压缩存储及应用;
2、实验报告格式及图表清晰;
3、如有雷同,均算抄袭,按零分处理。
代码:

#include<iostream>
#include<stdio.h> 
#include<stdlib.h> 
#include<algorithm>
using namespace std;

const int N = 1000;

struct node
{
	int i, j;
	int e;
};
struct Matrix
{
	node data[N];
	int m;
	int n;
	int t;
};
bool cmp(node a,node b) {
	if (a.i == b.i) {
		return a.j < b.j;
	}
	else {
		return a.i < b.i;
	}
}
void initMatrix(Matrix * a)
{
	int k;
	k = 1;
	cout << "输入以 -1 -1 0 结束" << endl;
	while (true)
	{
		int i, j, e;
		cin >> i >> j >> e;
		if (i == -1 || j == -1) break;
		if (i > a->m || j > a->n) continue;
		a->data[k].i = i;
		a->data[k].j = j;
		a->data[k].e = e;
		k++;
	}
	a->t = k-1;
	sort(a->data+1, a->data + a->t+1, cmp);
	cout << "创建成功!" << endl;
}
void printMatrix(Matrix* a)
{
	int i, j, k = 1;
	for (i = 1; i <= a->m; i++)
	{
		for (j = 1; j <= a->n; j++)
		{
			if (i == a->data[k].i && j == a->data[k].j)
			{
				cout << a->data[k].e << ' ';
				k++;
			}
			else
				cout << "0 ";
		}
		putchar(10);
	}
}

void printMatrix(Matrix* a, int n) {
	//n做辨识重载函数之用
	for (int i = 1; i <= a->t; i++) {
		cout << a->data[i].i << ' ' << a->data[i].j << ' ' << a->data[i].e << endl;
	}
}

void addMatrix(Matrix* a, Matrix* b)
{
	int i, j, k = 1, n = 1;
	for (i = 1; i <= a->m; i++)
	{
		for (j = 1; j <= a->n; j++)
		{
			if (i == a->data[k].i && j == a->data[k].j)
			{
				if (i == b->data[n].i && j == b->data[n].j)
				{
					cout << a->data[k].e + b->data[n].e << ' ';
					k++;
					n++;
				}
				else
				{
					cout << a->data[k].e << ' ';
					k++;
				}
			}
			else
			{
				
				if (i == b->data[n].i && j == b->data[n].j)
				{
					cout << b->data[n].e << ' ';
					n++;
				}
				else
					cout << "0 ";
			}
		}
		putchar(10);
	}
}

void addMatrix(Matrix* a, Matrix* b, Matrix* c) {
	c->t = 0;
	for (int i = 1; i <= a->t; i++) {
		c->data[i].i = a->data[i].i;
		c->data[i].j = a->data[i].j;
		c->data[i].e = a->data[i].e;
		c->t++;
	}
	int cnt = c->t+1;
	for (int i = 1; i <= b->t; i++) {
		int flag = 0;
		for (int j = 1; j <= a->t; j++) {
			if (b->data[i].i == c->data[j].i && b->data[i].j == c->data[j].j) {
				flag = 1;
				if(a->data[j].e + b->data[i].e != 0) {
					c->data[j].e = a->data[j].e + b->data[i].e;
				}
				else {
					int f = j;
					while (f < cnt) {
						c->data[f] = c->data[f + 1];
						f++;
					}
					cnt--;
					c->t--;
				}
			}
		}
		if(!flag){
			c->data[cnt].i = b->data[i].i;
			c->data[cnt].j = b->data[i].j;
			c->data[cnt].e = b->data[i].e;
			c->t++;
			cnt++;
		}
	}
	sort(c->data+1, c->data + c->t+1, cmp);
	printMatrix(c,1);
}
int main()
{
	int k;
	do
	{
		int row, col;
		system("CLS");
		Matrix a, b, c;
		Matrix* pa = &a, * pb = &b, * pc = &c;
		cout << " 请输入你要创建的矩阵的行列数: ";
		cin >> row >> col;
		pa->m = row;
		pa->n = col;
		pb->m = row;
		pb->n = col;
		pc->n = col;
		pc->m = row;
		cout << " 输入三元组表 a 非零元素的位置和值,";
		initMatrix(pa);
		cout << " 输入三元组表 b 非零元素的位置和值,";
		initMatrix(pb);
		cout << " 三元组表示的矩阵 a 为:" << endl;
		printMatrix(pa);
		cout << " 三元组表示的矩阵 b 为:" << endl;
		printMatrix(pb);
		//cout << " 三元组表示的矩阵 a+b 为:" << endl;
		//addMatrix(pa, pb);
		cout << " 输出三元组矩阵 a+b 的线性表示:" << endl;
		addMatrix(pa, pb, pc);
		cout << " 是否继续测试 :" << endl;
		cout << " 1. 是   2. 否" << endl;
		cout << " 输入你的选择: ";
		cin >> k;
		while (k != 1 && k != 2)
		{
			cout << " 输入有误 !请重新输入你的选择 :";
			cin >> k;
		}
	} while (k == 1);
	return 0;
}
  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值