按列序递增进行转置

旧城等待, 2022-03-26 13:12 245阅读 0赞
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define MAX_LEN 100
  4. /*按列序递增进行转置的思想就是:对于原矩阵的某一列一次扫描,按行序从大到小存到三元组,
  5. 这样可以实现,在新的矩阵中,行序递增(原矩阵列序),且某一行的列序递增。*/
  6. typedef struct
  7. {
  8. int r,c,value;
  9. }Tri;
  10. typedef struct
  11. {
  12. Tri data[MAX_LEN+1]; /*结构体数组,三元组,数组中的每个元素有其行号、列号和值*/
  13. int row,col,number;
  14. }Tsmatrix;
  15. void Create_Matrix(Tsmatrix *S)
  16. {
  17. int i=0;
  18. printf("请输入原矩阵的行数、列数:\n");
  19. scanf("%d %d",&S->row,&S->col);
  20. printf("请输入原矩阵的元素个数:\n");
  21. scanf("%d",&S->number);
  22. printf("请输入原矩阵各元素的行号、列号和值为:\n");
  23. for(i=1;i<=S->number;i++)
  24. {
  25. scanf("%d %d %d",&S->data[i].r,&S->data[i].c,&S->data[i].value);
  26. }
  27. }
  28. int Transpose (Tsmatrix *A, Tsmatrix *B)
  29. {
  30. int i, j, k;
  31. B->row= A->col;
  32. B->col = A->row;
  33. B->number = A->number;
  34. if (B->number >0)
  35. {
  36. k = 1;
  37. for (i = 1; i <= A->col; i++) // A的列数就是B的行数,对应要循环找几次B的行号
  38. {
  39. for (j = 1; j <= A->number; j++)
  40. {
  41. if (A->data[j].c == i) // 每次将列号为i的元素赋给B
  42. {
  43. B->data[k].r = A->data[j].c;
  44. B->data[k].c = A->data[j].r;
  45. B->data[k].value = A->data[j].value;
  46. k++;
  47. }
  48. if (k > A->number)
  49. break;
  50. }
  51. }
  52. return 1;
  53. }
  54. else
  55. return 0;
  56. }
  57. void Printresult(Tsmatrix *P , int a) //打印结果
  58. {
  59. int i = 0;
  60. if(a = 0)
  61. printf("原矩阵不存在非零元素!!!\n");
  62. else {
  63. printf("转置后的矩阵的行数和列数分别为:\n");
  64. printf("%d %d\n",P->row,P->col);
  65. printf("转置后的矩阵的元素个数为:\n");
  66. printf("%d\n",P->number);
  67. printf("转置后的矩阵各元素的行号、列号和值为:\n");
  68. for(i=1;i<=P->number;i++)
  69. {
  70. printf("%d %d %d\n",P->data[i].r,P->data[i].c,P->data[i].value);
  71. }
  72. }
  73. }
  74. int main()
  75. {
  76. int flag=0;
  77. Tsmatrix S,P;
  78. Create_Matrix(&S);
  79. flag=Transpose(&S,&P);
  80. Printresult(&P,flag);
  81. return 0;
  82. }

发表评论

表情:
评论列表 (有 0 条评论,245人围观)

还没有评论,来说两句吧...

相关阅读