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

作者&投稿:常泡 (若有异议请与网页底部的电邮联系)
两个矩阵相加减的程序怎么编写?请C语言高手帮忙~

矩阵的大小可以通过N,M来改变,数据自己也可以改为你想要的.

程序如下:

#define N 3
#define M 3
main()
{
int a[N][M]={1,2,3,4,5,6,7,8,9}, b[N][M]={9,8,7,6,5,4,3,2,1},c[N][M],d[N][M],i,j;

for(i=0;i<N;i++)
for(j=0;j<M;j++)
{
c[i][j]=a[i][j]+b[i][j]; /*相加A+B*/
d[i][j]=a[i][j]-b[i][j]; /*相减A-B*/
}
for(i=0;i<N;i++)
{
for(j=0;j<M;j++)
printf("%d ",c[i][j]);
printf("
");
}

pingtf("
");
for(i=0;i<N;i++)
{
for(j=0;j<M;j++)
printf("%d ",d[i][j]);
printf("
");
}

}

课本上不是有现成的么?

这个程序能实现矩阵的加减乘。
从中删除你不需要的部分你会吧。
#include<iostream.h>
#include<malloc.h>
#define TRUE 1
#define ERROR 0
#define OK 1
#define MAXISIZE 100
typedef int Elemtype ;
typedef int Status ;
struct Triple
{
int i,j; //行下标,列下标
Elemtype e; //非零元数的值
};
struct TSMatrix
{
Triple data[MAXISIZE+1];
int mu,nu,tu; //矩阵的行数,列数,非零元数
};
Status CreateSMatrix(TSMatrix &M)
{
int i,m,n;
Elemtype e;
Status k;
cout<<"输入矩阵的行数,列数,非零元数:\n";
cin>>M.mu>>M.nu>>M.tu;
M.data[0].i=0;
for(i=1;i<=M.tu;i++)
{
do
{
cout<<"输入第"<<i<<"个非零元素所在的行(1~"<<M.mu<<"),列(1~"<<M.nu<<"),元素值:\n";
cin>>m>>n>>e;
k=0;
if(m<1||m>M.mu||n<1||n>M.nu)
{ k=1;
cout<<"元素的行列数输入错误!\n";}
if(m<M.data[i-1].i||m==M.data[i-1].i&&n<=M.data[i-1].j)
k=1;
}while(k);
M.data[i].i=m;
M.data[i].j=n;
M.data[i].e=e;
}
return OK;
}
void DestroySMatrix(TSMatrix &M)
{
M.mu=0;
M.nu=0;
M.tu=0;
}

void PrintSMatrix(TSMatrix M)
{
int i;
cout<<M.mu<<"行"<<M.nu<<"列"<<M.tu<<"个非零元数\n";
cout<<"行 列 元素值\n";
for(i=1;i<=M.tu;i++)
cout<<M.data[i].i<<" "<<M.data[i].j<<" "<<M.data[i].e<<endl;
}
Status Cmp(int a,int b)
{ if(a<b) return 1;
else if(a==b) return 0;
else return -1;
}
Status AddSMatrix(TSMatrix M,TSMatrix N,TSMatrix &Q)
{
Triple *Mp,*Me,*Np,*Ne,*Qh,*Qe;
if(M.mu!=N.mu||M.nu!=N.nu)
return ERROR;
Q.mu=M.mu;
Q.nu=M.nu;
Mp=&M.data[1];
Np=&N.data[1];
Me=&M.data[M.tu];
Ne=&N.data[N.tu];
Qh=Qe=Q.data;
while(Mp<=Me&&Np<=Ne)
{ Qe++;
switch(Cmp(Mp->i,Np->i))
{
case 1: *Qe=*Mp;
Mp++;
break;
case 0: switch(Cmp(Mp->j,Np->j))
{
case 1: *Qe=*Mp;
Mp++;
break;
case 0: *Qe=*Mp;
Qe->e+=Np->e;
if(!Qe->e)
Qe--;
Mp++;
Np++;
break;
case -1: *Qe=*Np;
Np++;
}
break;
case -1: *Qe=*Np;
Np++;
}
}
if(Mp>Me)
while(Np<=Ne)
{
Qe++;
*Qe=*Np;
Np++;
}
if(Np>Ne)
while(Mp<=Me)
{
Qe++;
*Qe=*Mp;
Mp++;
}
Q.tu=Qe-Qh;
return OK;
}
Status SubSMatrix(TSMatrix M,TSMatrix N,TSMatrix &Q)
{
int i,l;
for(i=1;i<=N.tu;i++)
N.data[i].e*=-1;
l=AddSMatrix(M,N,Q);
return l;
}
Status MultSMatrix(TSMatrix M,TSMatrix N,TSMatrix &Q)
{
int i,j,h=M.mu,l=N.nu,Qn=0;
Elemtype *Qe;
if(M.nu!=N.mu)
return ERROR;
Q.mu=M.mu;
Q.nu=N.nu;
Qe=(Elemtype *)malloc(h*l*sizeof(Elemtype));
for(i=0;i<h*l;i++)
*(Qe+i)=0;
for(i=1;i<=M.tu;i++)
for(j=1;j<=N.tu;j++)
if(M.data[i].j==N.data[j].i)
*(Qe+(M.data[i].i-1)*l+N.data[j].j-1)+=M.data[i].e*N.data[j].e;
for(i=1;i<=M.mu;i++)
for(j=1;j<=N.nu;j++)
if(*(Qe+(i-1)*l+j-1)!=0)
{
Qn++;
Q.data[Qn].e=*(Qe+(i-1)*l+j-1);
Q.data[Qn].i=i;
Q.data[Qn].j=j;
}
free(Qe);
Q.tu=Qn;

return OK;
}
void main()
{char a;
int h;
TSMatrix A,B,C;
cout<<"创建矩阵A:\n";
CreateSMatrix(A);
PrintSMatrix(A);
cout<<"创建矩阵B:\n";
CreateSMatrix(B);
PrintSMatrix(B);
cout<<"选择操作:\n"<<"A.两稀疏矩阵的和\n"<<"B.两稀疏矩阵的差\n"<<"C.两稀疏矩阵的积\n"<<"Q.退出\n";
cin>>a;
while(a!='Q')
{
switch(a)
{
case 'A':
h=AddSMatrix(A,B,C);
if(h==1)
{cout<<"两稀疏矩阵的和为:\n";
PrintSMatrix(C);
}
else cout<<"该两稀疏矩阵不能求和!\n";
break;
case 'B':
h=SubSMatrix(A,B,C);
if(h==1)
{ cout<<"两稀疏矩阵的差为:\n";
PrintSMatrix(C);
}
else cout<<"该两稀疏矩阵不能求差!\n";
break;
case 'C':
h=MultSMatrix(A,B,C);
if(h==1)
{cout<<"两稀疏矩阵的积为:\n";
PrintSMatrix(C);
}
else cout<<"两稀疏矩阵不能求积!\n";
break;
default: cout<<"输入错误!请重新输入\n";
}cin>>a;
}DestroySMatrix(A);
DestroySMatrix(B);
DestroySMatrix(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个矩阵的行列数 以逗号隔开\n",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 结束\n");
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 结束年\n");
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("\n");
}

}

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("\n\nthank you!! \n\tcopyright 2006\n\tclear\n");
getche();
}

easy. 两个链表,各一个指针,先动第一个链表的指针,每动一下看第二个链表的指针指向的是不是矩阵中的对应元素,是则加上,直到它在矩阵中的位置超过第二个链表的指针。再动第二个链表的指针……

1. 以“带行逻辑链接信息”的三元组顺序表表示稀疏矩阵。
2. 分别输入矩阵的非零元素
3. 实现两个矩阵相加的运算
4. 还原成矩阵形式打印出计算结果.
注意:是"带行逻辑连接信息",如果是一般的三元组顺序表我会做,但他要求带行标识,即标识出每行第一个非0元的位置
在相加和输入的过程中,都得用到行标识才行.

满意答案的like其实是clear,还有在输入行列和值的时候要用逗号隔开,不然会出现死循环


C语言高手请帮忙!!!
ch>='A'&&ch<='Z'?printf("%c\\n",ch+32):(ch>='a'&&ch<='z'?printf("%c\\n",ch-32):printf("%c\\n",ch));getch();} ___回复3:输入一个正整数n (1<n≤10),再输入n个整数,要求 ⑴ 求这n个数的平均值和最大值。⑵ 按逆序输出这n个数。⑶ 将最小值与第一个数交...

C语言高手来帮忙吧!!编写函数,求一个整型数组的第一个偶数的下标和最后...
include<stdio.h>void xb(int arr[],int *p1,int *p2,int n){int i,no1,no2;for(i=0;i<n;i++,p1++)if(arr[i]%2==0){no1=i;break;}for(i=n-1;i>=0;i--,p2--)if(arr[i]%2==0){no2=i;break;}*p1=no1;*p2=no2;}main(){int n1,n2;int array[]={1,2,...

c语言高手请帮我下。一个小程序。
来了,给我分啊!!!include <stdio.h> include <string.h> include <stdlib.h> int main(){ char pw[50];char * syspw="abc";int i=0;printf("请输入密码:\\n");while(i<3){ scanf("%s",pw);if(strcmp(pw,syspw)!=0){ printf("密码错误,请重新输入!\\n");i++;} else ...

C语言高手帮忙编一个仓库物资管理系统
include <stdafx.h> include<stdio.h> include<string.h> define SIZE 2\/\/SIZE为仓库电器种类 struct goods { char name[10];char brand[10];char style[10];int num;float money;}stu[SIZE];\/\/库存结构 struct date { int year;int month;int day;};\/\/日期结构 struct entrance { char ...

电脑C语言编程,求高手帮忙
1.include<stdio.h> void main(){ int n[8],maxn=0,minn=0,detn;float score[8],max,min,aver=0.0,det,detm;printf("输入裁判号及分数:\\n");scanf("%d%f",&n[0],&score[0]);max=min=score[0];for(int i=1;i<8;i++){ scanf("%d%f",&n[i],&score[i]);if(max<...

c语言高手帮帮忙!
用数组就可以实现了。定义变量循环累加,打印结果。include <stdio.h>#define N 10int main(){ char names[4][3]={"张","王","李","赵"}; int i,t,n=N,cnt[4]={0},f=0,z=0,max=0; printf("当前共%d个投票人 ,请投张:1 王:2 李:3 赵:4 (输入-1结束投票)\\n...

用C语言写一段程序,高手快来哦!
include <stdio.h> define RANGE 15 int get_min_id(int * x, int range){ int i = 0, j = 0, m = 99999999L;for(i = 0; i < range; i++) { if (x[i] < m) { m = x[i];j = i;} } return j;} void sort(int x[RANGE]){ int i = 0, j = 0, r = 0...

求高手帮忙写个C语言代码!!超级紧急!!
int main(){float base=360000;int year=1;float get=50000;while(1){base=base+base*0.04;get=get+get*0.02;if(get>base){printf("\\n%第%d年拿走%.2f, 余额:%.2f 已超过余额!",year+1,get,base);break;}base-=get;printf("\\n%第%d年拿走%.2f, 余额:%.2f",year+1,get,...

c语言高手帮帮忙,谢谢!!! 编写程序,编写一个函数输出如下图形,
ls的兄弟,题目要求是用函数void draw(n, c)来实现功能的。。下面的程序在vc6.0中通过编译。include <stdio.h> void draw(int n,char c){ int i,j,k;for(i=1;i<=n;i++){ for(j=1;j<=n-i;j++)printf(" ");for(k=1;k<=2*(i-1)+1;k++)printf("%c",c);printf("...

高手帮忙做个C语言小程序
round score Total\\n");while(p!=0){ printf("%s %s %f %f %f\\n",p->id,p->name,p->first_round,p->second_round,p->total);p=p->next;} } int main(){ int c;do{ printf("1.Add 2.Search 3.Display 4.Quit\\n");...

彭州市13241733231: 请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 ...

彭州市13241733231: 如何用c语言编写一个“两模糊矩阵相乘”的运算? -
况燕长春: #define M 4 #include<stdio.h> float min(float x,float y) {return(x<y?x:y); } float max(float *m, int n) {float num = m[0];for (int i = 0 ;i < n - 1 ;i++){if (num <= m[i + 1]){num = m[i + 1];}} return num; } void main() {float a[M][M],b[M][M],c[M],d[M][M];...

彭州市13241733231: 两个矩阵相加减的程序怎么编写?请C语言高手帮忙 -
况燕长春: 矩阵的大小可以通过N,M来改变,数据自己也可以改为你想要的.程序如下:#define N 3 #define M 3 main() { int a[N][M]={1,2,3,4,5,6,7,8,9}, b[N][M]={9,8,7,6,5,4,3,2,1},c[N][M],d[N][M],i,j;for(i=0;i<N;i++)for(j=0;j<M;j++){c[i][j]=a[i][j]+b[i][j]; /*相加...

彭州市13241733231: 数据结构(C语言版)稀疏矩阵相乘程序 不能得出相乘的结果 拜托帮帮我!! -
况燕长春: 给你 另一个我自己写的 矩阵相乘的算法 你可以借鉴一下 用c语言的话 就要改一些细节地方 我是用 C++ void xiangcheng() { char ch; int m,n,m1,n1; float a[100][100],b[100][100],sum=0; int i=0,k,flag=1,t,p; system("cls"); printf("请输入第一个...

彭州市13241733231: 用C语言求两矩阵相乘最好能在我写的上面改 谢谢了 -
况燕长春: #include<stdio.h> int main() {int a[100][100],b[100][100],e[100][100],c,d,m,n,i,j,f; printf("输入第一个矩阵为多少行多少列"); scanf("%d,%d",&c,&d); printf("输入第二个矩阵为多少行多少列"); scanf("%d,%d",&m,&n); if(d!=m) printf(...

彭州市13241733231: 帮我写个程序 两个任意大小的矩阵相乘 -
况燕长春: 大兄弟有没有搞错 只有 a*b和b*c这种矩阵才可以相乘 for(i=0;i<a;i++) for(j=0;j<c;j++) { c[i][j]=0; for(k=0;k<b;k++)s[i][j]=s[i][j]+n[i][k]*m[k][j]; } n,m距阵分别为a*b和b*c距阵 s为相乘的结果

彭州市13241733231: C语言编写稀疏矩阵的加,减,乘和转置,要求用矩阵输出 -
况燕长春: #include 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< cin>>n; M.tu=n; cout< cin>>M....

彭州市13241733231: 用c语言程序求两个矩阵相乘 -
况燕长春: int Q[N][N]; void Mul(int P1[N][N],int P2[N][N]) { int i,j,k; int sum; for(i=1;i<=n;i++){ for(j=1;j<=n;j++) { sum=0; for(k=1;k<=n;k++) sum+=P1[i][k]*P2[k][j]; Q[i][j]=sum; } } }

彭州市13241733231: 大神帮写下这两个矩阵和的C语言?..谢谢... -
况燕长春: #include<cstdio> int a[3][3],b[3][3]; int main(){ int i,j; for(i=0;i<3;i++){ for(j=0;j<3;j++){ scanf("%d",&a[i][j]); } } for(i=0;i<3;i++){ for(j=0;j<3;j++){ scanf("%d",&b[i][j]); a[i][j]+=b[i][j]; } } for(i=0;i<3;i++){ for(j=0;j<3;j++){ printf("%d",a[i][j]); } printf("\n"); } return 0; } 任意两个33矩阵求和

彭州市13241733231: 编写用“三元组表”存储稀疏矩阵,进行矩阵处理的程序.实现(1)矩阵转置 (2)矩阵相加 -
况燕长春: 矩阵加减注意格式 #include <stdio.h> #define maxsize 20 typedef int data; typedef struct { int i,j; data v; }mat; typedef struct { int m,n,t; mat dtt[maxsize+1]; }matrix; matrix a,b,c; void transmat(matrix a,matrix *b) { int p,q,col; b->m=a.n; b->n=a.m; b->t=a....

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网