📄 zhanzhi.cpp
字号:
#include<iostream.h>
#include<stdlib.h>
const int Maxrows=100;
typedef int elemtype;
struct Triplenode
{ int row,col; //存储行号和列号
elemtype val; //存储元素值
Triplenode *next; //指向同一行的下一个结点
};
struct LMatrix
{ int m,n,t; //保存稀疏矩阵的行数,列数和非零元素的个数
Triplenode *vector[Maxrows+1];//行指针
};
void initLMatrix(LMatrix &M) //初始化
{ M.m=0;M.n=0;M.t=0;
for(int i=1;i<=Maxrows;i++)
M.vector[i]=NULL;
}
//矩阵的输入
void inputLMatrix(LMatrix &M,int m,int n)
{
M.m=m;M.n=n;
int row,col,val;
int k=0;
Triplenode *p=NULL,*q=NULL;
cout<<"依次输入非零元素的行所在的行号-列号-元素值,(0,0,0)为结束标志"<<endl;
cin>>row>>col>>val;
while(row<0||row>m||col<0||col>n)//判断输入繁的元素一定在矩阵中
{
cout<<"不是此矩阵的元素!请检查非零元素所在的行号,列号,并重新输入。"<<endl;
cout<<"依次输入非零元素的行所在的行号-列号-元素值,(0,0,0)为结束标志"<<endl;
cin>>row>>col>>val;
}
while(row!=0)
{
k++;
p=new Triplenode; //建立新结点
p->row=row;
p->col=col;
p->val=val;
p->next=NULL;
q=M.vector[row]; //使q指向第row行
if(q==NULL) //将结点链接到所在行单链表的末尾
M.vector[row]=p;
else
{
while(q->next!=NULL)
q=q->next;
q->next=p;
}
cout<<"依次输入非零元素的行号-列号-元素值,(0,0,0)为结束标志"<<endl;
cin>>row>>col>>val; //输入一个新三元组
while(row<0||row>m||col<0||col>n)
{
cout<<"不是此矩阵的元素!请检查非零元素所在的行号,列号,并重新输入。"<<endl;
cout<<"依次输入非零元素的行所在的行号-列号-元素值,(0,0,0)为结束标志"<<endl;
cin>>row>>col>>val;
}
}
M.t=k;
}
void outputLMatrix(LMatrix M) //矩阵的输出
{
Triplenode *p;
int i,j;
for(i=1;i<=M.m;i++)
{
for(j=1;j<=M.n;j++)
{
p=M.vector[i];
while(p!=NULL&&p->col!=j) //找第j行的非零元素
p=p->next;
if(p==NULL)
cout<<"0"<<" ";
else
cout<<p->val<<" ";
}
cout<<endl;
}
}
//加法运算
//不必检查矩阵的行列是否相同,因为输入时已经输入了相同大小的矩阵
LMatrix Add(LMatrix M1,LMatrix M2)
{
if(M1.t==0) //矩阵1为空,返回M2
return M2;
if(M2.t==0) //矩阵2为空,返回M1
return M1;
int k=0; //记录相加后结果矩阵M1中结点的个数
for(int i=1;i<=M1.m;i++)
{
Triplenode *p1,*p2,*p; //P指向P1的前驱结点
p=p1=M1.vector[i]; //P,P1指向M1矩阵的第i行单链表的待加的结点
p2=M2.vector[i];//P2指向M2矩阵的第i行单链表的待加的结点
M1.vector[i]=NULL;
while(p1!=NULL&&p2!=NULL)
{
Triplenode *newptr=new Triplenode;
if(p1->col<p2->col)
{
*newptr=*p1; //将P1下移
p1=p1->next;
}
else if(p1->col>p2->col)
{
*newptr=*p2; //将P2下移
p2=p2->next;
}
else if(p1->val+p2->val==0) //两结点值相加为0
{
p1=p1->next;
p2=p2->next;
continue;
}
else
{
*newptr=*p1;
newptr->val+=p2->val; //将P2所指结点的值加到P1所指结点的值上
p1=p1->next;
p2=p2->next;
}
newptr->next=NULL;
if(M1.vector[i]==NULL)
M1.vector[i]=newptr;
else
p->next=newptr;
p=newptr;
k++;
}
while(p1!=NULL&&p2==NULL) //P1不为空P2为空,将P1复制到新结点并插入到M1中
{
Triplenode *newptr=new Triplenode;
*newptr=*p1;
newptr->next=NULL;
if(M1.vector[i]==NULL)
M1.vector[i]=newptr;
else
p->next=newptr;
p=newptr;
p1=p1->next;
k++;
}
while(p1==NULL&&p2!=NULL) //P1为空P2不为空,将P2复制到新结点并插入到M1中
{
Triplenode *newptr=new Triplenode;
*newptr=*p2;
newptr->next=NULL;
if(M1.vector[i]==NULL)
M1.vector[i]=newptr;
else
p->next=newptr;
p=newptr;
p2=p2->next;
k++;
}
}
M1.t=k;
return M1;
}
//矩阵的转置
LMatrix Tranpose(LMatrix M)
{
int i,m,j;
Triplenode *p,*q,*h;
LMatrix M1;//用M1存放转置的矩阵
initLMatrix(M1);//初始化M1
M1.m=M.n;
M1.n=M.m;
M1.t=M.t;
for(i=1;i<=M.m;i++)
{
p=M.vector[i];
if(p==NULL)//如果M矩阵的列为空
continue;
m=0;//控制while循环
while(p!=NULL||m==0)
{
m=p->col;
p->col=p->row;
p->row=m;
p->next=NULL;
j=p->row;
q=M1.vector[j];
if(q==NULL)
M1.vector[j]=p;
else
{
if((p->col)<(q->col))
{
p->next=M1.vector[j];
M1.vector[j]->next=p;
}
else
{
while((p->col)>(q->col))
{
h=q;
q=q->next;
}
p->next=h->next;
h->next=p;
}
}
p=p->next;
}
}
return M1;
}
void main()
{
LMatrix M1,M2,M;
int m,n;
initLMatrix(M1); //初始化矩阵1
initLMatrix(M2); //初始化矩阵2
cout<<"输入待加矩阵的大小,即几行,几列。"<<endl;
cout<<"请输入行:m=";
cin>>m;
cout<<"请输入列:n=";
cin>>n;
cout<<"请输入矩阵1的信息"<<endl;
inputLMatrix(M1,m,n); //输入矩阵M1
cout<<"请输入矩阵2的信息"<<endl;
inputLMatrix(M2,m,n);//输入矩阵M2
cout<<"矩阵1为:"<<endl;
outputLMatrix(M1);
cout<<endl;
cout<<"矩阵2为:"<<endl;
outputLMatrix(M2);
cout<<endl;
M=Add(M1,M2); //将M1,M2进行相加
cout<<"两矩阵之和为:"<<endl;
outputLMatrix(M);//输出两矩阵之和
M1=Tranpose(M1); //对矩阵M1的转置
cout<<"M1的转置矩阵为:"<<endl;
outputLMatrix(M1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -