本次实验的题目如下,这是要求我们进行矩阵的转置,由于是稀疏矩阵,如果用普通的方法,将导致时间复杂度很高,所以我们采用快速转置的方法,降低复杂度。
此题有一个坑,这里的矩阵行列都是从0开始的。
话不多说,直接上代码,不懂得请私信我,我将为你解答。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#define MaxSize 100
typedef struct
{
int row, col;//列数和行数
int element;
}Triple;
typedef struct {
Triple data[MaxSize];//定义三元组
int m, n, length;//行数和列数
}TSMatrix;
void display(TSMatrix);//输出函数
TSMatrix transposeMatrix(TSMatrix);//转置函数
int main() {
int x, y;//x表示行数,y表示列数
scanf_s("%d%d", &x, &y);
int i, j, e;//表示输入的行数,列数和数值
TSMatrix A;//A为转置前的矩阵
TSMatrix B;//B表示转置之后的矩阵
int count = 0;//用来记录矩阵A的data这个数组的下标
A.m = x, A.n = y, A.length = 0;//初始化
for (int x=0; ; x++) {//死循环也可以,不可以在这里输入,然后再来判断输入不为0 0 0 时结束循环,因为这题是从0行0列开始的
scanf_s("%d%d%d", &i, &j, &e);
if (i == 0 && j == 0 && e == 0) break;//此题存在0行0列,所以必须是三个元素都为0时为结束条件,其实也可以改为for(scanf("%d%d%d",&i,&j,&e);e!=0;scanf("%d%d%d",&i,&j,&e))这个循环
A.data[count].row = i, A.data[count].col = j, A.data[count].element = e;//将输入的元素
A.length++, count++;
}
B=transposeMatrix(A);
for (int i = 0; i < B.length; i++) {
printf("%d %d %d\n", B.data[i].row, B.data[i].col, B.data[i].element);
}
return 0;
}
TSMatrix transposeMatrix(TSMatrix M) {//用N来返回转置之后的矩阵,所以
int num[100], cpot[100];//num这个数组来存放每一列的非0元素的个数,cpot数组用来存放每一列的第一个非0元素的位置,以便转置之后,快速地找到其要存放的位置
TSMatrix N;
N.length = M.length, N.m = M.n, N.n = M.m;
if (N.length != 0) {
for (int col = 0; col <= M.n; col++) {//初始化数组num的值为0
num[col] = 0;
}
cpot[0] = 0;//初始化cpot[0]=0,因为第一个数存放的位置一定时第0位或者说第一位
for (int i = 0; i < M.length; i++) {//遍历三元组A,将每一列的非零元素的个数记录下来
num[M.data[i].col]++;
}
for (int i = 1; i <= M.n; i++) {//此循环用来记录我们除输入的第一列以外的其他列的第一个非0元素的位置
cpot[i] = cpot[i - 1] + num[i - 1];
}
int t, colnum;
for (int i = 0; i < M.length; i++) {
colnum = M.data[i].col;//用colnum来保存下M.data[i]这个元素的列数
t = cpot[colnum];//用t记下这个元素在这列的第一个非零元素的位置,注意一点第一个非零元素在转置之后的话,就会成为对应行的第一个元素,所以可以这么直接转置
N.data[t].row = M.data[i].col;
N.data[t].col = M.data[i].row;
N.data[t].element = M.data[i].element;
cpot[colnum]++;//cpot数组在这一列的位置后移一位
}
}
return N;
}
如果你有更好的解决方法,请留下你的方法,我们一起探讨。谢谢!!!