版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、#include<stdio.h>#include<stdlib.h>#define MAXSIZE 12500/三元组结构typedef struct int i,j; /矩阵行下标和列下标 int e; /值Triple;/矩阵结构typedef struct Triple dataMAXSIZE+1; int rposMAXSIZE+1; /这是存放各行第一非零元在矩阵中的位置 int mu,nu,tu; /矩阵的行数、列数、非零元个数Matrix;void Init(Matrix* M);void Add(Matrix* M,Matrix* T,Matrix*
2、G);void Jian(Matrix* M,Matrix* T,Matrix* G);void Cheng(Matrix* M,Matrix* T,Matrix* G);void Cheng(Matrix* M,Matrix* T,Matrix* G);void PrintMatrix(Matrix* M);/2、初始化矩阵void Init(Matrix* M) int i; if(M->mu < 1 | M->nu < 1 | M->tu > M->mu*M->nu) 1 / 17 printf("出错!n"); /如果
3、矩阵的行数、列数不符合要求,打印出错 for(i=1;i<=M->tu;i+) /data0不用 printf("第%d个非零元的行号:",i); /以下为数据初始化 scanf("%d",&M->datai.i); printf("第%d个非零元的列号:",i); scanf("%d",&M->datai.j); printf("第%d个非零元的元素值:",i); scanf("%d",&M->datai.e); pri
4、ntf("n"); printf("您创建的矩阵如下:n"); PrintMatrix(M);/3、矩阵相加void Add(Matrix* M,Matrix* T,Matrix* G) G->mu = M->mu; /因为加减运算必须维数相等,所以M、T行、列数相等,初始化第三方矩阵的行、列数。 G->nu = M->nu; G->tu = 0; int g,m,t; /g、m、t分别记录三个矩阵的元素的存储位置 g = m = t = 1; /从data1开始 int k; int sum; /和 if(M->mu
5、 != T->mu | M->nu != T->nu) printf("维数不等!n"); for(k = 1;k <= M->mu;k+) /行下标和下标相等的对应元素相加 /*开始*/ if(M->datam.i = k && T->datat.i = k) /行下标相等时 if(M->datam.j = T->datat.j ) /列下标相等时 sum=M->datam.e+T->datat.e; /矩阵向加 if(sum != 0) /相加不为零时 G->datag.i=k; G
6、->datag.j=M->datam.j; G->datag.e=sum; G->tu+; g+; m+; t+; else /矩阵相加为零时,不做存储操作 m+; t+; /*结束*/ /行下标和下标不等的元素直接插入到G的相应位置 /*开始*/ while(M->datam.i = k) /插入M剩余的元素 G->datag.i = k; G->datag.j = M->datam.j; G->datag.e = M->datam.e; G->tu+; m+; g+; while(T->datat.i = k) /插入
7、T剩余的元素 G->datag.i = k; G->datag.j = T->datat.j; G->datag.e = T->datat.e; G->tu+; t+; g+; /G->tu=g; /记录运算完成后,第三方矩阵非零元的个数 /*结束*/ printf("n"); printf("相加后的矩阵如下:n");PrintMatrix(G);/4、矩阵相减void Jian(Matrix* M,Matrix* T,Matrix* G) G->mu = M->mu; G->nu = M-&
8、gt;nu; G->tu = 0; int sum,k; int m,t,g; m = t = g = 1; if(M->mu != T->mu | M->nu != T->nu) printf("维数不等!n"); for(k = 1;k <= M->mu;k+) /行下标和下标相等的对应元素相减 /*开始*/ if(M->datam.i = k && T->datat.i = k) /行下标相等时 if(M->datam.j = T->datat.j ) /列下标相等时 sum=M->
9、;datam.e-T->datat.e; /矩阵向减 if(sum != 0) /相加不为零时 G->datag.i=k; G->datag.j=M->datam.j; G->datag.e=sum; G->tu+; g+; m+; t+; else m+; t+; /*结束*/ /行下标和下标不等的元素直接插入到G的相应位置 /*开始*/ while(M->datam.i = k) /插入M剩余的元素 G->datag.i = k; G->datag.j = M->datam.j; G->datag.e = M->dat
10、am.e; G->tu+; m+; g+; while(T->datat.i = k) /插入T的元素 G->datag.i = k; G->datag.j = T->datat.j; G->datag.e = 0 - T->datat.e; G->tu+; t+; g+; /G->tu=g; /记录运算完成后,第三方矩阵非零元的个数 /*结束*/ printf("n"); printf("相减后的矩阵如下:n");PrintMatrix(G);/5、矩阵相乘void Cheng(Matrix* M,
11、Matrix* T,Matrix* G) int k,w,q,x,mrow,trow,gcol; int tmpMAXSIZE; /累加器 int numMAXSIZE; /记录矩阵的各行的第一个非零元的位置 int m,t,g; m = t = g = 1; w =1; if(M->nu != T->mu) /如果第一个矩阵的列数不等于第二个矩阵的行数 printf("这两个矩阵不能相乘!n"); /初始化 G->mu = M->mu; G->nu = T->nu; G->tu = 0; if(M->tu * T->t
12、u != 0) / /记录各个矩阵的各行的第一个非零元的位置 / /*开始*/ /记录矩阵M中各行非零元的个数 for(mrow = 1; mrow < M->mu; mrow+) /清零 nummrow = 0; for(w = 1;w <= M->tu;w+) k = M->dataw.i; numk+; M->rpos1 = 1; /第一行第一个非零元的位置在data的第一位 for(mrow = 2; mrow <= M->mu; mrow+) /第N行第一个非零元的位置 M->rposmrow = M->rposmrow-1
13、 + nummrow-1; printf("n"); printf("矩阵Mn"); for(mrow = 1;mrow <= M->mu; mrow+) printf("第%d行的第一个非零元在data中的序号是:(%d)",mrow,M->rposmrow); printf("n"); /记录矩阵T中各行非零元的个数 for(trow = 1; trow < T->mu; trow+) /清零 numtrow = 0; for(w = 1;w <= T->tu;w+)
14、k = T->dataw.i; numk+; T->rpos1 = 1; /第一行第一个非零元的位置在data的第一位 for(trow = 2; trow <= T->mu; trow+) /第N行第一个非零元的位置 T->rpostrow = T->rpostrow-1 + numtrow-1; printf("n"); printf("n"); printf("矩阵Tn"); for(trow = 1;trow <= T->mu; trow+) printf("第%d行的
15、第一个非零元在data中的序号是:(%d)",trow,T->rpostrow); printf("n"); /*结束*/ for(mrow = 1; mrow <= M->mu; mrow+) for(k = 1; k <= T->nu;k+) /当前行各元素累加器清零 tmpk = 0; G->rposmrow = G->tu + 1; /矩阵G的各行的第一个非零元在G->data中的位置 for(w = M->rposmrow;w < M->rposmrow+1;w+) trow = M-&g
16、t;dataw.j; /找到对应T的行号 if(trow < T->mu) x = T->rpostrow+1; else x = T->tu+1; for(q = T->rpostrow; q< x;q+) gcol = T->dataq.j; tmpgcol += M->dataw.e * T->dataq.e; /对应非零元累加 for(gcol = 1; gcol <= G->nu;gcol+) /压缩存储 if(tmpgcol) G->dataG->tu+1.i = mrow; G->dataG-&g
17、t;tu+1.j = gcol; G->dataG->tu+1.e = tmpgcol; G->tu+; printf("n"); printf("相乘后的矩阵如下:n"); PrintMatrix(G);/6、矩阵打印void PrintMatrix(Matrix* M) int k; printf("非零元素数%dn",M->tu); for(k = 1;k <= M->tu;k+) printf("(%d,%d,%d)n",M->datak.i,M->datak
18、.j,M->datak.e); /7、主函数int main(int argc, char* argv) Matrix* M =(Matrix*)malloc(sizeof(Matrix); Matrix* T =(Matrix*)malloc(sizeof(Matrix); Matrix* G =(Matrix*)malloc(sizeof(Matrix); int tag = 1; int n; printf("请输入第一个矩阵的行数和列数:"); scanf("%d %d",&(M->mu),&(M->nu); printf("非零元的个数:"); scanf("%d",&(M->tu); Init(M); printf("n"); printf("请输入第二个矩阵的行数和列数:"); scanf("%d %d",&(T->mu),&(T->nu); printf("
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 停车场设备施工合同
- 工程施工合同成本结转分录
- 《薄壁不锈钢管》课件
- 2025年鄂尔多斯货运从业资格证考试题
- 2025年邵阳货运从业资格证考试试题
- 2025年铜陵货运上岗证考试多少道题
- 2025年连云港道路运输从业资格证考试
- 《EYEQ项目说明完整》课件
- 第四单元 维护国家利益
- 建筑工程维修合同
- 全国各地光伏电站最佳安装倾角、峰值日照时数、首年发电量等速查表
- 高毒力肺炎克雷伯菌感染
- 《条形统计图(以一当一)》教学建议
- 实验室安全检查记录表(实验场所)
- 国开作业《公共关系学》实训项目3:社区关系建设(六选一)-实训项目二社区关系建设方案-参考(含答案)98
- 1.焊工资格备案表
- 招聘求职简历制作表格模板可编辑下载 精品简历模板 简历封面 17
- 人教统编版高中语文必修下册第六单元(单元总结)
- DB13∕T 5542-2022 水利水电工程施工组织设计编制指南
- 【股票指标公式下载】-【通达信】六脉神剑(底部来临止跌牛势股票)
- 拔牙-ppt课件
评论
0/150
提交评论