实现 稀疏矩阵(采用三元组表示)的快速转置

问题

用三元组存储矩阵并实现矩阵转置
要求:输出转置前后矩阵的三元组顺序表。

在这里插入图片描述

转置思路

矩阵 s 有 j 列有 k 个非零元素,s 的第 j 列构成了转置矩阵的第 j 行
那么矩阵 s 中的行 r ,有着 r1 < r2 < ……< rk
所以要找出 t 中第一个元素 j,r1 所在位置 pos[j]
转置矩阵第一行第一个位置为 pos[1] = 1;pos[ j + 1 ] = pos[ j ] + num[ j ];

void transpose(tsmatrix t, tsmatrix& s) {//s为t的转置矩阵
	int i, j, k = 0;
	int num[10] = {0}, pos[10];
	s.rows = t.rows; s.cols = t.cols; s.nums = t.nums;
	if ( s.nums  ) {
	//统计已知矩阵t各列元素非零个数
		for ( j = 0; j < t.nums; j++) {
			num[t.data[j].c]++;
		}
	//计算已知矩阵t各行第一个元素位置
		for (pos[1]=0, i = 0; i < t.cols ; i++) {
			pos[i+1] = pos[i] + num[i];
		}
	//转置矩阵
		for (j = 0; j < s.nums; j++) {
			s.data[pos[t.data[j].c ]].c = t.data[j].r;
			s.data[pos[t.data[j].c ]].r = t.data[j].c;
			s.data[pos[t.data[j].c ]].e = t.data[j].e;
			pos[t.data[j].c]++;//让下一个起始位置+1
		}
	}
}

附上完整代码和结果

#include <stdio.h>

typedef struct {
	int r, c, e;
}triple;

typedef struct {
	int rows, cols, nums;
	triple data[100];
}tsmatrix;

void creat(tsmatrix& t, int a[3][5]) {
	int i, j;
	t.rows = 3; t.cols = 5; t.nums = 0;
	for ( i = 0; i < 3; i++) {
		for (j = 0; j < 5; j++) {
			if (a[i][j] != 0) {
				t.data[t.nums].r = i;
				t.data[t.nums].c = j;
				t.data[t.nums].e = a[i][j];
				t.nums++;
			}
		}
	}
}
void show(tsmatrix t) {
	int i;
	if (t.nums <= 0) {
		printf("is null\n");
		return;
	}
	for ( i = 0; i < t.nums; i++) {
		printf("%3d%3d%3d\n", t.data[i].r, t.data[i].c, t.data[i].e);
	}
}
void transpose(tsmatrix t, tsmatrix& s) {
	int i, j, k = 0;
	int num[10] = {0}, pos[10];
	s.rows = t.rows; s.cols = t.cols; s.nums = t.nums;
	if ( s.nums  ) {
		for ( j = 0; j < t.nums; j++) {
			num[t.data[j].c]++;
		}

		for (pos[1]=0, i = 0; i < t.cols ; i++) {
			pos[i+1] = pos[i] + num[i];
		}

		for (j = 0; j < s.nums; j++) {
			s.data[pos[t.data[j].c ]].c = t.data[j].r;
			s.data[pos[t.data[j].c ]].r = t.data[j].c;
			s.data[pos[t.data[j].c ]].e = t.data[j].e;
			pos[t.data[j].c]++;
		}
	}
}
int main() {
	int a1[3][5] = { {1,0,0,0,8},{0,0,0,0,4},{3,0,0,0,0} };
	for (int i = 0; i < 3; i++) {
		for (int j = 0; j < 5; j++) {
			printf("%d", a1[i][j]);
			if (j == 4) {
				printf("\n");
			}
		}
	}
	tsmatrix a, b;
	creat(a, a1);
	printf("before\n");
	show(a);
	printf("after:\n");
	transpose(a, b);
	show(b);
	return 0;
}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_43349548/article/details/106806488
今日推荐