📄 smatrix.cpp
字号:
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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -