经典问题用高斯约当算法求解线性方程组。这里要求对任意形式的线性方程组都能够妥善处理,不能只适用于方程个数和未知量数目相等的特殊情形。
先用循环结构将增广矩阵转换为阶梯形矩阵,循环结束时得到阶梯型矩阵非零行行数,同时得到一个链表其中存放有各非零行主元的列标,列标在链表中按从左到右的顺序依次递减。然后根据线性代数中线性方程组的解的情况及判别准则判断方程是否有解,有多少个解。当线性方程组有解时,需要用convert函数将其转换为简化行阶梯型矩阵,然后输出唯一解或一般解
C语言代码如下:
#include <stdio.h>
#include <malloc.h>
#include <math.h>
#define N 5 //增广矩阵列数
#define M 3 //增广矩阵行数
struct maincol
{
int col; //存放各主元下标的结构体类型
struct maincol *next;
};
typedef struct maincol mc1;
int test(int s, int t, float a[][N]); //判断增广矩阵的s行至M行与t列至N列相交形成的子矩阵是否为零矩阵,若是返回0,若不是返回第一个不为零的列的列标
void add(mc1 *head, int col, mc1 **tail); //函数,用于新建一节点,其中保存有主元col列标,然后按递减顺序将其插入maincol类型的链表
void convert(float a[][N], int row, mc1 *head); //函数,用于将阶梯型矩阵转化为简化行阶梯形矩阵
void main()
{
float a[M][N]; //增广矩阵
char str[N+1];
int i, j;
int s, t; //子矩阵左上角元素行列下标
int row, col; //row用于存放阶梯形矩阵非零行行数
float swap;
mc1 *head, *tail, *psnew;
for (i=0; i<M; i++) //输入并初始化增广矩阵
{
printf("请输入增广矩阵第%d行\n", i+1);
scanf("%s", str);
for (j=0; j<N; j++)
a[i][j]=str[j]-48;
}
head=(mc1 *) malloc(sizeof(mc1));
head->next=NULL;
tail=head;
s=t=1; //子矩阵即为增广矩阵本身,用增广矩阵左上角元素行列标初始化s,t
while((col=test(s, t, a))!=0) //子矩阵不为零矩阵
{
if (s==M) //增广矩阵已化为阶梯形矩阵
{
row=s; //记录非零行行数
add(head, col, &tail); //最后一个非零行主元列标放入maincol类型链表
break; //结束循环
}
else
{
j=s-1;
for (i=s; i<M; i++)
{
if (fabs(a[j][col-1])<fabs(a[i][col-1])) //列选主元
j=i;
}
if (s-1!=j)
{
for (i=col-1; i<N; i++)
{
swap=a[j][i];
a[j][i]=a[s-1][i]; //列选主元
a[s-1][i]=swap;
}
}
if (col==N) //增广矩阵已经化为阶梯形矩阵
{
row=s; //记录非零行行数
add(head, col, &tail);