版权申明:
本实验的实验目的,实验内容,实验要求归东北大学所有,未经许可禁止转载。
实验四 数组
实验目的:
掌握利用三元组实现稀疏矩阵的顺序存储;掌握三元组的基本操作,实现矩阵的转置。
实验内容:
1. 通过结构体声明三元组类型和稀疏矩阵类型;
2. 实现矩阵的创建和输出;
3. 编写矩阵转置函数;
4. 在主函数中声明一个稀疏矩阵,转置后并输出。
源码:
#define MAXSIZE 12500
#include "stdafx.h"
#include <iostream>
using namespace std;
typedef int ElemType;
typedef int Status;
/***********类型定义***********/
typedef struct{
int i, j; //该非零元的行下标和列下标
ElemType e; //非零元的值
}Triple;
typedef struct{
Triple data[MAXSIZE + 1]; //三元组的最大范围
int mu, nu, tu; //三元组的行、列、值
}TSMatrix;
/***********创建三元组***********/
void CreateSMatrix(TSMatrix &M, int mu, int nu, int tu){
M.mu = mu;
M.nu = nu;
M.tu = tu;
int k ;
M.data[0].e = 0;
cout << "行数:" << mu << " 列数:" << nu << endl;
cout << "请输入:" << tu << " 个三元组(i j elem):" << endl;
for(k = 1; k <= tu; k++){
cin >> M.data[k].i >> M.data[k].j >> M.data[k].e;
}
}
/***********显示三元组***********/
void PrintSMatrix(TSMatrix M){
cout << endl;
cout << "稀疏矩阵为: " << endl;
int i, j, p;
p = 1;
for(i = 1; i <= M.mu; i++){
for(j = 1; j <= M.nu; j++){
if(M.data[p].i == i && M.data[p].j == j){
cout << M.data[p].i << " " << M.data[p].j << " " << M.data[p].e << endl;
p++;
}
}
}
cout << endl;
}
/***********矩阵转置***********/
Status TransposeSMatrix(TSMatrix M, TSMatrix &T){
cout << "##########矩阵转置##########" << endl;
int col, q, p;
T.mu = M.nu;
T.nu = M.mu;
T.tu = M.tu;
if(T.tu){
q = 1;
for(col = 1; col <= M.nu; ++col){
for(p = 1; p <= M.tu; ++p){
if(M.data[p].j == col){
T.data[q].i = M.data[p].j;
T.data[q].j = M.data[p].i;
T.data[q].e = M.data[p].e;
++q;
}
}
}
}
return OK;
}
/***********主函数***********/
int main()
{
TSMatrix A, B;
CreateSMatrix(A, 4, 4, 5);
PrintSMatrix(A);
TransposeSMatrix(A, B);
PrintSMatrix(B);
return 0;
}
注意一下,显示三元组函数那边其实没有必要比较i和j,直接循环p其实就ok了,这个bug后来也没改,毕竟这样程序也可以用==、
运行结果: