编写程序用三元组表示稀疏矩阵的案列转置操作。
作者:互联网
内容:
编写程序用三元组表示稀疏矩阵的案列转置操作。本设计使用三元组表来实现。
算法分析
本题要完成的是三元组表实现稀疏矩阵按列转置操作。首先就是要设立三个函数。函数InitSPNode()用来建立一个稀疏矩阵的三元组表,就是要输入行数、列数和非零元的值,最后要用(-1,-1,-1)来结束输入;第二函数showMatrix()用来输出稀疏矩阵,算法中按矩阵a的列进行循环处理,对a的每一列扫描三元组,找出相应的元素,若找到了,则交换其行号与列号,并存储到矩阵b的三元组中。最后用函数TransposeSMatrix()用来完成稀疏矩阵的转置算法。算法主要的工作是在配合col的两重循环中完成,时间复杂度为(n*t)。如果非零元素个数t和m*n同数量级,则算法的时间复杂度变为O(m*n²)
概要设计
用三元组表实现系数矩阵的基本操作
函数 |
void InitSPMatrix(SPMatrix* a) void showMatrix(SPMatrix *a) void TransposeSMatrix(SPMatrix* a, SPMatrix* b)
|
程序运行流程图如下:
#include<stdio.h>
#include<string.h>
#define Ok 1
#define MAX 10//用户自定义三元组表最大长度
typedef struct//定义三元组表
{
int i, j;//行,列
int v;//非0数组中的值
}SPNode;
typedef struct//定义三元组表
{
int m;//矩阵行
int n;//矩阵列
int t;//矩阵中的非零元素(三元组表的长度)
SPNode date[MAX];
}SPMatrix;
void InitSPMatrix(SPMatrix* a)//输入三元列表
{
int i, j, k, val, maxrow, maxcol;
maxrow = 0;
maxcol = 0;
i = j = 0;
k = 0;
while (i != -1 && j != -1)//rol=-1&&col=-1结束输入
{
printf("输入(行 列 值)");
scanf_s("%d,%d,%d", &i, &j, &val);
a->date[k].i = i;
a->date[k].j = j;
a->date[k].v = val;
if (maxrow < i) maxrow = i;//获得最大的列和行,以便于得到矩阵的列和行
if (maxcol < j) maxcol = j;
k++;
}
a->m = maxrow;
a->n = maxcol;
a->t = k-1;//矩阵中非零元素的数
}
void showMatrix(SPMatrix *a)
{
int p, q;
int t = 0;
for (p = 0; p <= a->m; p++)//这个是行循环,p代表p+1行
{
for (q = 0; q <= a->n; q++)//这个是列循环,q代表q+1列
{
if (a->date[t].i== p && a->date[t].j == q)//遍历循环输出有v的元素
{
printf("%d", a->date[t].v);
t++;
}
else printf("0");//if不成立说明该位置没有输入元素,则输出0
}
printf("\n");//一行结束以后进行换行处理
}
}
void TransposeSMatrix(SPMatrix* a, SPMatrix* b)
{
int q, col, p;
b->m = a->n;//行列转换
b->n = a->m;
b->t = a->t;
if (b->t)
{
q = 0;
for(col=0;col<=a->n;++col)//遍历整个矩阵进行置换
for(p=0;p<a->t;++p)
if (a->date[p].j == col)
{
b->date[q].i = a->date[p].j;
b->date[q].j = a->date[p].i;
b->date[q].v = a->date[p].v;
++q;
}
}
}
void main()
{
SPMatrix a, b;
printf("\n结束请输入(-1,-1,-1)\n");
InitSPMatrix(&a);
printf("输入矩阵为:\n");
showMatrix(&a);
TransposeSMatrix(&a, &b);
printf("输出矩阵为:\n");
showMatrix(&b);//转置后
}
标签:SPMatrix,转置,void,矩阵,案列,三元组,int,date 来源: https://blog.csdn.net/floruitshow/article/details/121059954