@【数据结构】(稀疏矩阵)
使用三元组存储一个稀疏矩阵,函数实现稀疏矩阵的输入,稀疏矩阵的输出,稀疏矩阵的转置,两个稀疏矩阵的加法
#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相加子函数记得好像存在亿点点问题……