内容
编写程序用三元组表实现稀疏矩阵的按列转置操作
1.算法分析
使用三元组表实现。
2.设计概要
程序中设计了三个函数:
函数InitSPNode()用来建立一个稀疏矩阵的三元组表。
首先输入行数、列数和非零元的值,输入(-1,-1,-1)结束输入。
函数showMatrix()用来输出稀疏矩阵。
算法中按矩阵a的列进行循环处理,对a的每一列扫描三元组,找出相应的元素,若找到,则交换其行号与列号,并存储到矩阵b的三元组中。
函数TransposeSMatrix()用来完成稀疏矩阵的转置算法。
算法主要的工作是在p和col的两重循环中完成,时间复杂度为O(n*t)。如果非零元素个数t和m*n同数量级,则算法的时间复杂度变为O(m*n2)。
3.测试,测试代码的设计与实现,测试结果截屏
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#define OK 1
#define Maxsize 10 //用户自定义三元组最大长度
/*定义三元组表*/
typedef struct
{
int i, j; //非零元素的行列
int v; //非零元素值
}SPNode;
/*定义三元组表*/
typedef struct
{
SPNode data[Maxsize]; //三元组表
int m, n, t; //矩阵行,列及三元组表长度
}SPMatrix; //三元组表的存储类型
/*输入三元组表*/
void InitSPNode(SPMatrix* a)
{
int i, j, k, val, maxrow, maxcol;
maxrow = 0;
maxcol = 0;
i = j = 0;
k = 0;
while (i != -1 && j != -1) //row=-1&&col=-1结束输入
{
printf("输入(行列值):");
scanf("%d%d%d", &i, &j, &val);
a->data[k].i = i;
a->data[k].j = j;
a->data[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++)
{
for (q = 0; q <= a->n; q++)
{
if (a->data[t].i == p && a->data[t].j == q)
{
printf(" %d ", a->data[t].v);
t++;
}
else printf(" 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) /*按a的列序转置*/
for (p = 0; p < a->t; ++p) /*扫描整个三元组表*/
if (a->data[p].j == col)
{
b->data[q].i = a->data[p].j;
b->data[q].j = a->data[p].i;
b->data[q].v = a->data[p].v;
++q;
}
}
}
int main()
{
SPMatrix a, b;
printf("\n 结束请输入(-1-1-1)\n");
InitSPNode(&a);
printf(" 输入矩阵为:\n");
showMatrix(&a); //转置前
TransposeSMatrix(&a, &b);
printf(" 输出矩阵为: \n");
showMatrix(&b); //转置后
}
编译环境为:vs2019为避免scanf函数溢出在头文件前加入
#define _CRT_SECURE_NO_WARNINGS 1
运行结果: