首页 > 编程知识 正文

稀疏矩阵的十字链表转置,c++矩阵转置函数

时间:2023-05-06 13:36:20 阅读:149364 作者:3825

问题描述了输入矩阵的行数、列数和非零元素的数量以及所有非零元素。 非零元素包含每个元素的行号、列号和元素值。 要求:1.输入的非零元素个数必须满足稀疏矩阵的要求。 输入过程检测是否满足该要求,如果不满足,则重新输入非零元素的个数; 2 .非零元素按行号从小到大的顺序输入。 按相同行号的要素、列号从小到大的顺序输入。 输入过程检测是否满足此要求,如果不满足,则重新输入当前非零元素的行号、列号和元素值以了解什么是稀疏矩阵/** *稀疏矩阵: 矩阵中的大部分元素都指的是0的矩阵。 直观上,非零要素的个数不足所有要素的30% *时,这样的矩阵为稀疏矩阵* 1。 稀疏矩阵的三元组记忆表示*关于稀疏矩阵的记忆压缩,采取只记忆非零要素的方法。 稀疏矩阵中非零元素a_i_j的分布没有*规律,所以在重新存储非零元素值的同时,还必须存储矩阵中非零元素的行号和列号的位置。 这就是*稀疏矩阵的三元组表表示。 *三元组结构: *具有此非零元素的行值具有此非零元素的列值此非零元素的值* row col e * *说明:为了便于处理,将稀疏矩阵中非零元素的三元组存储为“行序为主序”的一维结构数组,并将*矩阵各行(行从小到大)中的非零* *矩阵替换: *指向变换元件的位置,其中将(row,col )位置处的元件变换为(col,row )位置。 即* */元素矩阵数据采样输入第一组数据:矩阵的数据元素值354---------- 11432234315第二组数据3360矩阵的数据元素值354------ 334 :4-------- 111143224315解决方案#include stdio.h/*非零元素个数最多可达255 */# deffer typedef struct {/*非零元素的/*非零元素的下标*/int col; /*此非零元素的值*/ElementType e; } Triple; typedef struct { /*此非零元素的三元组表MAX_SIZE 1:显示data[0]为*/Triple data[MAX_SIZE 1]; /*矩阵行数*/int rows; /*矩阵的列数*/int cols; /*矩阵非零元素的个数*/int length; } TSMatrix; /** *稀疏矩阵列顺序增量替换算法* @param A元矩阵* @param B替换后*/voidtransposetsmatrix (tsmatrixa,TSMatrix *B ); voidprintt(tsmatrixb ); voidinputt(tsmatrix*a ); int main () { TSMatrix A,b; 输入(a ); /*预转移输出*/printf('before:n ' ); 打印(a ); transposetsmatrix(a,b ); /*置换后,输出*/printf(after:(n ) ); 打印(b ); 返回0; }将voidtransposetsmatrix (tsmatrixa,TSMatrix *B ) )/*矩阵a转用为b所指的矩阵。 矩阵用三元组表示,*/int i、j、k; /* B行=A列*/B-rows=A.cols; /* B的列=A的行*/B-cols=A.rows; /*矩阵元素个数相同的*/B-length=A.length; /*b元素个数大于0*/if(b-length0)/*j时,记录转置后的三元组的三元组表b中的下标值(/j=1; /*扫描三元组表a共A.cols,每次找到列值为k的三元组并进行替换*/for(k=1; k=A.cols; k ) for(I=1; i=A.length; I ) (/*从头到尾扫描三元组表a,查找并替换col值为k的三元组)/if ) a.data[I].col==k) { B->data[j].row = A.data[i].col; B->data[j].col = A.data[i].row; B->data[j].e = A.data[i].e; /* 计数器 j 加 1,指向本行下一个转置后元素的位置下标 */ j++; } } /* inner for end */ } /* out for end */ } /* if end */} /* TransposeTSMatrix end */void printT(TSMatrix B) { int i, j; int t = 1; int zero = 0; for (i = 1; i <= B.rows; i++) { for (j = 1; j <= B.cols; j++) { if (B.data[t].row == i && B.data[t].col == j) { printf("%-4d", B.data[t].e); t++; } else printf("%-4d", zero); } printf("n"); }}void InputT(TSMatrix *A) { int i; /* * 目标: * 存储一个三元组 * 1. 先满足输入的行列条件 * 2. 再满足非零元素个数 * 3. 实现三元组创建 * */ /* 第一次输入行列: 获取对应矩阵的行数和列数 */ scanf("%d%d", &A->rows, &A->cols); /* 输入的非零元素个数必须满足稀疏矩阵要求,输入过程检测是否满足此要求,若不满足,则重新输入非零元素个数 */ do { /* 输入非零元素个数 */ scanf("%d", &A->length); /* 如果非零元素个数大于 4,重新输入 => 矩阵大小为 3 行 5 列,6 个非零元素;(6 个非零元素,不是稀疏矩阵,输入错误) */ } while ((A->length > (A->rows * A->cols * 0.3))); /* 限制非零元素个数的 do...while end */ /* 非零元素个数满足后: 输入第一组矩阵表元素 */ scanf("%d%d%d", &A->data[1].row, &A->data[1].col, &A->data[1].e); /** * 非零元素按行号从小到大顺序输入,相同行号的元素,列号从小到大输入,输入过程检测是否满足此要求, * 若不满足,则重新输入当前非零元素的行号、列号和元素值 */ for (i = 2; i <= A->length; i++) { do { /* 输入三元组表: 获取对应位置下标的值 */ scanf("%d%d%d", &A->data[i].row, &A->data[i].col, &A->data[i].e); } while (A->data[i].row < A->data[i - 1].row || A->data[i].row == A->data[i - 1].row && A->data[i].col <= A->data[i - 1].col); }} 结果输出

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。