顺序存储结构来表示三元组表,则可以的稀疏矩阵的一种压缩形式。三元组表又称有序的双下标法,它的特点是,非零元素在表中有序存储,因此便于进行依行顺序处理矩阵运算。
1.需求分析:
(1) 输入的形式和输入值的范围:无需自己输入数据,程序是可以自动生成一个稀疏矩阵并输出在界面中。
(2)输出的形式:建立成功后会将三元组表中的数据按照每个元素所在的行号,列号输出元素值;稀疏矩阵的加法则基于三元组表,将两个三元组表的元素进行合并成一个三元组表,然后按照合成的三元组表输出稀疏矩阵信息。
(3) 程序所能达到的功能:
1.自动创立三元组表和稀疏矩阵并显示。
2.稀疏矩阵的加法,赋值等功能。
3.稀疏矩阵的普通转置与快速转置。
4.根据一个稀疏矩阵,显示出稀疏矩阵对应的三元组表。
2. 概要设计
基于三元组表的稀疏矩阵定义如下:
ADT {
基础操作:
Init_Matrix(&T)
操作结果:初始化一个稀疏矩阵T,并对三元组表进行赋值。
Show_Maxtrix(T)
初始条件: 稀疏矩阵T已存在。
操作结果:显示出稀疏矩阵T.
transMartix(T)
初始条件: 稀疏矩阵T已存在。
操作结果:将稀疏矩阵T转置并输出转置后的稀疏矩阵。
QuickTransMartix(M,&t)
初始条件: 稀疏矩阵T已存在。
操作结果:通过快速转置的方法,把稀疏矩阵T转置,并赋值给稀疏矩阵M中。并显示转置后的稀疏矩阵M。
Posistion(T)
初始条件: 稀疏矩阵T已存在。
操作结果:计算并显示稀疏矩阵T各行第一个非零元素在三元组中的下标。
SetMatrix(&T)
初始条件: 稀疏矩阵T已存在。
操作结果:对稀疏矩阵T进行赋值操作,并输出稀疏矩阵T。
addMatrux(&T)
初始条件: 稀疏矩阵T已存在。
操作结果:将把另一个三元组表对应的稀疏矩阵进行相加到稀疏矩阵T上,然后输出稀疏矩阵T。
Show_Tuple(T)
初始条件:稀疏矩阵 T已存在。
操作结果:显示一个稀疏矩阵T的三元组表的表示方法。
CopyMatrix(&T)
初始条件:稀疏矩阵 T已存在。
操作结果:将稀疏矩阵T赋值给另外一个稀疏矩阵T1,并输出稀疏矩阵T1.
MultiMatrix(&T)
初始条件:稀疏矩阵 T已存在。
操作结果:将稀疏矩阵T与另一个稀释矩阵相乘,并把结果存在T中,运算结束好输出结果T。
}
菜单如下:
while (flag) {
cout << "****************测试稀疏矩阵的操作****************" << endl;
cout << " (采用三元组表顺序存储) " << endl;
cout << "1.求稀疏矩阵的转置矩阵" << endl;
cout << "2.快速求稀疏矩阵的转置矩阵" << endl;
cout << "3.计算稀疏矩阵各行第一个非零元素在三元组中的下标" << endl;
cout << "4.稀疏矩阵的赋值运算" << endl;
cout << "5.求稀疏矩阵的加法" << endl;
cout << "6.求稀疏矩阵的乘积" << endl;
cout << "7.显示稀疏矩阵的三元组表示" << endl;
cout << "8.随机生成稀疏矩阵" << endl;
cout << "9.用已有的稀疏矩阵初始化一个新矩阵" << endl;
cout << "10.输入稀疏矩阵的三元组表" << endl;
show_Maxtrix(T);
cout << endl;
cout << "请输入与你的选择(1-10 其他退出程序):"; int ch; cin >> ch;
三元组表定义如下:
typedef struct {
int i, j; //该非零元的行下标和列下表
Elemtype e;
}Triple;
typedef struct {
Triple data[MAXSIZE + 1];//非零三元组表,data[0]未用
int mu, nu, tu; //矩阵的行数,列数和非零元的个数
}TSMatrix;
几个重要的操作函数如下:
1.快速转置函数:
Statues quickTransMartix(TSMatrix M, TSMatrix& T) {
T.mu = M.mu; T.nu = M.nu; T.tu = M.tu;
if (T.tu) {
int num[10] = { 0 };
int copt[10] = { 0 };
for (int col = 1; col <= M.nu; ++col) num[col] = 0;
for (int t = 1; t <= M.tu; ++t) ++num[M.data[t].j];
copt[0] = 0;
for (int col = 1; col < M.nu; ++col) copt[col] = copt[col - 1] + num[col - 1];
int q;
for (int p = 1; p <= M.tu; p++) {
int col = M.data[p].j;
q = copt[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;
++copt[col];
}
}
int arry[10][10] = { 0 };
for (int i = 0; i < T.tu; i++) {
arry[T.data[i].i][T.data[i].j] = T.data[i].e;
}
cout << "**************************************" << endl;
cout << " ";
for (int i = 1; i <= T.nu; i++) cout << "[" << i << "]" << " ";
cout << endl;
for (int i = 1; i <= T.mu; i++) {
cout << "[" << i << "]" << " ";
for (int j = 1; j <= T.nu; j++) {
cout << arry[i][j] << " ";
}
cout << endl;
}
cout << "**************************************" << endl;
system("pause");
return OK;
}
计算稀疏矩阵各行第一个非零元素在三元组中的下标
Statues posistion(TSMatrix T) {
int arry[7] = { 0 };
for (int i = 1; i <= T.tu; i++) arry[T.data[i].i]++;
for (int i = 1; i <= 6; i++) cout << "[" << i << "]" << " ";
cout << endl;
for (int i = 1; i <= 6; i++) {
int temp = 0;
if (arry[i] != 0) {
for (int j = 1; j <= i - 1; j++) temp += arry[j];
cout << temp + 1 << " ";
}
else {
cout << 0 << " ";
}
}
cout << endl;
system("pause");
return OK;
}
求稀疏矩阵的加法
Statues addMatrix(TSMatrix& T) {
TSMatrix T1;
cout << "自动生成的另外一个稀疏矩阵:" << endl;
init_Matrix(T1);
show_Maxtrix(T1);
system("pause");
int arry[10][10] = { 0 };
for (int i = 1; i <= T.tu; i++) arry[T.data[i].i][T.data[i].j] = 1;
for (int i = 1; i <= T1.tu; i++) {
if (arry[T1.data[i].i][T1.data[i].j] == 1) {
T.data[i].e += T1.data[i].e;
}
else {
T.tu++;
T.data[T.tu].i = T1.data[i].i;
T.data[T.tu].j = T1.data[i].j;
T.data[T.tu].e = T1.data[i].e;
}
}
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) arry[i][j] = 0;
}
cout << "矩阵相加结果如下" << endl;
show_Maxtrix(T);
system("pause");
return OK;
}
求稀疏矩阵的乘积
Statues multiMatrix(TSMatrix& T) {
TSMatrix T1;
init_Matrix(T1);
cout << "自动生成的另一个稀疏矩阵" << endl;
show_Maxtrix(T1);
int arry[10][10] = { 0 };
int arry1[10][10] = { 0 };
int arry2[10][10] = { 0 };
for (int i = 1; i <= T.tu; i++) arry1[T.data[i].i][T.data[i].j] = T.data[i].e;
// for (int i = 1; i <= T.tu; i++) cout << T.data[i].i << " " << T.data[i].j << " " << T.data[i].e << endl;
for (int i = 1; i <= T1.tu; i++) arry2[T1.data[i].i][T1.data[i].j] = T1.data[i].e;
for (int i = 1; i <= 6; i++) { //行
for (int j = 1; j <= 6; j++) { //列
int sum = 0;
for (int k = 1; k <= 6; k++) {
sum += arry1[i][k] * arry2[k][j];
arry[i][j] = sum;
//if (arry[i][k] != 0 || arry[k][j] != 0) cout << arry1[i][k] << " " << arry2[k][j] << " " << arry1[i][k] * arry2[k][j] << endl;
}
}
}
cout << "相乘后的矩阵为" << endl;
cout << "**************************************" << endl;
cout << " ";
for (int i = 1; i <= 6; i++) cout << "[" << i << "]" << " ";
cout << endl;
for (int i = 1; i <= 6; i++) {
cout << "[" << i << "]" << " ";
for (int j = 1; j <= 6; j++) {
cout << arry[i][j] << " ";
}
cout << endl;
}
cout << "**************************************" << endl;
system("pause");
return OK;
}
主要的操作就像上面代码所描述,其实还是挺简单的,可能快速转置有稍微有点复杂。
运行结果如下:
这是我们学校的一次数据结构实验,还需要好好学习知识,还存在许多不足,希望大家多多指教!