mplate <class Type>SparseMatrix<Type>
SparseMatrix<Type>::SparseMatrix::FastTranspose()
{
int RowSize = new int[Cols]; // 统计各列非零元素个数
int RowStart = new int[Cols]; // 预计转置后各行存放位置
SparseMatrix b; // 存放转置结果
bRows = cols; bcols = Rows; bTerms = Terms;
if (Terms>0) //nonzero matrix
{
for (int i=0;i<Cols;i++) RowSize[i] = 0; //initialize
for (i=0;i<terms;i++) RowSize[smArray[i]col]++;
//RowStart[i]=starting position of row i in b
RowStart[0]=0;
for (i=1;i<Cols;i++) RowStart[i] = RowStart[i-1]+
RowSize[i-1];
for (i=0;i<Terms;i++) //move from a to b
{
int j=Rowstart[smArray[i]col];
bsmArray[j]row=smArray[i]col;
bsmArray[j]col= smArray[i]row;
bsmArray[j]value= smArray[i]value;
RowStart[smArray[i]col]++;
} //end of for
}
delete [ ]Rowsize;
delete [ ]Rowstart;
return b;
}
另外,站长团上有产品团购,便宜有保证
#include <iostream>
using namespace std;
const int MAXSIZE=100; // 定义非零元素的最多个数
const int MAXROW=10; // 定义数组的行数的最大值
typedef struct { // 定义三元组的元素
int i,j; //行数 列数
int e; //非零元的值
}Triple;
typedef struct { // 定义普通三元组对象
Triple data[MAXSIZE+1];
int a,b,c; //行数,列数,非零元个数
}TSMatrix;
typedef struct { // 定义带链接信息的三元组对象
Triple data[MAXSIZE+2];
int rpos[MAXROW+1];
int a,b,c;
}RLSMatrix;
template <class P>
int shuru(P & T,int y){ //输入矩阵,按三元组格式输入
cout<<"输入稀疏矩阵的行,列和非零元素个数:"<<endl;
cin>>Ta>>Tb>>Tc;
cout<<"请输出非零元素的位置和值:"<<endl;
int k=1;
for(;k<=Tc;k++)
cin>>Tdata[k]i>>Tdata[k]j>>Tdata[k]e;
return 1;
}
template <class P>
void shuchu(P T){ // 输出矩阵,按标准格式输出
int m,n,k=1;
for(m=0;m<Ta;m++){
for(n=0;n<Tb;n++){
if((Tdata[k]i-1)==m&&(Tdata[k]j-1)==n){
coutwidth(4);
cout<<Tdata[k++]e;}
else{
coutwidth(4); cout<<"0"; }
}
cout<<endl;
}
}
void zhuanzhi( ) // 求矩阵的转置矩阵
{
TSMatrix M,T; //定义预转置的矩阵
shuru(M, 0); //输入矩阵
int num[MAXROW+1];
int cpot[MAXROW+1]; // 构建辅助数组
int q,p,t;
Tc=Mc; Ta=Mb; Tb=Ma;
if(Tc){
for(int col=1;col<=Mc;col++) num[col]=0;
for(t=1;t<=Mc;t++) ++num[Mdata[t]j];
cpot[1]=1;
for(int i=2;i<=Mb;i++) cpot[i]=cpot[i-1]+num[i-1]; // 求出每一列中非零元素在三元组中出现的位置
for(p=1;p<=Mc;p++){
col=Mdata[p]j; q=cpot[col];
Tdata[q]i=col; Tdata[q]j=Mdata[p]i;
Tdata[q]e=Mdata[p]e; ++cpot[col];
}
}
cout<<"输入稀疏矩阵的转置矩阵为"<<endl;
shuchu(T);
}
void Count(RLSMatrix &T) // 求取每一行中非零元素在三元组中出现的位置
{
int num[MAXROW+1];
for(int col=1;col<=Ta;col++) num[col]=0;
for(col=1;col<=Tc;col++) ++num[Tdata[col]i];
Trpos[1]=1;
for(int i=2;i<=Ta;i++) Trpos[i]=Trpos[i-1]+num[i-1]; }
typedef struct OLNode // 定义十字链表元素
{
int i,j; //该非零元的行列下标
int e; //非零元值
struct OLNode right,down; // 该非零元所在行表和列表的后继元素
}OLNode,OLink; typedef struct // 定义十字链表对象结构体
{
OLink rhead,chead; //
int a,b,c; // 系数矩阵的行数,列数,和非零元素个数
}CrossList; void CreateSMatrix_OL(CrossList & M) // 创建十字链表
{
int x,y,m;
cout<<"请输入稀疏矩阵的行,列,及非零元素个数"<<endl;
cin>>Ma>>Mb>>Mc;
if(!(Mrhead=(OLink)malloc((Ma+1)sizeof(OLink)))) exit(0);
if(!(Mchead=(OLink)malloc((Mb+1)sizeof(OLink)))) exit(0);
for(x=0;x<=Ma;x++)
Mrhead[x]=NULL; // 初始化各行,列头指针,分别为NULL
for(x=0;x<=Mb;x++)
Mchead[x]=NULL;
cout<<"请按三元组的格式输入数组:"<<endl;
for(int i=1;i<=Mc;i++){
cin>>x>>y>>m; // 按任意顺序输入非零元,(普通三元组形式输入)
OLink p,q;
if(!(p=(OLink)malloc(sizeof(OLNode)))) exit(0); // 开辟新节点,用来存储输入的新元素
p->i=x; p->j=y; p->e=m;
if(Mrhead[x]==NULL||Mrhead[x]->j>y){
p->right=Mrhead[x]; Mrhead[x]=p;
}
else{
for(q=Mrhead[x];(q->right)&&(q->right->j<y);q=q->right); // 查找节点在行表中的插入位置
p->right=q->right; q->right=p; // 完成行插入
}
if(Mchead[y]==NULL||Mchead[y]->i>x){
p->down=Mchead[y]; Mchead[y]=p;
}
else{
for(q=Mchead[y];(q->down)&&(q->down->i<x);q=q->down); // 查找节点在列表中的插入位置
p->down=q->down; q->down=p; // 完成列插入 }
}
} void shuchu(CrossList T){ // 输出十字链表,用普通数组形式输出
for(int i=1;i<=Ta;i++){
OLink p=Trhead[i];
for(int j=1;j<=Tb;j++){
if((p)&&(j==p->j)){
cout<<p->e; p=p->right;
}
else
cout<<"0";
}
cout<<endl;
}
}
void chengfa() //矩阵的乘法
{
CrossList M,N; // 创建两个十字链表对象,并初始化
CreateSMatrix_OL(M);
CreateSMatrix_OL(N);
cout<<"输入的两稀疏矩阵的积为:"<<endl;
OLink pa,pb,pre ,hl[MAXROW+1]; //定义辅助指针,pa,pb分别为M,N当前比较的元素,pre为pa的前驱元素
for(int x=1;x<=Mb;x++) hl[x]=Mchead[x];
for(int k=1;k<=Ma;k++){ // 对M的每一行进行 *** 作
pa=Mrhead[k]; pb=Nrhead[k]; pre=NULL;
while(pb){ // 把N中此行的每个元素取出,
OLink p;
if(!(p=(OLink)malloc(sizeof(OLNode)))) exit(0); // 开辟新节点,存储N中取出的元素
p->e=pb->e; p->i=pb->i; p->j=pb->j;
if(NULL==pa||pa->j>pb->j){ // 当M此行已经检查完或者pb因该放在pa前面
if(NULL==pre)
Mrhead[p->i]=p;
else
pre->right=p;
p->right=pa; pre=p;
if(NULL==Mchead[p->j]){ // 进行列插入
Mchead[p->j]=p; p->down=NULL;
}
else{
p->down=hl[p->j]->down; hl[p->j]->down=p;
}
hl[p->j]=p;
pb=pb->right;
}
else
if((NULL!=pa)&&pa->j<pb->j){ // 如果此时的pb元素因该放在pa后面,则取以后的pa再来比较
pre=pa; pa=pa->right;
}
else
if(pa->j==pb->j){ // 如果pa,pb位于同一个位置上,则将值相加
pa->e = pb->e;
if(!pa->e){ // 如果相加后的和为0,则删除此节点,同时改变此元素坐在行,列的前驱元素的相应值
if(NULL==pre) // 修改行前驱元素值
Mrhead[pa->i]=pa->right;
else
pre->right=pa->right;
p=pa; pa=pa->right;
if(Mchead[p->j]==p) Mchead[p->j]=hl[p->j]=p->down; // 修改列前驱元素值
else
hl[p->j]->down=p->down;
free(p); pb=pb->right;
}
else{
pa=pa->right; pb=pb->right;
}
}
}
}
shuchu(M);
}
void jianfa() //矩阵的减法
{
CrossList M,N; // 创建两个十字链表对象,并初始化
CreateSMatrix_OL(M);
CreateSMatrix_OL(N);
cout<<"输入的两稀疏矩阵的差矩阵为:"<<endl;
OLink pa,pb,pre ,hl[MAXROW+1]; //定义辅助指针,pa,pb分别为M,N当前比较的元素,pre为pa的前驱元素
for(int x=1;x<=Mb;x++) hl[x]=Mchead[x];
for(int k=1;k<=Ma;k++){ // 对M的每一行进行 *** 作
pa=Mrhead[k]; pb=Nrhead[k]; pre=NULL;
while(pb){ // 把N中此行的每个元素取出,
OLink p;
if(!(p=(OLink)malloc(sizeof(OLNode)))) exit(0); // 开辟新节点,存储N中取出的元素
p->e=pb->e; p->i=pb->i; p->j=pb->j;
if(NULL==pa||pa->j>pb->j){ // 当M此行已经检查完或者pb因该放在pa前面
if(NULL==pre)
Mrhead[p->i]=p;
else
pre->right=p;
p->right=pa; pre=p;
if(NULL==Mchead[p->j]){ // 进行列插入
Mchead[p->j]=p; p->down=NULL;
}
else{
p->down=hl[p->j]->down; hl[p->j]->down=p;
}
hl[p->j]=p;
pb=pb->right;
}
else
if((NULL!=pa)&&pa->j<pb->j){ // 如果此时的pb元素因该放在pa后面,则取以后的pa再来比较
pre=pa; pa=pa->right;
}
else
if(pa->j==pb->j){ // 如果pa,pb位于同一个位置上,则将值相加
pa->e -= pb->e;
if(!pa->e){ // 如果相加后的和为0,则删除此节点,同时改变此元素坐在行,列的前驱元素的相应值
if(NULL==pre) // 修改行前驱元素值
Mrhead[pa->i]=pa->right;
else
pre->right=pa->right;
p=pa; pa=pa->right;
if(Mchead[p->j]==p) Mchead[p->j]=hl[p->j]=p->down; // 修改列前驱元素值
else
hl[p->j]->down=p->down;
free(p); pb=pb->right;
}
else{
pa=pa->right; pb=pb->right;
}
}
}
}
shuchu(M);
} void add() //矩阵的加法
{
CrossList M,N; // 创建两个十字链表对象,并初始化
CreateSMatrix_OL(M);
CreateSMatrix_OL(N);
cout<<"输入的两稀疏矩阵的和矩阵为:"<<endl;
OLink pa,pb,pre ,hl[MAXROW+1]; //定义辅助指针,pa,pb分别为M,N当前比较的元素,pre为pa的前驱元素
for(int x=1;x<=Mb;x++) hl[x]=Mchead[x];
for(int k=1;k<=Ma;k++){ // 对M的每一行进行 *** 作
pa=Mrhead[k]; pb=Nrhead[k]; pre=NULL;
while(pb){ // 把N中此行的每个元素取出,
OLink p;
if(!(p=(OLink)malloc(sizeof(OLNode)))) exit(0); // 开辟新节点,存储N中取出的元素
p->e=pb->e; p->i=pb->i; p->j=pb->j;
if(NULL==pa||pa->j>pb->j){ // 当M此行已经检查完或者pb因该放在pa前面
if(NULL==pre)
Mrhead[p->i]=p;
else
pre->right=p;
p->right=pa; pre=p;
if(NULL==Mchead[p->j]){ // 进行列插入
Mchead[p->j]=p; p->down=NULL;
}
else{
p->down=hl[p->j]->down; hl[p->j]->down=p;
}
hl[p->j]=p;
pb=pb->right;
}
else
if((NULL!=pa)&&pa->j<pb->j){ // 如果此时的pb元素因该放在pa后面,则取以后的pa再来比较
pre=pa; pa=pa->right;
}
else
if(pa->j==pb->j){ // 如果pa,pb位于同一个位置上,则将值相加
pa->e += pb->e;
if(!pa->e){ // 如果相加后的和为0,则删除此节点,同时改变此元素坐在行,列的前驱元素的相应值
if(NULL==pre) // 修改行前驱元素值
Mrhead[pa->i]=pa->right;
else
pre->right=pa->right;
p=pa; pa=pa->right;
if(Mchead[p->j]==p) Mchead[p->j]=hl[p->j]=p->down; // 修改列前驱元素值
else
hl[p->j]->down=p->down;
free(p); pb=pb->right;
}
else{
pa=pa->right; pb=pb->right;
}
}
}
}
shuchu(M);
} int main() //主函数
{
cout<<"1:稀疏矩阵的加法。"<<endl;
cout<<"2:稀疏矩阵的乘法。"<<endl;
cout<<"3:稀疏矩阵的减法。"<<endl;
cout<<"4:稀疏矩阵的转置"<<endl;
cout<<"0:退出程序。"<<endl;
char c=getchar();
if(c=='1')
add(); //调用矩阵相加函数
else
if(c=='2')
chengfa(); //调用矩阵相乘函数
else
if(c=='3')
jianfa(); //调用矩阵相减函数
else
if(c=='4')
zhuanzhi( ); //调用矩阵转置函数
else
exit(0); //退出
return 0;
}
#include <iostream>
#include <string>
using namespace std;
void main()
{
int student_age[3][2] = {19 ,20 ,19 ,21 ,22 ,20};//2维数组就相当于一个简单的矩阵 ,用此矩阵来存储 学生的年龄 int length_col = sizeof(student_age[0])/4;//每一列的个数
int length_row = sizeof(student_age)/sizeof(student_age[0]);////每一行的个数
for(int i = 0;i <length_row ; i++)
{
cout << "数组中第" << i<< "行" << "学生的年龄为:" << endl;
for(int j = 0 ; j <length_col ; j++)
{
cout << student_age[i][j] << endl;
}
}}
以上就是关于求数据结构课程设计——稀疏矩阵运算器源代码全部的内容,包括:求数据结构课程设计——稀疏矩阵运算器源代码、两个同阶稀疏矩阵A和B分别都采用三元组表示,编写程序求C=A B,要求C也采用三元组表示。、c++ 十字链表实现稀疏矩阵的转置等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)