实验要求
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;
}