将C++程序修改成C程序
// hahahahahaha.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include<iostream>
#include<string>
#include<iomanip>
#include<cmath>
using namespace std;
#define max 100
#define datatype int
typedef struct{
int row,col;//行,列
datatype v;//非0数值
}Node;
typedef struct{
Node data[max];//稀疏矩阵
int m,n,t;//m行,n列,t非0数个数
}Matrix;
/*求逆矩阵存储*/
typedef struct{ //存储结构
int m, n; //行、列数
double *p; //矩阵基址
}nMatrix;
void In(nMatrix a){ //求逆输入
cout<<"请将矩阵a的行、列数再次输入:";
cin >>a.m>>a.n;
int m = a.m, n = a.n;
int i, j;
double *p = a.p = new double[m * n]; //p是行指针
cout<<"请按行优先输入矩阵a的全部数值:\n";
for (i = 0; i < m; p += n, i++)
{
for (j = 0; j < n; j++)
cin>>p[j]; //即a.p[i*n+j]
}
}
void Out(nMatrix a){ //求逆输出
int m = a.m, n = a.n;
int i, j;
double *p = a.p;
for (i = 0; i < m; p += n, i++)
{
for (j = 0; j < n; j++)
cout<<p[j]<<'\t';
cout<<endl;
}
}
istream& operator >>(istream& input,Matrix &A){
int i;
cout<<"请输入行数:";
input>>A.m;
cout<<"请输入列数:";
input>>A.n;
cout<<"请输入非0值个数:";
input>>A.t;
for(i=1;i<=A.t;i++){
cout<<"请输入行数,列数,非0值:"<<"("<<i<<")\n";
input>>A.data[i].row>>A.data[i].col>>A.data[i].v;
}
return input;
}
ostream& operator <<(ostream& output,Matrix &A){
int i,j,t=1,k=0;
for(i=1;i<=A.m;i++){
for(j=1;j<=A.n;j++){
if(A.data[t].row==i&&A.data[t].col==j){
output<<A.data[t].v<<'\t';
t++;}
else
output<<k<<'\t';
}
cout<<"\n";
}
return output;
}
Matrix operator +(Matrix A,Matrix B){//加法
int i,j,k;
Matrix C;
if(A.m!=B.m||A.n!=B.n){
cout<<"这两个矩阵不能相加"<<endl;
exit(0);}
C.m=A.m;C.n=A.n;
C.t=0;
if(A.t==0&&B.t==0) exit(0);
i=j=k=1;
while(i<=A.t&&j<=B.t){
if(A.data[i].row<B.data[j].row){
C.data[k]=A.data[i];
i++;k++;
}
else{
if(A.data[i].row>B.data[j].row){
C.data[k]=B.data[j];
j++;k++;
}
else{
if(A.data[i].col<B.data[j].col){
C.data[k]=A.data[i];
i++;k++;
}
else{
if(A.data[i].col>B.data[j].col){
C.data[k]=B.data[j];
j++;k++;
}
else{
if(A.data[i].v+B.data[j].v!=0){
C.data[k].row=A.data[i].row;
C.data[k].col=A.data[i].col;
C.data[k].v=A.data[i].v+B.data[j].v;
k++;
}
i++;j++;
}
}
}
}
}
while(i<A.t){
C.data[k]=A.data[i];
i++;k++;
}
while(j<B.t){
C.data[k]=B.data[j];
j++;k++;
}
C.t=k;
return C;
}
Matrix operator -(Matrix A,Matrix B){
Matrix C;
int i,j,k;
if(A.m!=B.m||A.n!=B.n)
{
cout<<"这两个矩阵不能相减";exit(0);}
C.m=A.m;C.n=A.n;
C.t=0;
if(A.t==0&&B.t==0) exit(0);
i=j=k=1;
while(i<=A.t&&j<=B.t)
{ if(A.data[i].row<B.data[j].row)
{ C.data[k]=A.data[i];
i++;k++;
}
else
{ if(A.data[i].row>B.data[j].row)
{ C.data[k]=B.data[j];
j++;k++;
}
else
{ if(A.data[i].col<B.data[j].col)
{ C.data[k]=A.data[i];
i++;k++;
}
else
{ if(A.data[i].col>B.data[j].col)
{ C.data[k]=B.data[j];
j++;k++;
}
else
{ if(A.data[i].v-B.data[j].v!=0)
{ C.data[k].row=A.data[i].row;
C.data[k].col=A.data[i].col;
C.data[k].v=A.data[i].v-B.data[j].v;
k++;
}
i++;j++;
}
}
}
}
}
while(i<A.t)
{ C.data[k]=A.data[i];
i++;k++;
}
while(j<B.t)
{ C.data[k]=B.data[j];
j++;k++;
}
C.t=k;
return C;
}
Matrix operator *(Matrix A,Matrix B){
Matrix C;
int k,p,crow,brow,q,ccol;
int num[max],pos[max],ctemp[max];
if (A.n==B.m){
for(k=1;k<=B.m;k++)
num[k]=0;
for(k=1;k<=B.t;k++)
num[B.data[k].row]++;
pos[1]=1;
for(k=2;k<=B.t;k++)
pos[k]=pos[k-1]+num[k-1];
pos[1+B.t]=pos[B.t]+1;
C.m=A.m; C.n=B.n; C.t=0; p=1;
while(p<=A.t){
crow=A.data[p].row;
for(k=1;k<=C.n;k++)
ctemp[k]=0;
while (p<=A.t&&A.data[p].row==crow){
brow=A.data[p].col;
for(q=pos[brow];q<=pos[brow+1]-1;q++){
ccol=B.data[q].col;
ctemp[ccol]=ctemp[ccol]+A.data[p].v*B.data[q].v;
}
p=p+1;
}
for(ccol=1;ccol<=B.n;ccol++)
if(ctemp[ccol]!=0){
C.t=C.t+1;
C.data[C.t].row=crow;
C.data[C.t].col=ccol;
C.data[C.t].v=ctemp[ccol];
}
}
}
else
cout<<"这两个矩阵不能相乘";
return C;
}
Matrix operator ~(Matrix A){
Matrix B;
int col,i,p,q;
int num[max],position[max];
B.t=A.t;B.m=A.n; B.n=A.m;
if(B.t){
for(col=1;col<=A.n;col++)
num[col]=0;
for(i=1;i<=A.t;i++)
num[A.data[i].col]++;
position[1]=1;
for(col=2;col<=A.n;col++)
position[col]=position[col-1]+num[col-1];
for(p=1;p<=A.t;p++){
col=A.data[p].col;q=position[col];
B.data[q].row=A.data[p].col;
B.data[q].col=A.data[p].row;
B.data[q].v=A.data[p].v;
position[col]++;
}
}
return B;
}
nMatrix Trs(nMatrix a){ //求逆矩阵的先转置
nMatrix trs;
trs.m = a.n;
trs.n = a.m;
trs.p = new double[a.m * a.n];
for (int i = 0; i < a.m; i++)
{
for (int j = 0; j < a.n; j++)
{
trs.p[j * a.m + i] = a.p[i * a.n + j];
}
}
return trs;
}
nMatrix Adjunct(nMatrix a, int indexm, int indexn){ //求第indexm行indexn列元素的代数余子式
nMatrix adj;
adj.m=a.m - 1;
adj.n=a.n - 1;
adj.p = new double[(a.n - 1) * (a.n - 1)];
for (int i = 0; i < indexm; i++)
{
for (int j = 0; j < indexn; j++)
{
adj.p[i * (a.n - 1) + j] = a.p[i * a.n + j];
}
for (int k = indexn + 1; k < a.n; k++)
{
adj.p[i *(a.n - 1) + k -1] = a.p[i * a.n + k];
}
}
for (int m = indexm + 1; m < a.n; m++)
{
for (int j = 0; j < a.n - 1; j++)
{
adj.p[(m - 1) * (a.n - 1) + j] = a.p[m * a.n + j];
}
for (int k = indexn + 1; k < a.n; k++)
{
adj.p[(m - 1) * (a.n - 1) + k - 1] = a.p[m * a.n + k];
}
}
return adj;
}
double Det(nMatrix a) //递归求行列式
{
double det = 0;
if (a.m != a.n)
{
cout<<"不是方阵,没有行列式!"<<endl;
cout<<"求行列式退出"<<endl;
}
if (a.n == 1)
{
det = a.p[0];
return det;
}
else
{
for (int i = 0; i < a.n; i++)
{
if (i % 2 == 0)
det += a.p[i * a.n] * Det(Adjunct(a, i, 0));
else
det -= a.p[i * a.n] * Det(Adjunct(a, i, 0));
}
}
return det;
}
nMatrix operator !(nMatrix a) { //求矩阵的逆
nMatrix temp;
temp.m=a.n;
temp.n=a.m;
temp.p = new double[a.m * a.n];
//矩阵的逆 = 伴随矩阵 / 行列式
double det = Det(a);
if (det == 0) //如果行列式的值为0,则没有逆
{
cout<<"此矩阵没有逆!"<<endl;
cout<<"求矩阵逆退出!"<<endl;
}
for (int i = 0; i < temp.m; i++)
{
for (int j = 0; j < temp.n; j++)
{
if ((i +j) % 2 == 0)
temp.p[i * temp.m + j] = Det(Adjunct(a, i, j)) / det;
else
temp.p[i * temp.m + j] = -Det(Adjunct(a, i, j)) / det;
}
}
return Trs(temp);
}
int _tmain(int argc, _TCHAR* argv[])
{
Matrix C={0},A={0},B={0};nMatrix a={0}, b={0},temp={0};
cin>>A; cout<<"a=\n"<<A;
cin>>B; cout<<"b=\n"<<B;
C=A+B;cout<<"a+b=\n"<<C;
C=A-B;cout<<"a-b=\n"<<C;
C=A*B;cout<<"a*b=\n"<<C;
C=~A;cout<<"~a=\n"<<C;
In(a);
cout<<"矩阵的行列式为:"<<endl;
cout<<Det(a)<<endl;
cout<<"矩阵的逆为:"<<endl;
temp=!a;cout<<"!a=\n"<<Trs<<endl;
return 0;
}