// 对三元组的映像特别深,关于此问题,我在输出三元表中的数据中时,用了二维数组,因此被数据结构老师不屑地笑了一顿 哈哈哈。的确,本来就是为了节省空间
// 去保存矩阵中的“有用项”,反而本末倒置地使用起了二维数组。
// 2017/10/15
#include<iostream> using namespace std; //--------三元组顺序表示方式---------- #define MAX_SIZE 10000 #define MAX_ROW_SIZE 100 #define MAX_COL_SIZE 100 typedef int ElemType; class Triple_node{ public: int i, j; // i j 分别表示非零元素的行标和列标,从1开始计数 ElemType e; friend istream& operator>>(istream &is, Triple_node &node); // 输入结点 friend ostream& operator<<(ostream &os, const Triple_node &node); // 输出结点 }; istream& operator>>(istream &is, Triple_node &node) // 输入结点 { cout << "按照(行标,列标,元素值)的格式输入非零元素:\n"; is >> node.i >> node.j >> node.e; return is; } ostream& operator<<(ostream &os, const Triple_node &node) { os << "第" << node.i << "行"<<"第" << node.j << "列为"<<node.e<<endl; return os; } class TSmatrix{ private: Triple_node data[MAX_SIZE + 1]; // data[0]未用 int row, col, nums; // 矩阵的行数、列数和非零元素个数 public: TSmatrix(); // 构造函数 void print(); // 输出矩阵(显示出0) void Transpose(TSmatrix &t); // 转置矩阵 }; TSmatrix::TSmatrix() { cout << "请输入矩阵的行数和列数:\n"; cin >> row >> col; Triple_node node; int cnt=0; while (cin>>node) { cnt++; data[cnt].i = node.i; data[cnt].j = node.j; data[cnt].e = node.e; } nums = cnt; } void TSmatrix::print() { cout << "稀疏矩阵如下所示:\n"; for (int i = 1; i <= nums; i++) { cout << data[i]; } } void TSmatrix::Transpose(TSmatrix &t) // 此处采用快速转置算法 { t.col = row; t.row = col; t.nums = nums; if (nums == 0) { cout << "原矩阵为空,无法转置\n"; return; } int num[MAX_COL_SIZE+1]; // num用以保存转置前矩阵中,每一列含有的非零元素个数 int copt[MAX_COL_SIZE+1]; // copt用以保存转置前矩阵中,每一列第一个非零元素在转置后三元组中的序号 // 初始化工作 for (int i = 1; i <= col; i++) { num[i] = 0; } for (int count = 1; count <= nums; count++) { num[data[count].j]++; // 三元组中每一列含有的非零元素值 } copt[1] = 1; for (int i = 2; i <= col; i++) { copt[i] = copt[i - 1] + num[i - 1]; } // 开始搬运每一项 int this_col, destnation; for (int origin = 1; origin <=nums; origin++) { this_col = data[origin].j; destnation = copt[this_col]; t.data[destnation].i = data[origin].j; t.data[destnation].j = data[origin].i; t.data[destnation].e = data[origin].e; copt[this_col]++; } } int main() { TSmatrix tsmatrix; TSmatrix t = tsmatrix; tsmatrix.print(); tsmatrix.Transpose(t); t.print(); }