c语言程序求对称矩阵,对称矩阵排列问题 请各位麻烦给个编程实现的思路或者伪代码 谢!...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

先按行排序,再按列排序

#define _CRT_SECURE_NO_WARNINGS

#include

#include

#include

const int MAX = 10;

typedef struct cell {

int val;

bool fl;

}cell;

void get_row_fl(cell** matrix, int m, int row_pos, int* val) {

for (int i = 0; i < m; i++) {

if (matrix[row_pos][i].fl == 1) {

*val = matrix[row_pos][i].val;

break;

}

}

}

void get_col_fl(cell** matrix, int m, int col_pos, int* val) {

for (int i = 0; i < m; i++) {

if (matrix[i][col_pos].fl == 1) {

*val = matrix[i][col_pos].val;

break;

}

}

}

void swap_row(cell** matrix, int m, int row1, int row2) {

cell tmp[MAX];

for (int i = 0; i < m; i++) {

tmp[i].fl = matrix[row1][i].fl;

tmp[i].val = matrix[row1][i].val;

}

for (int i = 0; i < m; i++) {

matrix[row1][i].fl = matrix[row2][i].fl;

matrix[row1][i].val = matrix[row2][i].val;

}

for (int i = 0; i < m; i++) {

matrix[row2][i].fl = tmp[i].fl;

matrix[row2][i].val = tmp[i].val;

}

}

void swap_col(cell** matrix, int m, int col1, int col2) {

cell tmp[MAX];

for (int i = 0; i < m; i++) {

tmp[i].fl = matrix[i][col1].fl;

tmp[i].val = matrix[i][col1].val;

}

for (int i = 0; i < m; i++) {

matrix[i][col1].fl = matrix[i][col2].fl;

matrix[i][col1].val = matrix[i][col2].val;

}

for (int i = 0; i < m; i++) {

matrix[i][col2].fl = tmp[i].fl;

matrix[i][col2].val = tmp[i].val;

}

}

void sort(cell** matrix, int m) {

for (int i = 0; i < m; i++) {

matrix[i][i].fl = 1;

}

int val1, val2;

for (int i = m - 1; i >= 0; i--) {

for (int j = 0; j < i - 1; j++) {

get_row_fl(matrix, m, j, &val1);

get_row_fl(matrix, m, j + 1, &val2);

if (val1 > val2) {

swap_row(matrix, m, j, j + 1);

}

}

}

for (int i = m - 1; i >= 0; i--) {

for (int j = 0; j < i - 1; j++) {

get_col_fl(matrix, m, j, &val1);

get_col_fl(matrix, m, j + 1, &val2);

if (val1 > val2) {

swap_col(matrix, m, j, j + 1);

}

}

}

}

int A[6][6] = { 6,2,4,8,14,22,\

2,1,6,10,16,24,\

4,6,3,12,18,26,\

8,10,12,2,20,28,\

14,16,18,20,5,30,\

22,24,26,28,30,8 };

int B[6][6] = { \

1,10,6,16,2,24,\

10,2,12,20,8,28,\

6,12,3,18,4,26,\

16,20,18,5,14,30,\

2,8,4,14,6,22,\

24,28,26,30,22,8\

};

int main() {

int m = 6;

cell** matrix = (cell**)malloc(sizeof(cell*) * MAX);

if (matrix == NULL) exit(1);

for (int i = 0; i < m; i++) {

matrix[i] = (cell*)malloc(sizeof(cell) * MAX);

if (matrix[i] == NULL) exit(1);

}

for (int i = 0; i < m; i++) {

for (int j = 0; j < m; j++) {

matrix[i][j].fl = 0;

matrix[i][j].val = A[i][j];

}

}

sort((cell**)matrix, m);

for (int i = 0; i < m; i++) {

for (int j = 0; j < m; j++) {

printf("%d\t", matrix[i][j].val);

}

printf("\n");

}

printf("----\n");

for (int i = 0; i < m; i++) {

for (int j = 0; j < m; j++) {

printf("%d\t", B[i][j]);

}

printf("\n");

}

return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值