数据结构【串与数组】——PTA:三元组顺序表表示的稀疏矩阵转置运算(含思路)

主题:三元组顺序表表示的稀疏矩阵转置

问题:

输入格式:
输入第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
结尾无空行

思路:

  1. 先声明好两个三元组结构体,都有总行数、总列数、非零数总数、储存非零数的数组四个成员。
typedef struct{
	int m ,n , num;//总行数 总列数 总非零数个数
	triple data[MAXSIZE + 1];//非零数存入,并记录他们的行列 
}tsmatrix;

其中,储存非零数的数组为一个结构体类型,其中每个数都有数字、所在行数、所在列数三个成员。

typedef struct{
	int i, j, data;//行 列 数值 
}triple;
  1. 通键盘输入来初始化原三元组的全部四个成员。
  2. 初始化转置三元组的总行数(=原三元组的总列数)、总列数(=原三元组的总行数)、非零数总数三个成员。
	//M为原矩阵,T为转置矩阵 
	T.n = M.m;//T的行数 = M的列数 
	T.m = M.n;//T的列数 = M的行数
	T.num = M.num;//总数不变
  1. 开始初始化转置三元组的非零数数组成员:
    1. 设置列序为0
    2. 用列序为=0为条件遍历一遍原三元组所有数,依次找到其中所有第0列的数
    3. 每找到一个数,将其的数字、行数、列数储存为“转置三元组中非零数数组”中第n个数的 数字、列数、行数(每储存一个数n++)。
    4. 列序+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++; 
			} 
		}
	}
}
  1. 全部初始化完毕,按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;
} 
  • 4
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值