C语言
VS2019环境
#include<stdio.h>
#include<cstring>
#define maxsize 100
#define max 10
typedef int Elem;
typedef struct {
int row, col;
Elem e;
}Triple;
typedef struct {
Triple data[maxsize+1];
int m, n, len;
}Tsm;
void Inital(Tsm* tsm);
void tran(Tsm* tsm);
void Display(Tsm* tsm);
void qtran(Tsm* tsm);
int main() {
Tsm tsm;
Inital(&tsm);
//tran(&tsm);
qtran(&tsm);
Display(&tsm);
return 0;
}
void Inital(Tsm* tsm) {
Elem n;
tsm->len = 0;
printf("输入行和列(最大支持10*10)\n");
scanf_s("%d %d", &tsm->m, &tsm->n);
for (int i = 0; i < tsm->m; i++) {
for (int j = 0; j < tsm->n; j++) {
scanf_s("%d", &n);
if (n != 0) {
tsm->data[tsm->len].row = i;
tsm->data[tsm->len].col = j;
tsm->data[tsm->len].e = n;
tsm->len++;
}
}
}
/*for (int i = 0; i < tsm->len; i++) {
printf("%d %d\n", tsm->data[i].row, tsm->data[i].col);
}*/
}
void tran(Tsm* tsm) {
Tsm tm;
tm.len = 0;
int k;
//printf("% d % d\n", tsm->m, tsm->n);
for (int i = 0; i < tsm->n; i++) {
for (int j = 0; j < tsm->len; j++) {
if (tsm->data[j].col == i) {
tm.data[tm.len].row = tsm->data[j].col;
tm.data[tm.len].col = tsm->data[j].row;
tm.data[tm.len].e = tsm->data[j].e;
tm.len++;
}
}
}
//printf("%d\n", tm.len);
k = tsm->n;
tsm->n = tsm->m;
tsm->m = k;
for (int i = 0; i < tsm->len; i++) {
tsm->data[i].row = tm.data[i].row;
tsm->data[i].col = tm.data[i].col;
tsm->data[i].e = tm.data[i].e;
}
//printf("% d % d\n", tsm->m, tsm->n);
}
void qtran(Tsm* tsm) {
Tsm sm;
int pos[max+1] = { 0 };
int po[max+1] = { 0 };
for (int i = 0; i < tsm->len; i++) {
po[tsm->data[i].col+1]++;
}
/*for (int i = 1; i < max + 1; i++) {
printf("%d ", po[i]);
}*/
//printf("\n");
for (int i = 2; i < max+1; i++) {
pos[i] = po[i - 1] + pos[i - 1];
}
//for (int i = 1; i < max+1; i++) {
// printf("%d ", pos[i]);
//}
for (int i = 0; i < tsm->len; i++) {
//printf("%d",pos[tsm->data[i].col]);
sm.data[pos[tsm->data[i].col+1]].row = tsm->data[i].col;
sm.data[pos[tsm->data[i].col+1]].col = tsm->data[i].row;
sm.data[pos[tsm->data[i].col+1]].e = tsm->data[i].e;
pos[tsm->data[i].col+1]++;
}
int k;
k = tsm->n;
tsm->n = tsm->m;
tsm->m = k;
for (int i = 0; i < tsm->len; i++) {
tsm->data[i].row = sm.data[i].row;
tsm->data[i].col = sm.data[i].col;
tsm->data[i].e = sm.data[i].e;
}
}
void Display(Tsm* tsm) {
int k=0;
for (int i = 0; i < tsm->m; i++) {
for (int j = 0; j < tsm->n; j++) {
if (i == tsm->data[k].row && j == tsm->data[k].col) {
printf("%d ", tsm->data[k].e);
k++;
}
else { printf("0 "); }
}
printf("\n");
}
}