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

View 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);
}//