p; mc1* psnew;
psnew=(mc1 *) malloc(sizeof(mc1));
psnew->col=col;
if(head->next==NULL)
{
psnew->next=NULL;
head->next=psnew;
*tail=psnew;
}
else
{
psnew->next=head->next;
head->next=psnew;
}
}
void convert(float a[][N], int row, mc1 *head) //函数,用于将阶梯型矩阵转化为简化行阶梯形矩阵
{
mc1 *psnew, *pq;
int i, j, k, m;
psnew=head->next;
for (i=row-1; i>=0; i--)
{
if (a[i][psnew->col-1]!=1) //各非零行主元化为1
{
for (j=psnew->col; j<N; j++)
a[i][j]=a[i][j]/a[i][psnew->col-1];
}
psnew=psnew->next;
}
psnew=head->next; //向上消元把除第一个主元外其余主元所在列中在主元上方的部分变为零
for (i=row-1; i>=1; i--)
{
m=N-psnew->col-(row-i); //获取未知量标号1,2,--,N-1中位于i+1非零行主元列标号右边的自由未知量标号个数
for (j=i-1; j>=0; j--)
{
pq=head->next; //pq指向存放最后一个非零行主元列标号的节点
for (k=N; k>psnew->col; k--)
{
if (k!=pq->col)
{
a[j][k-1]=-(a[i][k-1]*a[j][psnew->col-1])+a[j][k-1]; //从右向左作初等行变换直至i+1行主元所在列右边的列位置,期间跳过i+2----row行主元所在的列
m--;
if (m==0)
break;
}
else
{
if (pq->next!=psnew)
pq=pq->next;
}
}
}
psnew=psnew->next; //递进至上一行主元,为新一轮向上消元作准备
}
}