主题:三元组顺序表表示的稀疏矩阵转置
问题:
输入格式:
输入第1行为矩阵行数m、列数n及非零元素个数t。 按行优先顺序依次输入t行,每行3个数,分别表示非零元素的行标、列标和值。
输出格式:
输出转置后的三元组顺序表结果,每行输出非零元素的行标、列标和值,行标、列标和值之间用空格分隔,共t行。
输入样例1:
3 4 3
0 1 -5
1 0 1
2 2 2
结尾无空行
输出样例1:
0 1 1
1 0 -5
2 2 2
结尾无空行
思路:
- 先声明好两个三元组结构体,都有总行数、总列数、非零数总数、储存非零数的数组四个成员。
typedef struct{
int m ,n , num;//总行数 总列数 总非零数个数
triple data[MAXSIZE + 1];//非零数存入,并记录他们的行列
}tsmatrix;
其中,储存非零数的数组为一个结构体类型,其中每个数都有数字、所在行数、所在列数三个成员。
typedef struct{
int i, j, data;//行 列 数值
}triple;
- 通键盘输入来初始化原三元组的全部四个成员。
- 初始化转置三元组的总行数(=原三元组的总列数)、总列数(=原三元组的总行数)、非零数总数三个成员。
//M为原矩阵,T为转置矩阵
T.n = M.m;//T的行数 = M的列数
T.m = M.n;//T的列数 = M的行数
T.num = M.num;//总数不变
- 开始初始化转置三元组的非零数数组成员:
- 设置列序为0
- 用列序为=0为条件遍历一遍原三元组所有数,依次找到其中所有第0列的数
- 每找到一个数,将其的数字、行数、列数储存为“转置三元组中非零数数组”中第n个数的 数字、列数、行数(每储存一个数n++)。
- 列序+1,从a.开始,直到列序>原三元组总列数,遍历完毕。
if(T.num){//若原矩阵有非零值数
int q = 0;
int c;//用于储存原三元组的列,即转置三元组的行
int p;//用于记录非零数是第几个
for(c=0 ; c<=M.m ; c++){//从列序为0开始,依次增加
for(p=0 ; p<M.num ; p++){//从第p=0个数开始,遍历原三元组所有非零数
if(M.data[p].j == c){//若这个数列序为c
T.data[q].i = M.data[p].j;//将这个列序c,作为转置三元组第q个数的行序
T.data[q].j = M.data[p].i;//取这个数的行序,作为转置三元组第q个数的列序
T.data[q].data = M.data[p].data;//取这个数的数据域,作为转置三元组的第q个数
q++;
}
}
}
}
- 全部初始化完毕,按T.data[1]到T.data[n]的顺序依次输出。
for(a = 0; a<T.num; a++){
printf("%d %d %d\n", T.data[a].i, T.data[a].j, T.data[a].data);
}
全部代码:
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
using namespace std;
#define MAXSIZE 100
//定义每一个数据元素
typedef struct{
int i, j, data;//行 列 数值
}triple;
//定义一个三元组
typedef struct{
int m ,n , num;//总行数 总列数 总非零数个数
triple data[MAXSIZE + 1];//非零数存入,并记录他们的行列
}tsmatrix;
tsmatrix ChangeNatr(tsmatrix M, tsmatrix T){//M为原矩阵,T为转置矩阵
//初始化转置矩阵
T.n = M.m;//T的行数 = M的列数
T.m = M.n;//T的列数 = M的行数
T.num = M.num;//总数不变
//遍历
if(T.num){//若原矩阵有非零值数次
int q = 0;
int c;//用于储存原三元组的列,即转置三元组的行
int p;//用于记录非零数是第几个
for(c=0 ; c<=M.m ; c++){//从列序为0开始,依次增加
for(p=0 ; p<M.num ; p++){//从第p=0个数开始,遍历原三元组所有非零数
if(M.data[p].j == c){//若这个数列序为c
T.data[q].i = M.data[p].j;//将这个列序c,作为转置三元组第q个数的行序
T.data[q].j = M.data[p].i;//取这个数的行序,作为转置三元组第q个数的列序
T.data[q].data = M.data[p].data;//取这个数的数据域,作为转置三元组的第q个数
q++;
}
}
}
}
return T;
}
int main(){
tsmatrix M,T;//原三元组,转置三元组
scanf("%d %d %d",&M.m, &M.n, &M.num);//初始化原三元组的总行数、总列数、非零总数
int k = 0;
while(k != M.num){//初始化原三元组的非零数(包括他们的行数、列数、数值)
scanf("%d %d %d",&M.data[k].i, &M.data[k].j, &M.data[k].data);
k++;
}
int k1;
T = ChangeNatr(M, T);//初始化转置三元组
int a = 0;
for(a = 0; a<T.num; a++){
printf("%d %d %d\n", T.data[a].i, T.data[a].j, T.data[a].data);
}
return 0;
}