1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <malloc.h> 4 5 int GJ(int, double **); 6 double **TwoArrayAlloc(int, int); 7 void TwoArrayFree(double **); 8 9 void main() 10 { 11 int i, j, n; 12 double **a; 13 n = 4; 14 a = TwoArrayAlloc(n, n); 15 16 a[0][0] = 5; a[0][1] = 7; a[0][2] = 6; a[0][3] = 5; 17 a[1][0] = 7; a[1][1] = 10; a[1][2] = 8; a[1][3] = 7; 18 a[2][0] = 6; a[2][1] = 8; a[2][2] = 10; a[2][3] = 9; 19 a[3][0] = 5; a[3][1] = 7; a[3][2] = 9; a[3][3] = 10; 20 if (!GJ(n, a)) 21 { 22 printf("矩阵求逆失败\n"); 23 exit(1); 24 } 25 printf("该矩阵的逆为:\n"); 26 for (i = 0; i<n; i++) 27 { 28 for (j = 0; j<n; j++) 29 printf("%.2f\t", a[i][j]); 30 printf("\n"); 31 } 32 } 33 34 int GJ(int n, double **a) 35 { 36 int i, j, k; 37 double p, q, *h; 38 h = (double *)calloc(n, sizeof(double)); 39 if (h == NULL) 40 { 41 printf("内存分配失败\n"); 42 exit(1); 43 } 44 for (k = n; k >= 1; k--) 45 { 46 p = a[0][0]; 47 if (p <= 0) 48 { 49 free(h); 50 return (0); 51 } 52 for (i = 2; i <= n; i++) 53 { 54 q = a[i - 1][0]; 55 if (i>k) 56 h[i - 1] = q / p; 57 else 58 h[i - 1] = -q / p; 59 for (j = 2; j <= i; j++) 60 a[i - 2][j - 2] = a[i - 1][j - 1] + q*h[j - 1]; 61 } 62 a[n - 1][n - 1] = 1 / p; 63 for (i = 2; i <= n; i++) 64 a[n - 1][i - 2] = h[i - 1]; 65 } 66 free(h); 67 return(1); 68 } 69 70 double **TwoArrayAlloc(int r, int c) 71 { 72 double *x, **y; 73 int n; 74 x = (double *)calloc(r*c, sizeof(double)); 75 y = (double **)calloc(r, sizeof(double*)); 76 for (n = 0; n <= r - 1; ++n) 77 y[n] = &x[c*n]; 78 return (y); 79 } 80 81 void TwoArrayFree(double **x) 82 { 83 free(x[0]); 84 free(x); 85 }
来源:博客园
作者:insist钢
链接:https://www.cnblogs.com/liugangjiayou/p/11633067.html