idk why these stuffs get stashed for so long and I didn't ever commit them
This commit is contained in:
202
OrigFiles/4_数组和矩阵/AddMatrix/AddMatrix.cpp
Normal file
202
OrigFiles/4_数组和矩阵/AddMatrix/AddMatrix.cpp
Normal file
@@ -0,0 +1,202 @@
|
||||
#include<iostream.h>//cout,cin
|
||||
#include"process.h"//exit()
|
||||
#include"stdio.h"//EOF,NULL
|
||||
|
||||
struct MTNode // 三元组
|
||||
{
|
||||
int i,j; // 行号,列号
|
||||
int e; // 非零元
|
||||
MTNode *next; // 指向同行下一个结点
|
||||
};
|
||||
|
||||
typedef struct
|
||||
{
|
||||
int mu,nu,tu; // 行数、列数、非零元个数
|
||||
MTNode **rops; // 存放各行链表的头指针
|
||||
}LMatrix;
|
||||
|
||||
int cmp(int a,int b) // 列号比较
|
||||
{
|
||||
if(a<b) return -1;
|
||||
else if(a=b) return 0;
|
||||
else return 1;
|
||||
}
|
||||
|
||||
void NodeCopy(MTNode * &s,MTNode * x) // 结点拷贝
|
||||
{
|
||||
s->e=x->e;s->i=x->i;s->j=x->j;
|
||||
}
|
||||
|
||||
void AddNode(MTNode * &lp,MTNode * &lq,MTNode *s) // 表尾添加结点
|
||||
{
|
||||
MTNode *p;
|
||||
p=new MTNode;
|
||||
NodeCopy(p,s);
|
||||
p->next=NULL;
|
||||
if(lp==NULL) // 首元结点
|
||||
{
|
||||
lp=p;
|
||||
lq=p;
|
||||
}
|
||||
else // 非首元结点
|
||||
{
|
||||
lq->next =p;
|
||||
lq=p;
|
||||
}
|
||||
}//
|
||||
|
||||
|
||||
LMatrix MatrixAdd(LMatrix ma,LMatrix mb) // 求矩阵和
|
||||
{
|
||||
LMatrix mc;
|
||||
MTNode *pa,*pb,*pc; // 分别指向被加数、加数、和矩阵行向量首元结点
|
||||
MTNode *s;//
|
||||
int i,sum;
|
||||
int m,n; // 行数,列数
|
||||
int flag=1;
|
||||
m=ma.mu ;
|
||||
n=ma.nu ;
|
||||
mc.mu=m;mc.nu=n;mc.tu=0;mc.rops=NULL;
|
||||
if(mc.rops) delete [] mc.rops;
|
||||
mc.rops=new MTNode* [m];
|
||||
for(i=0;i<m;i++)
|
||||
mc.rops[i]=NULL; // C行指针向量初始化
|
||||
for(i=0;i<m;i++)
|
||||
{
|
||||
pa=ma.rops[i];
|
||||
pb=mb.rops[i];
|
||||
pc=mc.rops[i];
|
||||
while(pa && pb) // 被加矩阵、加矩阵行链不空
|
||||
{
|
||||
flag=1;
|
||||
if(pa->j<pb->j)
|
||||
{
|
||||
s=new MTNode;//
|
||||
NodeCopy(s,pa);
|
||||
s->next=NULL;
|
||||
pa=pa->next;
|
||||
}
|
||||
else if(pa->j==pb->j)
|
||||
{
|
||||
sum=pa->e+pb->e;
|
||||
if(sum==0) flag=0;
|
||||
else
|
||||
{
|
||||
s=new MTNode;
|
||||
NodeCopy(s,pa);
|
||||
s->e=sum;
|
||||
s->next=NULL;
|
||||
}
|
||||
pa=pa->next;pb=pb->next;//pa,pb后移
|
||||
}
|
||||
else
|
||||
{
|
||||
s=new MTNode;
|
||||
NodeCopy(s,pb); // 复制pb所指结点
|
||||
pb=pb->next; // pb后移
|
||||
s->next=NULL;
|
||||
}
|
||||
if(flag) // 有新结点生成
|
||||
{
|
||||
mc.tu++;
|
||||
AddNode(mc.rops[i],pc,s);
|
||||
}
|
||||
}//while
|
||||
if(pa) // pa不空,复制pa剩余链到和矩阵中
|
||||
{
|
||||
while(pa)
|
||||
{
|
||||
s=new MTNode;
|
||||
NodeCopy(s,pa);pa=pa->next;
|
||||
AddNode(mc.rops [i],pc,s);
|
||||
}//while
|
||||
}//if(pa)
|
||||
if(pb) // pb不空,复制pb剩余链到和矩阵中
|
||||
{
|
||||
while(pb)
|
||||
{
|
||||
s=new MTNode;
|
||||
NodeCopy(s,pb);pb=pb->next ;
|
||||
AddNode(mc.rops [i],pc,s);
|
||||
}//while
|
||||
}//if(pb)
|
||||
}//for
|
||||
return mc;
|
||||
}//MAdd
|
||||
|
||||
void MDisp(LMatrix a)
|
||||
{
|
||||
MTNode *p;
|
||||
int i,j,c=0;
|
||||
for(i=0;i<a.mu;i++)
|
||||
{
|
||||
p=a.rops[i];
|
||||
for(j=0;j<a.nu;j++)
|
||||
{
|
||||
if(p==NULL)
|
||||
cout<<'\t'<<c;
|
||||
else if (j<p->j)
|
||||
cout<<'\t'<<c;
|
||||
else
|
||||
{
|
||||
cout<<'\t'<<p->e;
|
||||
p=p->next;
|
||||
}
|
||||
}//for
|
||||
cout<<endl;
|
||||
}//for
|
||||
}//MatrixDisp
|
||||
|
||||
LMatrix MCreate(int d[][3],int m,int n,int k)
|
||||
{ // 由三元组的二维数组生成行向量稀疏存储矩阵
|
||||
LMatrix M={m,n,k,NULL};
|
||||
int i,r1,r2;
|
||||
MTNode *s,*p; // 工作指针
|
||||
if(M.rops) delete [] M.rops;
|
||||
M.rops=new MTNode* [m];
|
||||
for(i=0;i<m;i++)
|
||||
M.rops[i]=NULL;
|
||||
r1=m;
|
||||
p=M.rops[r1];//
|
||||
for(i=0;i<k;i++) // 扫描非零元数组
|
||||
{
|
||||
s=new MTNode;
|
||||
s->i=d[i][0];
|
||||
s->j=d[i][1];
|
||||
s->e=d[i][2];
|
||||
r2=s->i; // 非零元所在行
|
||||
if(r2!=r1) // 创建链表第1个结点
|
||||
{
|
||||
M.rops[r2]=s;
|
||||
s->next=NULL;
|
||||
p=s;
|
||||
r1=r2;
|
||||
}
|
||||
else // 创建链表非首元结点
|
||||
{
|
||||
s->next=p->next;
|
||||
p->next =s;
|
||||
p=s;
|
||||
}
|
||||
}//for
|
||||
return M;
|
||||
}//MCreate
|
||||
|
||||
|
||||
void main()
|
||||
{
|
||||
//MTNode *p;
|
||||
LMatrix ma,mb,mc;
|
||||
int m=4,n=6; // 行数,列数
|
||||
int da[5][3]={{0,1,3},{1,1,2},{1,3,5},{3,0,9},{3,5,1}};
|
||||
int db[4][3]={{0,2,7},{1,1,6},{1,3,-5},{2,1,4}};
|
||||
ma=MCreate(da,4,6,5); // 构造ma矩阵
|
||||
cout<<"ma="<<endl;
|
||||
MDisp(ma); // 显示ma矩阵
|
||||
mb=MCreate(db,4,6,4); // 构造mb矩阵
|
||||
cout<<"mb="<<endl;
|
||||
MDisp(mb); // 显示mb矩阵
|
||||
mc=MatrixAdd(ma,mb); // 求mc=ma+mb
|
||||
cout<<"mc=ma+mb="<<endl;
|
||||
MDisp(mc); // 输出和矩阵
|
||||
}
|
||||
130
OrigFiles/4_数组和矩阵/MatrixTrans/MatrixTrans.cpp
Normal file
130
OrigFiles/4_数组和矩阵/MatrixTrans/MatrixTrans.cpp
Normal file
@@ -0,0 +1,130 @@
|
||||
#include<iostream>//cout,cin
|
||||
using namespace std;
|
||||
|
||||
|
||||
struct MNode //三元组结点
|
||||
{
|
||||
int i,j; //行号,列号
|
||||
int e; //非零元
|
||||
};
|
||||
|
||||
|
||||
struct TSMatrix
|
||||
{
|
||||
int mu,nu,tu; // 行数、列数、非零元个数
|
||||
MNode *data; // 三元组表
|
||||
};
|
||||
|
||||
TSMatrix MCreate(int d[][3],int m,int n,int k) //由三元组的二维数组生成行向量稀疏存储矩阵
|
||||
{
|
||||
TSMatrix M={m,n,k,NULL};
|
||||
if(k!=0)
|
||||
M.data=new MNode[k];
|
||||
for(int i=0;i<k;i++)
|
||||
{
|
||||
M.data [i].i=d[i][0];
|
||||
M.data [i].j=d[i][1];
|
||||
M.data [i].e=d[i][2];
|
||||
}
|
||||
return M;
|
||||
}//
|
||||
|
||||
|
||||
void MDisp(TSMatrix a) //矩阵显示
|
||||
{
|
||||
MNode p;
|
||||
int i,j,k=0,c=0;
|
||||
p=a.data[k];
|
||||
for(i=0;i<a.mu;i++)
|
||||
{
|
||||
for(j=0;j<a.nu;j++)
|
||||
{
|
||||
if(k<a.tu && p.i ==i && p.j ==j)
|
||||
{
|
||||
cout<<'\t'<<p.e;
|
||||
k++;
|
||||
if(k<a.tu ) p=a.data[k];
|
||||
}
|
||||
else
|
||||
{
|
||||
cout<<'\t'<<c;
|
||||
}
|
||||
}//for
|
||||
cout<<endl;
|
||||
cout<<endl;
|
||||
}//for
|
||||
}//MatrixDisp
|
||||
|
||||
//算法4.1 转置算法一
|
||||
void MatrixTrans_1(TSMatrix A,TSMatrix &B)
|
||||
{//
|
||||
int col,p,q;
|
||||
B.mu=A.nu;B.nu=A.mu;B.tu=A.tu; //B的行数、列数、非零元个数分别等于A的列数、行数和非零元个数
|
||||
if(B.tu) // 矩阵B有非零元
|
||||
{
|
||||
q=0;
|
||||
for(col=0;col<A.nu;++col) // 按列扫描A矩阵
|
||||
for(p=0;p<A.tu;++p)
|
||||
if(A.data[p].j==col) // col列有非零元
|
||||
{
|
||||
B.data[q].i=A.data[p].j; // 交换行、列号,生成转置元素
|
||||
B.data[q].j=A.data[p].i;
|
||||
B.data[q].e=A.data[p].e;
|
||||
++q;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
//算法4.2 快速转置
|
||||
void MatrixTrans_2(TSMatrix A,TSMatrix &B)
|
||||
{
|
||||
int col,i,k,q;
|
||||
int *num,*cpot;
|
||||
B.mu=A.nu;B.nu=A.mu;B.tu=A.tu; //B的行数、列数、非零元个数分别等于A的列数、行数和非零元个数
|
||||
num= new int[B.nu];
|
||||
cpot=new int [B.nu];
|
||||
if(B.tu) // 非零元个数不为零,实施转置
|
||||
{
|
||||
for(col=0;col<A.nu ;col++) //A中每一列非零元个数初始化为0
|
||||
num[col]=0;
|
||||
for(i=0;i<A.tu;i++) //求矩阵A中每一列非零元个数
|
||||
num[A.data [i].j]++;
|
||||
cpot[0]=0; //A中第0列首个非零元在B中的下标
|
||||
for(col=1;col<=A.nu ;++col) // 求A中每一列首个非零元在B中的下标
|
||||
cpot[col]=cpot[col-1]+num[col-1];
|
||||
for(k=0;k<A.tu;++k) //扫描A的三元组表
|
||||
{
|
||||
col=A.data [k].j ; //当前三元组列号
|
||||
q=cpot[col]; //当前三元组在B中的下标
|
||||
B.data[q].i=A.data[k].j;
|
||||
B.data [q].j =A.data [k].i;
|
||||
B.data [q].e =A.data [k].e;
|
||||
cpot[col]++; // 预置同一列下一个三元组在B中的下标
|
||||
}//for
|
||||
}//if
|
||||
}//
|
||||
|
||||
|
||||
|
||||
void main()
|
||||
{
|
||||
TSMatrix ma,mb1,mb2;
|
||||
int m1=4,n1=6,k1=6; //被乘矩阵行数,列数,非零元个数
|
||||
int da[6][3]={{0,2,11},{0,4,12},{1,3,22},
|
||||
{2,1,31}, {2,3,32},{3,0,41}}; //ma阵的非零元
|
||||
ma=MCreate(da,m1,n1,k1); //生成三元组顺序存储的ma阵
|
||||
cout<<"ma="<<endl;
|
||||
MDisp(ma); //显示ma阵
|
||||
mb1.data=new MNode[ma.tu];
|
||||
mb2.data=new MNode[ma.tu];
|
||||
cout<<"方法一:直接取,顺序存"<<endl; //用方法一转置矩阵
|
||||
MatrixTrans_1(ma,mb1);
|
||||
cout<<"mb="<<endl; //显示转置矩阵
|
||||
MDisp(mb1);
|
||||
cout<<"方法二:顺序取,直接存"<<endl; //用方法二转置矩阵
|
||||
MatrixTrans_2(ma,mb2);
|
||||
cout<<"mb="<<endl; //显示转置矩阵
|
||||
MDisp(mb2);
|
||||
}//
|
||||
Reference in New Issue
Block a user