idk why these stuffs get stashed for so long and I didn't ever commit them

This commit is contained in:
2025-11-06 09:43:54 +08:00
parent 5dbdfef1a1
commit e01c041259
232 changed files with 22806 additions and 1256 deletions

View 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); // 输出和矩阵
}