当前位置:首页 » 编程语言 » c语言稀疏矩阵加法
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

c语言稀疏矩阵加法

发布时间: 2022-05-21 21:19:44

c语言课程设计:稀疏矩阵应用 要求:实现三元组,十字链表下的稀疏矩阵的加、转、乘的实现。

我刚写了一个稀疏矩阵的代码,如下
#include <iostream>
#include <iomanip>
using namespace std;

template<class T>
//三元组
struct Trituple
{
int row;
int col;
T val;
};
//稀疏矩阵声明
template<class T>
class SparseMatrix
{
public:
SparseMatrix(int maxt=100);
~SparseMatrix();
bool TransposeTo(SparseMatrix &);
bool AddTo(const SparseMatrix&);
bool TransposeTo_Faster(SparseMatrix&);
void Input();
void Output();
private:
Trituple<T>* data;
int rows,cols,terms;
int maxterms;
};
template<class T>
SparseMatrix<T>::SparseMatrix(int maxt)
{
maxterms=maxt;
data=new Trituple<T>[maxterms];
terms=rows=cols=0;
}
template<class T>
SparseMatrix<T>::~SparseMatrix()
{
if (data!=NULL)
{
delete[] data;
}
}
//普通转置
template<class T>
bool SparseMatrix<T>::TransposeTo(SparseMatrix &B)
{
if (terms>B.maxterms)
{
return false;
}
B.rows=cols;
B.cols=rows;
B.terms=terms;
if (terms>0)
{
int p=0;
for (int j=1;j<=cols;j++)
{
for (int k=0;k<terms;k++)
{
if (data[k].col==j)
{
B.data[p].row=j;
B.data[p].col=data[k].row;
B.data[p].val=data[k].val;
p++;
}
}
}
}
return true;
}
//快速转置
template<class T>
bool SparseMatrix<T>::TransposeTo_Faster(SparseMatrix& B)
{
if (terms>B.maxterms)
{
return false;
}
B.rows=cols;
B.cols=rows;
B.terms=terms;
if (terms>0)
{
int *num,*cpot;
num=new int[cols];
cpot=new int[cols];
for (int j=0;j<cols;j++)
{
num[j]=0;
}
for (int k=0;k<terms;k++)
{
num[data[k].col-1]++;
}
//求出B中每一行的起始下标cpot[]
cpot[0]=0;
for (int j=1;j<cols;j++)
{
cpot[j]=cpot[j-1]+num[j-1];
}
//执行转置操作
for (int p,k=0;k<terms;k++)
{
p=cpot[data[k].col-1]++;
B.data[p].row=data[k].col;
B.data[p].col=data[k].row;
B.data[p].val=data[k].val;
}
delete[] num;
delete[] cpot;
}
return true;
}
template<class T>
void SparseMatrix<T>::Input()
{
cout<<"intput the matrix' row:";
int row1;
cin>>row1;
cout<<"intput the matrix' col:";
int col1;
cin>>col1;
cout<<"input "<<row1<<"*"<<col1<<" matrix"<<endl;
int number;
rows=row1;
cols=col1;
for (int i=0;i<rows;i++)
{
for (int j=0;j<cols;j++)
{
cin>>number;
if (number!=0)
{
data[terms].row=i+1;
data[terms].col=j+1;
data[terms].val=number;
terms++;
}
}
}
}
template<class T> //输出好看,但是违背了最初的原则
void SparseMatrix<T>::Output()
{
T **tempArray=new T*[rows];
for (int i1=0;i1<rows;i1++)
{
tempArray[i1]=new int[cols];
}
for (int j=0;j<rows;j++)
{
for (int k=0;k<cols;k++)
{
tempArray[j][k]=0;
}
}
for (int i=0;i<terms;i++)
{
tempArray[data[i].row-1][data[i].col-1]=data[i].val;
}
for (int j=0;j<rows;j++)
{
for (int k=0;k<cols;k++)
{
cout<<setw(4)<<tempArray[j][k];
}
cout<<endl;
}
for (int l=0;l<rows;l++)
{
delete[] tempArray[l];
}
delete tempArray;
cout<<endl;
}
template<class T>
bool SparseMatrix<T>::AddTo(const SparseMatrix& B)
{
if (rows!=B.rows||cols!=B.cols)
{
return false;
}
bool flag=false;
int tempTerms=terms;
for (int i=0;i<B.terms;i++)
{
flag=false;
for (int j=0;j<tempTerms;j++)
{
if (data[j].col==B.data[i].col&&data[j].row==B.data[i].row)
{
data[j].val+=B.data[i].val;
flag=true;
}
}
if (flag==false)
{
data[++terms-1].col=B.data[i].col; //数组下标操作注意事项
data[terms-1].row=B.data[i].row;
data[terms-1].val=B.data[i].val;
}
}
return true;
}
int main()
{
cout<<"此程序演示稀疏矩阵的普通转置和快速转置操作"<<endl;
SparseMatrix<int> sm(50);
SparseMatrix<int> sm1(50);
SparseMatrix<int> sm2(50);
sm.Input();
cout<<"sm is"<<endl;
sm.Output();
sm.TransposeTo(sm1);
cout<<"Transposition of sm is "<<endl;
sm1.Output();
sm.TransposeTo_Faster(sm2);
cout<<"Transposition of sm is "<<endl;
sm2.Output();
SparseMatrix<int> sm3;
cout<<"input a new matrix"<<endl;
sm3.Input();
cout<<"sm3 is"<<endl;
sm3.Output();
if(sm.AddTo(sm3))
{
cout<<"after adding sm3 ,sm is"<<endl;
sm.Output();
}
else
cout<<"the two matrix can't add"<<endl;
cout<<"Good job!"<<endl;
system("pause");
return 0;
}

Ⅱ 用邻接表表示稀疏矩阵并实现矩阵的加法减法乘法运算!求C语言代码啊!

# include <stdio.h>
typedef struct a
{
int **arc;
int vexnum;
}table;
void createbiao(table *a)//建立邻接表
void tableplus(table *a,table *b)
{
int i,j
if(a->vexnum!=b->vexnum)
{printf("不能做加法!\n");exit(0);}
for(i=0;i<a->vexnum;i++)
for(j=0;j<a->vexnum;j++)
a->arc[i][j]+=b->arc[i][j];
}
void tablejian(table *a,table *b)
{
int i,j
if(a->vexnum!=b->vexnum)
{printf("不能做减法!\n");exit(0);}
for(i=0;i<a->vexnum;i++)
for(j=0;j<a->vexnum;j++)
a->arc[i][j]-=b->arc[i][j];
}
void tableplus(table *a,table *b)
{
int i,j,k,usum=0;
if(a->vexnum!=b->vexnum)
{printf("不能做乘法!\n");exit(0);}
for(i=0;i<a->vexnum;i++)
{
for(k=0;k<a->vexnum;k++)
{
sum=0
for(j=0;j<a->vexnum;j++)
sum=arc->arc[i][j]*b->arc[j][k];
a->arc[i][k]=sum;
}
}
}

有问题追问,写写不容易

Ⅲ c语言稀疏矩阵的加法问题

#include <stdio.h>
#include <malloc.h>

#define MAX 100

struct matnode //十字链表结点的定义
{
int row,col;
struct matnode *right,*down;
union {
int val;//表结点使用V域
struct matnode *next;//表头结点使用next域
}tag;
};
struct matnode *createmat(struct matnode *hmone[MAX])
{
int m,n,t,s,i,r,c,v;
// struct matnode *l,*p,*q;
struct matnode *h[100],*l,*p,*q; //h[]是十字链表每行的表头指针数组
printf("行数m,列数n,非零元素个数t:");
//scanf("%d,%d,%d",&m,&n,&t); //输入行、列数,非零元素个数
scanf("%d,%d,%d",&m,&n,&t);//输入行、列数,非零元素个数
l=(struct matnode *)malloc(sizeof(struct matnode));
h[0]=l;//h[]是指针数组,分别指向头节点和行、列表头结点
l->row=m; //建立十字链表头结点*l

Ⅳ 稀疏矩阵的加法和乘法c语言(十字链算法)

你没有写具体要求,是用采用三元组作存储结构还是数组,下面是我们以前做过的数据结构习题你参考一下:
能区分加法、减法、乘法和转置;能处理任意输入的典型数据和进行出错数据处理(例如乘法,当第一个矩阵的列数不等于第二个矩阵的行数时);必须采用三元组作存储结构,不能采用数组等形式;输出要求用矩阵的形式输出(即习题集136页的形式),当第一个矩阵的行数不等于第二个矩阵的行数时,注意如第三个乘法的形式输出

******************************************************************************************

#include<stdio.h>
#define maxsize 100
typedef struct
{
int i,j; //该非零元的行和列
int v; //该非零元的值
}triple;
typedef struct
{
triple data[maxsize]; //非零元三元组表,data[0]未用
int rpos[maxsize];
int m,n,t; //矩阵的行数,列数和非零元个数
}tripletable;

void convert() //矩阵的转置

{
int k;
tripletable A,B;
printf("输入稀疏矩阵A的行数,列数和非零元个数:");
scanf("%d %d %d",&A.m,&A.n,&A.t);
for(k=1;k<=A.t;k++)
{
printf("输入第%d个非0元素的行数,列数和值:",k);
scanf("%d %d %d",&A.data[k].i,&A.data[k].j,&A.data[k].v);
}
B.m=A.m;B.n=A.n;B.t=A.t;
if(B.t)
{
int q=1,col;
for(col=1;col<=A.n;++col)
for(int p=1;p<=A.t;++p)
if(A.data[p].j==col)
{
B.data[q].i=A.data[p].j;
B.data[q].j=A.data[p].i;
B.data[q].v=A.data[p].v;
++q;
}
}
int shuru[100][100]={0};
for(k=1;k<=B.t;k++)
{
shuru[B.data[k].j][B.data[k].i]=B.data[k].v;
}
printf("输入为:\n");
for(k=1;k<=B.m;k++)
{
for(int l=1;l<=B.n;l++)
printf("%d ",shuru[k][l]);
printf("\n");
}
int result[100][100]={0};

for(k=1;k<=B.t;k++)
{
result[B.data[k].i][B.data[k].j]=B.data[k].v;
}
printf("结果为:\n");
for(k=1;k<=B.n;k++)
{
for(int l=1;l<=B.m;l++)
printf("%d ",result[k][l]);
printf("\n");
}
}

void add() //矩阵的加法
{
int k;
tripletable A,B;
printf("输入稀疏矩阵A的行数,列数和非零元个数:");
scanf("%d %d %d",&A.m,&A.n,&A.t);
for(k=1;k<=A.t;k++)
{
printf("输入第%d个非0元素的行数,列数和值:",k);
scanf("%d %d %d",&A.data[k].i,&A.data[k].j,&A.data[k].v);
}
printf("输入稀疏矩阵B的行数,列数和非零元个数:");
scanf("%d %d %d",&B.m,&B.n,&B.t);
for(k=1;k<=B.t;k++)
{
printf("输入第%d个非0元素的行数,列数和值:",k);
scanf("%d %d %d",&B.data[k].i,&B.data[k].j,&B.data[k].v);
}
if(A.m!=B.m||A.n!=B.n)
{
printf("输入错误:A与B的行数或列数不相同,请重新输入\n");
return;
}
int a[100][100]={0};
for(k=1;k<=A.t;k++)
{
a[A.data[k].i][A.data[k].j]=A.data[k].v;
}
printf("A输入为:\n");
for(k=1;k<=A.m;k++)
{
for(int l=1;l<=A.n;l++)
printf("%d ",a[k][l]);
printf("\n");
}

int b[100][100]={0};
for(k=1;k<=B.t;k++)
{
b[B.data[k].i][B.data[k].j]=B.data[k].v;
}
printf("B输入为:\n");
for(k=1;k<=B.m;k++)
{
for(int l=1;l<=B.n;l++)
printf("%d ",b[k][l]);
printf("\n");
}
int c[100][100]={0};
for(k=1;k<=A.m;k++)
{
for(int l=1;l<=A.n;l++)
{
c[k][l]=a[k][l]+b[k][l];
}
}
printf("加法结果C为:\n");
for(k=1;k<=A.m;k++)
{
for(int l=1;l<=A.n;l++)
printf("%d ",c[k][l]);
printf("\n");
}
}

void jian() //矩阵的减法
{
int k;
tripletable A,B;
printf("输入稀疏矩阵A的行数,列数和非零元个数:");
scanf("%d %d %d",&A.m,&A.n,&A.t);
for(k=1;k<=A.t;k++)
{
printf("输入第%d个非0元素的行数,列数和值:",k);
scanf("%d %d %d",&A.data[k].i,&A.data[k].j,&A.data[k].v);
}
printf("输入稀疏矩阵B的行数,列数和非零元个数:");
scanf("%d %d %d",&B.m,&B.n,&B.t);
for(k=1;k<=B.t;k++)
{
printf("输入第%d个非0元素的行数,列数和值:",k);
scanf("%d %d %d",&B.data[k].i,&B.data[k].j,&B.data[k].v);
}
if(A.m!=B.m||A.n!=B.n)
{
printf("输入错误:A与B的行数或列数不相同,请重新输入\n");
return;
}
int a[100][100]={0};
for(k=1;k<=A.t;k++)
{
a[A.data[k].i][A.data[k].j]=A.data[k].v;
}
printf("A输入为:\n");
for(k=1;k<=B.m;k++)
{
for(int l=1;l<=A.n;l++)
printf("%d ",a[k][l]);
printf("\n");
}

int b[100][100]={0};
for(k=1;k<=B.t;k++)
{
b[B.data[k].i][B.data[k].j]=B.data[k].v;
}
printf("B输入为:\n");
for(k=1;k<=B.m;k++)
{
for(int l=1;l<=B.n;l++)
printf("%d ",b[k][l]);
printf("\n");
}
int c[100][100]={0};
for(k=1;k<=A.m;k++)
{
for(int l=1;l<=A.n;l++)
{
c[k][l]=a[k][l]-b[k][l];
}
}
printf("减法结果C为:\n");
for(k=1;k<=A.m;k++)
{
for(int l=1;l<=A.n;l++)
printf("%d ",c[k][l]);
printf("\n");
}
}

void multi() //矩阵的乘法
{
int k;
tripletable A,B,C;
printf("输入稀疏矩阵A的行数,列数和非零元个数:");
scanf("%d %d %d",&A.m,&A.n,&A.t);
for(k=1;k<=A.t;k++)
{
printf("输入第%d个非0元素的行数,列数和值:",k);
scanf("%d %d %d",&A.data[k].i,&A.data[k].j,&A.data[k].v);
}
int row=1;
for(k=1;k<=A.t;k++)
{
while(row<=A.data[k].i)
{
A.rpos[row++]=k;
}
}
while(row<=A.m)A.rpos[row++]=A.t+1;
printf("输入稀疏矩阵B的行数,列数和非零元个数:");
scanf("%d %d %d",&B.m,&B.n,&B.t);
for(k=1;k<=B.t;k++)
{

printf("输入第%d个非0元素的行数,列数和值:",k);
scanf("%d %d %d",&B.data[k].i,&B.data[k].j,&B.data[k].v);
}
row=1;
for(k=1;k<=B.t;k++)
{
while(row<=B.data[k].i)
{
B.rpos[row++]=k;
}
}
while(row<=B.m)B.rpos[row++]=B.t+1;
if(A.n!=B.m)
{
printf("输入错误:A的列数不等于B的行数,请重新输入\n");
return;
}

C.m=A.m;C.n=B.n;C.t=0;
int arow,p,q,ccol,t,tp;
if(A.t*B.t!=0)
{
for(arow=1;arow<=A.m;++arow)
{
int ctemp[maxsize]={0};
C.rpos[arow]=C.t+1;
if(arow<A.m){tp=A.rpos[arow+1];}
else{tp=A.t+1;}
for(p=A.rpos[arow];p<tp;++p)
{
int brow=A.data[p].j;
if(brow<B.m){t=B.rpos[brow+1];}
else{t=B.t+1;}
for(q=B.rpos[brow];q<t;++q)
{
ccol=B.data[q].j;
ctemp[ccol]+=A.data[p].v*B.data[q].v;

}

}
for(ccol=1;ccol<=C.n;++ccol)
{
if(ctemp[ccol])
{
if(++C.t>maxsize)return;
C.data[C.t].i=arow;
C.data[C.t].j=ccol;
C.data[C.t].v=ctemp[ccol];
}
}

}

}

int a[100][100]={0};
for(k=1;k<=A.t;k++)
{
a[A.data[k].i][A.data[k].j]=A.data[k].v;
}
printf("A输入为:\n");
for(k=1;k<=A.m;k++)
{
for(int l=1;l<=A.n;l++)
printf("%d ",a[k][l]);
printf("\n");
}

int b[100][100]={0};
for(k=1;k<=B.t;k++)
{
b[B.data[k].i][B.data[k].j]=B.data[k].v;
}
printf("B输入为:\n");
for(k=1;k<=B.m;k++)
{
for(int l=1;l<=B.n;l++)
printf("%d ",b[k][l]);
printf("\n");
}
int c[100][100]={0};
for(k=1;k<=C.t;k++)
{
c[C.data[k].i][C.data[k].j]=C.data[k].v;
}
printf("乘法结果C为:\n");
for(k=1;k<=C.m;k++)
{
for(int l=1;l<=C.n;l++)
printf("%d ",c[k][l]);
printf("\n");
}

}

void main()
{
printf("============= 菜 单 ==============\n");
printf(" 1 矩阵转置\n");
printf(" 2 矩阵加法\n");
printf(" 3 矩阵减法\n");
printf(" 4 矩阵乘法\n");
printf("======================================\n\n");
loop: printf("请选择相应操作的序号:");
int y;
scanf("%d",&y);
switch(y)
{
case 1: convert();
printf("\n");
goto loop;
case 2: add();
printf("\n");
goto loop;
case 3: jian();
printf("\n");
goto loop;
case 4: multi();
printf("\n");
goto loop;
}
}

Ⅳ C语言 数据结构 矩阵加法 的问题


#include <stdio.h>

main()

{

int a[3][3], b[3][3], c[3][3], i, j;

printf("please input matrix a: ");

for (i = 0; i <= 2; i++)

for (j = 0; j <= 2; j++)

scanf("%d", &a[i][j]); /*从键盘中输入3*3的矩阵存入数组a中*/

printf("please input matrix b: ");

for (i = 0; i <= 2; i++)

for (j = 0; j <= 2; j++)

scanf("%d", &b[i][j]); /*从键盘中输入3*3的矩阵存入数组b中*/

for (i = 0; i <= 2; i++)

for (j = 0; j <= 2; j++)

c[i][j] = a[i][j] + b[i][j]; /*矩阵a和矩阵b中对应元素进行相加,和放入c中*/

printf("the sum is: ");

for (i = 0; i <= 2; i++)

{

for (j = 0; j <= 2; j++)

printf("%3d", c[i][j]); /*输出矩阵c*/

printf(" "); /*每输出一行进行换行*/

}

}

Ⅵ 请C语言高手帮忙编写两个稀疏矩阵相加的程序,急!!!

这是c++版本的 如果用tc要去掉#include <malloc.h> 将中文提示换成英文的

#include <stdio.h>
#include <conio.h>
#include <malloc.h>
#include <math.h>
#define MAXSIZE 1000

typedef struct
{
int x,y;
int value;
}element;

typedef struct
{
element data[MAXSIZE+1];
int m,n,length;
}tip;

tip *a;
tip *b;
tip *jvzhenanswer;
int i,j,k,l,o,p,q;

void clear(int i,int j,int k)
{
if(i==0)
{
jvzhenanswer->data[k].x=b->data[j].x;
jvzhenanswer->data[k].y=b->data[j].y;
jvzhenanswer->data[k].value=b->data[j].value;
}
else
{
jvzhenanswer->data[k].x=a->data[i].x;
jvzhenanswer->data[k].y=a->data[i].y;
jvzhenanswer->data[k].value=a->data[i].value;
}
}
void add(void)
{
if (a->m!=b->m||a->n!=b->n)
{
printf("error");
return;
}
jvzhenanswer->m=a->m;
jvzhenanswer->n=a->n;
for(i=1,j=1,k=1;i<=a->length||j<=b->length;)
{
if(i>a->length)
{
like(0,j,k);
j++;k++;
continue;
}
if(j>b->length)
{
like(i,0,k);
i++;k++;
continue;
}
if(a->data[i].x<b->data[j].x)
{
like(i,0,k);
i++;k++;
continue;
}
if(a->data[i].x>b->data[j].x)
{
like(0,j,k);
j++;k++;
continue;
}
if(a->data[i].x==b->data[j].x)
{
if(a->data[i].y<b->data[j].y)
{

like(i,0,k);

i++;k++;

continue;
}
if(a->data[i].y>b->data[j].y)
{

like(0,j,k);

j++;k++;

continue;
}
if(a->data[i].y==b->data[j].y)
{

jvzhenanswer->data[k].value=a->data[i].value+b->data[j].value;

jvzhenanswer->data[k].x=a->data[i].x;

jvzhenanswer->data[k].y=a->data[i].y;

if(jvzhenanswer->data[k].value==0) {i++;j++;continue;}

i++;j++;k++;

continue;
}
}
}
jvzhenanswer->length=k-1;
}

void input(int z)
{
printf("请输入第%d个矩阵的行列数 以逗号隔开\
",z);
i=0;
a->data[0].x=1;
b->data[0].x=1;
if(z==1)
{

scanf("%d,%d",&a->m,&a->n);
printf("请输入矩阵元素,以 0,0,0 结束\
");
while(a->data[i].x!=0)
{
i++;
printf("请输入第%d个非零元素的坐标及值\\t",i);
scanf("%d,%d,%d",&a->data[i].x,&a->data[i].y,&a->data[i].value);

}
a->length=i-1;
return;
}
else
{
scanf("%d,%d",&b->m,&b->n);
printf("请输入矩阵元素,以 0,0,0 结束年\
");
while(b->data[i].x!=0)
{
i++;
printf("请输入第%d个非零元素的坐标及值\\t",i);
scanf("%d,%d,%d",&b->data[i].x,&b->data[i].y,&b->data[i].value);

}
b->length=i-1;
return;
}
}

void output()
{
k=1;
for(i=1;i<=jvzhenanswer->m;i++)
{
for(j=1;j<=jvzhenanswer->n;j++)
{
if(jvzhenanswer->data[k].x>i||(jvzhenanswer->data[k].x==i&&jvzhenanswer->data[k].y>j))
{

printf("0\\t");
}
else
{

printf("%d\\t",jvzhenanswer->data[k].value);

k++;
}
}
printf("\
");
}

}

void main()
{

char c;
long temp;
a=(tip *)malloc(sizeof(tip));
b=(tip *)malloc(sizeof(tip));
jvzhenanswer=(tip *)malloc(sizeof(tip));
for(i=1;i<=MAXSIZE+1;i++) jvzhenanswer->data[i].value=0;
input(1);
input(2);
add();
output();
printf("\
\
thank you!! \
\\tright 2006\
\\tclear\
");
getche();
}

Ⅶ C语言编写稀疏矩阵的加,减,乘和转置,要求用矩阵输出

#include <stdio.h>
#include <iostream>
#include <math.h>
#include <stdlib.h>
using namespace std;
#define Max 12500
#define Elemtype int
typedef struct {
int i ,j ;
Elemtype e;
}Triple;
typedef struct {
Triple data[Max+1];
int mu,nu,tu;
}Tsmatrix;
int Createsmatrix(Tsmatrix &M)
{ int n;
cout<<"请输入稀疏矩阵的元素个数n"<<endl;
cin>>n;
M.tu=n;
cout<<"请输入稀疏矩阵的行数,列数:"<<endl;
cin>>M.mu>>M.nu;
int i;
for(i=1;i<=n;i++){
cout<<"请输入稀疏矩阵的行下标和列下标,及数据;"<<endl;
cin>>M.data[i].i>>M.data[i].j>>M.data[i].e ;
}
return 1;
}
int Transpose(Tsmatrix M , Tsmatrix &T)
{
T.mu=M.nu; T.nu=M.mu ; T.tu=M.tu;
if(T.tu){
int col , p , q=1;
for(col=1; col<=M.nu;++col)
for(p=1;p<=M.tu;++p)
if (M.data[p].j==col){
T.data[q].i=M.data[p].j; T.data[q].j=M.data[p].i;
T.data[q].e=M.data[p].e ; ++q;}
}
return 1;
}
int Print(Tsmatrix M)
{

int i;int p=1;
{
for (i=1;i<=M.mu*M.nu;i++)
if(i==((M.data[p].i-1)*M.nu+M.data[p].j))
{
if(M.data[p].j==M.nu)
{ cout<<M.data[p].e<<endl; p++;}
else
{ cout<<M.data[p].e<<" "; p++;}
}
else if(i%M.nu==0) cout<<"0"<<endl;
else cout<<"0 ";
}
cout<<"\n"<<endl;
return 1;
}
int Addsmatrix(Tsmatrix a, Tsmatrix b, Tsmatrix &c)
{
int s=1,t=1,k=1; Elemtype temp;
if(a.mu!=b.mu||a.nu!=b.nu) return 0;
if(a.tu == 0) {c=b; return 1;}
if(b.tu==0) {c=a; return 1;}
if(a.tu==0 && b.tu==0) { c=a; return 1;}
while(!(s>a.tu && t>b.tu))
{
if(a.data[s].i>b.data[t].i)
{
c.data[k]=b.data[t];
k++ ;t++;
}
if(a.data[s].i<b.data[t].i)
{
c.data[k]=a.data[s];
k++ ;s++;
}
if(a.data[s].i==b.data[t].i)
{
if(a.data[s].j>b.data[t].j)
{
c.data[k]=b.data[t];
k++; t++;
}
if(a.data[s].j<b.data[t].j)
{
c.data[k]=a.data[s];
k++; s++;
}
if(a.data[s].j==b.data[t].j)
{
temp=a.data[s].e+b.data[t].e;
if(temp==0){s++;t++;}
else
{ c.data[k].e=temp;c.data[k].i=a.data[s].i;c.data[k].j=a.data[s].j;
s++;t++;k++;
}
}
}//if
if(s>a.tu&&t<=b.tu)
{
while(t<=b.tu)
{
c.data[k]=b.data[t];
k++; t++;
}
}
if(t>b.tu&&s<=a.tu)
{
while(s<=a.tu)
{
c.data[k]=a.data[s];
k++; s++;
}
}
}//while
c.tu=k-1; c.mu=a.mu; c.nu=a.nu;
}
return 1;int main()
{

Tsmatrix a,b,c;
Createsmatrix( a);
Createsmatrix( b);
Print(a);
Print(b);
Addsmatrix(a,b,c);
Print(c);
return 1;
}

Ⅷ 利用稀疏矩阵的顺序存储实现稀疏矩阵的加、减、乘、转置等简单运算。 这是课题要求,求大佬用c语言。

内容

假设两个稀疏矩阵A和B,他们均为m行n列,要求表写求矩阵的加法即:C=A+B的算法(C矩阵存储A与B相加的结果)

分析

利用一维数组来存储,一维数组顺序存放非零元素的行号、列号和数值,行号-1表示结束,然后进行矩阵加法运算时依次扫描矩阵A和B的行列值,并以行优先。当行列相同的时候,将第三个元素的值相加和以及行列号三个元素存入结果数组C中;不相同时,将A或B的三个元素直接存入结果数组中。

代码

// fanchen.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include<iostream> using namespace std; #define LINE 10 struct Node{ //行号 int row; //列号 int line; //数据 int data; }; //初始化数组 int init(Node array[]) { int row,line,data; int index = 0; while(cin>>row){ if(row == -1){ break; } cin>>line>>data; array[index].data=data; array[index].line = line; array[index].row = row; index++; } return index; } //打印数组 void printArray(Node array[],int len) { for(int i = 0;i < len;i++){ cout<<array[i].row<<" "<<array[i].line<<" "<<array[i].data<<endl; } } int calc(Node a