c++ 转换为 c 的问题,请教各位大神帮忙修改下,谢谢。
#include<iostream.h> #include<stdlib.h>
#include<iomanip.h>
#define MaxNum 10 //定义一个全局常量,用来改变装头结点的数组的长度
/******************** 定义结构 ***********************/
typedef struct Node
{
int row,col;
int value;
struct Node *right,*down;
}SMNode, *SMLink; //定义节点,每个节点含有五个域,矩阵元素的行号row,列号col,值e,指向下一个节点的指针right和down
typedef struct SMatrix
{
SMLink h;
int mu,nu,tu;
}SMatrix;//定义矩阵,该结构含四个域:头节点,矩阵的行数mu,列数nu,以及矩阵中非零元的个数
SMatrix sm[MaxNum];//定义一个数组,用来存放矩阵的头节点,该系统可处理矩阵的最大数量为MaxNum
/******************** 函数声明 ***********************/
void InitSMatix();//初始化函数
void CreateSMatrix();//建立矩阵函数
void InsertSMatrix(SMatrix &smm,int i,int j,int e); //插入节点函数,在建立矩阵时需要调用
void DestroySMatrix(int n); //删除矩阵函数
int PrintSMatrix(int n); //打印矩阵函数
void AddSMatrix(); //矩阵加法函数
void SubSMatrix(); //矩阵减法函数
void MultSMatrix(); //矩阵乘法函数
void TransposeSMatrix(int n);//矩阵转置函数
int show();//界面提示函数
/******************** 初始化函数 ***********************/
void InitSMatix()
{
SMLink p;
int i;
for(i=0;i<MaxNum;i++)
{
if(!(p=(SMLink)malloc(sizeof(SMNode))))
cout<<"OVERFLOW";
sm[i].h=p;//建立头节点,并把头节点置空
p->row=NULL;
p->col=NULL;
p->value=NULL;
p->right=NULL;
p->down=NULL;
}
}//InitSmatixList
/******************** 矩阵创建函数 ***********************/
void CreateSMatrix()
{
SMLink p;
int i,j,e,m,n;
int temp;
for(m=0;m<MaxNum;m++)
if((sm[m].h)->right==NULL)
break;
if(m==MaxNum)
{
cout<<"内存已满!"<<endl;
return;
}//查找空的存储空间,确认有足够的存储空间
cout<<endl<<"请输入矩阵的行数:";
cin>>sm[m].mu;
cout<<"请输入矩阵的列数:";
cin>>sm[m].nu;
temp=sm[m].mu*sm[m].nu;//输入矩阵的特征值:行数,列数,非零元个数
do
{
cout<<"请输入矩阵的非零元个数:";
cin>>sm[m].tu;
if(sm[m].tu>temp)
cout<<"结点数超出矩阵范围,请确认输入!"<<endl;
}while(sm[m].tu>temp);//确认节点个数正确
for(n=1;n<=sm[m].tu;n++)
{
do
{
cout<<"请输入第"<<n<<"个非零元的行号:";
cin>>i;
if(i>sm[m].mu) cout<<"ERROR!"<<endl;
}while(i>sm[m].mu);
do
{
cout<<"请输入第"<<n<<"个非零元的列号:";
cin>>j;
if(j>sm[m].nu) cout<<"ERROR!"<<endl;
}while(j>sm[m].nu);
cout<<"请输入第"<<n<<"个非零元的值:";
cin>>e;
InsertSMatrix(sm[m],i,j,e); //输入一个新的节点,并利用插入函数将其联入链表中
}
p=sm[m].h;
while(p->right!=NULL)
p=p->right;
p->right=sm[m].h;
p=sm[m].h;
while(p->down!=NULL)
p=p->down;
p->down=sm[m].h;//最后连上头结点形成循环链表
}//CreateSMatrix
/******************** 插入结点函数 ***********************/
void InsertSMatrix(SMatrix &smm,int i,int j,int e)
{
SMLink p,q,r;
p=smm.h;
while(p->right!=NULL&&p->row<i)
{
q=p;
p=p->right;
}//用两个指针找到插入节点的位置
if(p->row>i)//情况一:插入节点的行号刚好介于p,q指针所指节点的行号之间,插在它们之间即可
{
if(!(r=(SMLink)malloc(sizeof(SMNode))))
cout<<"OVERFLOW";
r->row=i;
r->col=j;
r->value=e;
r->right=p;
r->down=NULL;
q->right=r;
}
else if(p->row==i) //情况二:p的行号与插入节点的行号相等,
{
while((p->right!=NULL)&&(p->col<j)&&(p->row==i))
{
q=p;
p=p->right;
}
if(p->row==i&&p->col==j) //确定插入的位置没有节点
{
cout<<"已存在,请确认输入!";
return;
}
else if(p->row==i&&p->col>j)//在行号相等时,若列号位于p,q之间时插在其间即可
{
if(!(r=(SMLink)malloc(sizeof(SMNode))))
cout<<"OVERFLOW";
r->row=i;
r->col=j;
r->value=e;
r->right=p;
r->down=NULL;
q->right=r;
}
else if(p->row>i)
{
if(!(r=(SMLink)malloc(sizeof(SMNode))))
cout<<"OVERFLOW";
r->row=i;
r->col=j;
r->value=e;
r->right=p;
r->down=NULL;
q->right=r;
}
else if(p->right==NULL)//新插入的节点为行号列号最大的节点,直接插在末尾即可
{
if(!(r=(SMLink)malloc(sizeof(SMNode))))
cout<<"OVERFLOW";
r->row=i;
r->col=j;
r->value=e;
r->right=NULL;
r->down=NULL;
p->right=r;
}
}
else if(p->right==NULL) //新插入的节点为行号列号最大的节点,直接插在末尾即可
{
if(!(r=(SMLink)malloc(sizeof(SMNode))))
cout<<"OVERFLOW";
r->row=i;
r->col=j;
r->value=e;
r->right=NULL;
r->down=NULL;
p->right=r;
}
//以下为将节点安列再次插入,其算法与按行插入完全相同
p=smm.h;
while(p->down!=NULL&&p->col<j)
{
q=p;
p=p->down;
}
if(p->col>j)
{
if(!(r=(SMLink)malloc(sizeof(SMNode))))
cout<<"OVERFLOW";
r->row=i;
r->col=j;
r->value=e;
r->right=NULL;
r->down=p;
q->down=r;
}
else if(p->col==j)
{
while((p->down!=NULL)&&(p->row<i)&&(p->col==j))
{
q=p;
p=p->down;
}
if(p->col==j&&p->row==i)
{
cout<<"已存在,请确认输入!";
return;
}
else if(p->col==j&&p->row>i)
{
if(!(r=(SMLink)malloc(sizeof(SMNode))))
cout<<"OVERFLOW";
r->row=i;
r->col=j;
r->value=e;
r->right=NULL;
r->down=p;
q->down=r;
}
else if(p->col>j)
{
if(!(r=(SMLink)malloc(sizeof(SMNode))))
cout<<"OVERFLOW";
r->row=i;
r->col=j;
r->value=e;
r->right=NULL;
r->down=p;
q->down=r;
}
else if(p->down==NULL)
{
if(!(r=(SMLink)malloc(sizeof(SMNode))))
cout<<"OVERFLOW";
r->row=i;
r->col=j;
r->value=e;
r->right=NULL;
r->down=NULL;
p->down=r;
}
}
else if(p->down==NULL)
{
if(!(r=(SMLink)malloc(sizeof(SMNode))))
cout<<"OVERFLOW";
r->row=i;
r->col=j;
r->value=e;
r->right=NULL;
r->down=NULL;
p->down=r;
}//按列插入结束
}//InsertSMartrix
/******************** 矩阵删除函数 ***********************/
void DestroySMatrix(int n)
{
SMLink p,q,r;
p=sm[n].h;
if(p->right==NULL)
{
cout<<"矩阵不存在,请确定输入!"<<endl;
return;
}
q=p->right;
r=p->down;
while(q!=sm[n].h)
{
p=q;
q=q->right;
delete p;
}
while(r!=sm[n].h)
{
p=r;
r=r->down;
delete p;
}
sm[n].h->right=NULL;//在删除后将头节点置为空
sm[n].h->down=NULL;
sm[n].mu=NULL;
sm[n].nu=NULL;
sm[n].tu=NULL;
cout<<"删除成功!"<<endl;
}//DestroySMatrix
/******************** 打印函数 ***********************/
int PrintSMatrix(int n)
{
SMLink p;
int i,j;
int k=0;
p=sm[n].h;
if(p->right==NULL)
{
cout<<"矩阵不存在,请确定输入!"<<endl;
return 0;
}//确认要打印的矩阵存在
p=p->right;//为按行打印矩阵做准备
for(i=1;i<=sm[n].mu;i++)
{
for(j=1;j<=sm[n].nu;j++)
{
if(p->row==i&&p->col==j)//若i行,j列的元素存在,则打印
{
cout<<setw(4)<<p->value;//打印四个空格
p=p->right;
k++;
}
else
cout<<setw(4)<<"0";//否则输出零
}
cout<<endl;
}
return k;//返回矩阵非零元的个数
}//PrintSMatrix
/******************** 显示函数 ***********************/
int show()
{
int i,c;
do
{
for(i=0;i<MaxNum;i++)
{
if((sm[i].h)->right!=NULL)
cout<<i<<" : "<<sm[i].mu<<"X"<<sm[i].nu<<endl;
else
cout<<i<<" : "<<"NULL"<<endl;
}
cout<<"请选择输出矩阵(0--9,退出-1):";
cin>>c;
if((c<0||c>9)&&c!=-1)
cout<<"输入错误,请重新输入!"<<endl;
if(c>=0&&c<=9) break;
}while(c!=-1);
return c;//显示要用到的函数的标号,并返回其标号
}
/******************** 加法函数 ***********************/
void AddSMatrix()
{
SMLink p,q;
int i,j,m,e;
int a,b;
a=show();//输入第一个用来进行加法的矩阵标号
b=show();//输入另一个用来进行加法的矩阵标号
if((sm[a].mu!=sm[b].mu)||(sm[a].nu!=sm[b].nu))
{
cout<<"矩阵行列不匹配,请重新输入!"<<endl;
return;
}//判断矩阵的形状是否相同
else
{
for(m=0;m<MaxNum;m++)
if((sm[m].h)->right==NULL) break;
if(m==MaxNum)
{
cout<<"内存已满!"<<endl;
return;
}//判断是否有存储空间
sm[m].mu=sm[a].mu;
sm[m].nu=sm[a].nu;//对结果矩阵进行初始化:给出其行数和列数。
}
p=(sm[a].h)->right;
q=(sm[b].h)->right;//为按行实现加法做准备
for(i=1;i<=sm[a].mu;i++)
for(j=1;j<=sm[a].nu;j++)
{
if((p->row==i&&p->col==j)&&(q->row==i&&q->col==j))//如果两个矩阵i行,j列的元素都不为零,相加
{
e=p->value+q->value;
if(e!=0) InsertSMatrix(sm[m],i,j,e);//相加结果若不为零,则调用插入函数,将该节点插入新的矩阵中
p=p->right;
q=q->right;//两指针右移
}
else if(p->row==i&&p->col==j)//仅仅第一个矩阵的i行,j列元素不为零,直接将其插入新的矩阵即可
{
e=p->value;
InsertSMatrix(sm[m],i,j,e);
p=p->right;
}
else if(q->row==i&&q->col==j)//第二个矩阵的 i行,j列元素不为零,处理同上
{
e=q->value;
InsertSMatrix(sm[m],i,j,e);
q=q->right;
}
}
p=sm[m].h;
while(p->right!=NULL)
p=p->right;
p->right=sm[m].h;
p=sm[m].h;
while(p->down!=NULL)
p=p->down;
p->down=sm[m].h; //将新矩阵的最后一个节点的RIGHT或DOWN域连在头节点上,形成循环链表
cout<<"矩阵相加结果为:"<<endl;
sm[m].tu=PrintSMatrix(m);//调用打印函数,返回新的矩阵的非零元的个数
}//AddSMatrix
/******************** 减法函数 ***********************/
void SubSMatrix()//核心算法与加法完全相同,不加赘述
{
SMLink p,q;
int i,j,m,e;
int a,b;
a=show();
b=show();
if((sm[a].mu!=sm[b].mu)||(sm[a].nu!=sm[b].nu))
{
cout<<"矩阵行列不匹配,请重新输入!"<<endl;
return;
}
else
{
for(m=0;m<MaxNum;m++)
if((sm[m].h)->right==NULL) break;
if(m==MaxNum)
{
cout<<"内存已满!"<<endl;
return;
}
sm[m].mu=sm[a].mu;
sm[m].nu=sm[a].nu;
}
p=(sm[a].h)->right;
q=(sm[b].h)->right;
for(i=1;i<=sm[a].mu;i++)
for(j=1;j<=sm[a].nu;j++)
{
if((p->row==i&&p->col==j)&&(q->row==i&&q->col==j))
{
e=p->value-q->value;
if(e!=0) InsertSMatrix(sm[m],i,j,e);
p=p->right;
q=q->right;
}
else if(p->row==i&&p->value==j)
{
e=p->value;
InsertSMatrix(sm[m],i,j,e);
p=p->right;
}
else if(q->row==i&&q->value==j)
{
e=0-q->value;
InsertSMatrix(sm[m],i,j,e);
q=q->right;
}
}
p=sm[m].h;
while(p->right!=NULL)
p=p->right;
p->right=sm[m].h;
p=sm[m].h;
while(p->down!=NULL)
p=p->down;
p->down=sm[m].h;
cout<<"矩阵相减结果为:"<<endl;
sm[m].tu=PrintSMatrix(m);
}//SubSMatrix
/**************** 乘法函数 ********************/
void MultSMatrix()
{
int c1,c2;
c1=show();
c2=show();//输入两个已存储的矩阵
int i,j,m,sum;
SMLink p,q,r;
p=sm[c1].h;
q=sm[c2].h;
if(p->right==NULL||q->right==NULL||sm[c1].nu!=sm[c2].mu)
cout<<"矩阵为空或行列不匹配,其检查错误!" <<endl;
else
{
for(m=0;m<MaxNum;m++)
if((sm[m].h)->right==NULL)
break;
if(m==MaxNum)
{
cout<<"内存已满请删除!" ;
return;
}
sm[m].mu=sm[c1].mu;
sm[m].nu=sm[c2].nu;//结果矩阵的特征值:行数和列数
p=p->right;//第一个矩阵按行搜索
q=q->down;//第二个矩阵安列搜索
for(i=1;i<=sm[c1].mu;i++)
for(j=1;j<=sm[c2].nu;j++)
{
sum=0;
while(p->row==i&&q->col==j)
{
while(p->col>q->row)
q=q->down;
while(p->col<q->row)
p=p->right;//以上两个循环用来寻找两个矩阵i行,j列的元素都不为零
sum=sum+p->value*q->value;
p=p->right;
q=q->down;
}
if(sum!=0)
InsertSMatrix(sm[m],i,j,sum);
}
p=sm[m].h;
while(p->right!=NULL)
p=p->right;
p->right=sm[m].h;
p=sm[m].h;
while(p->down!=NULL)
p=p->down;
p->down=sm[m].h;
cout<<"矩阵相乘结果为:"<<endl;//链表头,形成循环链表
sm[m].tu=PrintSMatrix(m); //调用打印函数,返回新的矩阵的非零元的个数
}
}//MultSMatrix
/**************** 转置函数 ********************/
void TransposeSMatrix(int n)
{
int m;
int ti,tj,te,k;
SMLink p;
if((sm[n].h)->right==NULL)
{
cout<<"矩阵不存在,请确认输入!"<<endl;
return;
}
else
{
for(m=0;m<MaxNum;m++)
if((sm[m].h)->right==NULL) break;
if(m==MaxNum)
{
cout<<"内存已满!"<<endl;
return;
}
sm[m].mu=sm[n].nu;
sm[m].nu=sm[n].mu;
sm[m].tu=sm[n].tu;//矩阵转置的初始化,行数列数调换 ,非零元个数不改变
}
p=sm[n].h;
for(k=0;k<sm[n].tu;k++)
{
p=p->right;
ti=p->row;
tj=p->col;
te=p->value;
InsertSMatrix(sm[m],tj,ti,te);
}//利用插入函数轻松搞定
p=sm[m].h;
while(p->right!=NULL)
p=p->right;
p->right=sm[m].h;
p=sm[m].h;
while(p->down!=NULL)
p=p->down;
p->down=sm[m].h;
cout<<"矩阵转置结果为:"<<endl;
PrintSMatrix(m);
}//TransposeSMatrix
int main()
{
int n;
char c;
InitSMatix();
do
{
cout<<"\n\t\t\t ******************************\n";
cout<<" \t\t\t * 稀 疏 矩 阵 运 算 器 *\n";
cout<<" \t\t\t ******************************\n";
cout<<" \t\t\t * 1-->创建矩阵 *\n";
cout<<" \t\t\t * 2-->输出矩阵 *\n";
cout<<" \t\t\t * 3-->删除矩阵 *\n";
cout<<" \t\t\t * 4-->加法运算 *\n";
cout<<" \t\t\t * 5-->减法运算 *\n";
cout<<" \t\t\t * 6-->乘法运算 *\n";
cout<<" \t\t\t * 7-->转置运算 *\n";
cout<<" \t\t\t * 8-->退出 *\n";
cout<<" \t\t\t ******************************\n";
cout<<"\t\t\t\t请输入(1--8):";
cin>>c;
switch(c)
{
case '1':CreateSMatrix();break;
case '2':n=show();PrintSMatrix(n);break;
case '3':n=show();DestroySMatrix(n);break;
case '4':AddSMatrix();break;
case '5':SubSMatrix();break;
case '6':MultSMatrix();break;
case '7':n=show();TransposeSMatrix(n);break;
case '8':break;
default:cout<<"输入错误!请重新输入!"<<endl;
}
if(c=='8') break;
}while(c!='8');
}//main