| 
 | 
 
 
发表于 2021-7-12 11:16:21
|
显示全部楼层
 
 
 
并没有完全按照题目要求写,算法的关键就是把 w 和 h 调换 
- dest->data[h * dest->width + w] = matrix->data[w * matrix->width + h];
 
  复制代码 
- #include <stdio.h>
 
 - #include <stdlib.h>
 
  
- typedef struct {
 
 -     int *data;
 
 -     size_t width;
 
 -     size_t height;
 
 - } matrix_t;
 
  
- static matrix_t *new_matrix(size_t width, size_t height) {
 
 -     matrix_t *matrix = malloc(sizeof(*matrix));
 
 -     if(!matrix) return NULL;
 
 -     matrix->width = width;
 
 -     matrix->height = height;
 
 -     matrix->data = malloc(sizeof(*matrix->data) * matrix->width * matrix->height);
 
 -     if(!matrix->data) {free(matrix); return NULL;}
 
 -     return matrix;
 
 - }
 
  
- matrix_t *matrix_init(FILE *fp, size_t width, size_t height) {
 
 -     matrix_t *matrix = new_matrix(width, height);
 
 -     if(!matrix) return NULL;
 
 -     for(size_t h = 0; h < matrix->height; ++h) {
 
 -         for(size_t w = 0; w < matrix->width; ++w) {
 
 -             fscanf(fp, "%d", &matrix->data[h * matrix->width + w]);
 
 -         }
 
 -     }
 
 -     return matrix;
 
 - }
 
  
- void matrix_deinit(matrix_t *matrix) {
 
 -     if(matrix) free(matrix->data);
 
 - }
 
  
- void matrix_print(const matrix_t *matrix) {
 
 -     if(!matrix) return;
 
 -     for(size_t h = 0; h < matrix->height; ++h) {
 
 -         for(size_t w = 0; w < matrix->width; ++w) {
 
 -             printf("%d ", matrix->data[h * matrix->width + w]);
 
 -         }
 
 -         printf("\n");
 
 -     }
 
 - }
 
  
- matrix_t *matrix_transform(const matrix_t *matrix) {
 
 -     if(!matrix) return NULL;
 
 -     if(matrix->width != matrix->height) return NULL;
 
 -     matrix_t *dest = new_matrix(matrix->width, matrix->height);
 
 -     if(!dest) return NULL;
 
 -     for(size_t h = 0; h < matrix->height; ++h) {
 
 -         for(size_t w = 0; w < matrix->width; ++w) {
 
 -             dest->data[h * dest->width + w] = matrix->data[w * matrix->width + h];
 
 -         }
 
 -     }
 
 -     return dest;
 
 - }
 
  
- int main(void) {
 
 -     matrix_t *a = matrix_init(stdin, 3, 3);
 
 -     matrix_t *b = matrix_transform(a);
 
 -     matrix_print(b);
 
 -     matrix_deinit(b);
 
 -     matrix_deinit(a);
 
 -     return 0;
 
 - }
 
 
  复制代码 |   
 
 
 
 |