求数据结构课程设计——稀疏矩阵运算器源代码

求数据结构课程设计——稀疏矩阵运算器源代码,第1张

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++ 十字链表实现稀疏矩阵的转置等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/10163890.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存