ImageVerifierCode 换一换
格式:DOCX , 页数:12 ,大小:111.13KB ,
资源ID:5913720      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/5913720.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(实验5数组.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

实验5数组.docx

1、实验5数组实验5:数组一、实验目的深入研究数组的存储表示和实现技术,着重掌握对稀疏矩阵的表示方法及其运算的实现。二、问题描述稀疏矩阵是指那些多数元素为零的矩阵。利用稀疏特点进行存储和计算可以大大节省存储空间,提高效率。通过对稀疏矩阵的存储表示,实现矩阵的基本操作。三、实验要求1、要求矩阵的输入形式采用三元组表示,以“带行逻辑链接信息”的三元组顺序表表示稀疏矩阵。2、设计矩阵的逆置算法,实现矩阵的逆置。3、实现两个稀疏矩阵的相加、相减等运算。4、要求运算结果的矩阵则以通常的阵列形式出现。四、数据结构#define MAXSIZE 100 /假设该非零元个数的最大值为100 typedef str

2、uct int i,j; /该非零元的行下标和列下标 int e; /该非零元的值Triple; typedef struct Triple dataMAXSIZE+1; /非零元三元组表,data0未用 int mu,nu,tu; /矩阵的行数、列数和非零元的个数 TSMatrix;五、实验环境PC微机DOS操作系统或 Windows 操作系统Turbo C 程序集成环境或 Visual C+ 程序集成环境六、实验代码#include using namespace std; #include#define ERROR -1#define OK 1#define MAXSIZE 100 /假

3、设该非零元个数的最大值为100 typedef struct int i,j; /该非零元的行下标和列下标 int e; Triple;typedef struct Triple dataMAXSIZE+1; /非零元三元组表,data0未用 int mu,nu,tu; /矩阵的行数、列数和非零元的个数 TSMatrix; typedef int Status;int CreatSMatrix(TSMatrix &M) /创建稀疏矩阵 int i; coutM.muM.nuM.tu; while(M.tuM.mu*M.nu|M.mu1|M.nu1|M.tu1) cout非法输入!n; cout

4、M.muM.nuM.tu; if(M.tuMAXSIZE) return ERROR; for(i=1;i=M.tu;i+) cout请依次输入第iM.datai.iM.datai.jM.datai.e; while(M.datai.iM.mu|M.datai.iM.nu|M.datai.j1|M.datai.e=0) cout输入不合法,请重新输入!n; cout请依次输入第iM.datai.iM.datai.jM.datai.e; return 0; int FastTransposeSMatrix(TSMatrix M,TSMatrix &T) /采用三元组顺序表存储结构表示,求稀疏矩阵

5、M的转置矩阵T。 T.mu=M.nu; T.nu=M.mu; T.tu=M.tu; int col,t,p,q; int *num=(int *)malloc(M.nu*sizeof(int); int *cpot=(int *)malloc(M.nu*sizeof(int); if(T.tu) for(col=1;col=M.nu;+col) numcol=0; for(t=1;t=M.tu;+t)+numM.datat.j;/求M中每一列含非零元个数 cpot1=1; /求第col列中第一个非零元在b.data中的序号 for(col=2;col=M.nu;+col) cpotcol=cp

6、otcol-1+numcol-1; for(p=1;p=M.tu;+p) col=M.datap.j; q=cpotcol; T.dataq.i=M.datap.j; T.dataq.j=M.datap.i; T.dataq.e=M.datap.e; +cpotcol; /for /if return OK; /FastTransposeSMatrix int AddMatrix(TSMatrix a,TSMatrix b,TSMatrix &c) /将矩阵a和矩阵b相加得到矩阵c int i=1,j=1,k=1; int v; if(a.mu!=b.mu|a.nu!=b.nu)/如果行列不相

7、等 return 0; if(a.tu=0&b.tu=0)return 0; c.mu=a.mu; c.nu=a.nu; /c的行列数与a的相同 while (i=a.tu & j=b.tu) /处理a和b中的每个元素 if (a.datai.i=b.dataj.i) /行号相等时 if(a.datai.jb.dataj.j) /a元素的列号大于b元素的列号 c.datak.i=b.datai.i;/将a元素添加到c中 c.datak.j=b.datai.j; c.datak.e=b.datai.e; k+; j+; else /a元素的列号等于b元素的列号 v=a.datai.e+b.dat

8、aj.e; if (v!=0) /只将不为0的结果添加到c中 c.datak.i=a.datai.i; c.datak.j=a.datai.j; c.datak.e=v; k+; i+; j+; else if (a.datai.ib.dataj.i) /a元素的行号小于b元素的行号 c.datak.i=a.datai.i; /将a元素添加到c中 c.datak.j=a.datai.j; c.datak.e=a.datai.e; k+; i+; else /a元素的行号大于b元素的行号 c.datak.i=b.dataj.i; /将b元素添加到c中 c.datak.j=b.dataj.j; c

9、.datak.e=b.dataj.e; k+; j+; while (i=a.tu) /若a中还有元素 /将剩下的元素添加到c中 c.datak.i=a.datai.i; c.datak.j=a.datai.j; c.datak.e=a.datai.e; k+; i+; while (j=b.tu) /若b中还有元素 /将剩下的元素添加到c中 c.datak.i=b.dataj.i; c.datak.j=b.dataj.j; c.datak.e=b.dataj.e; k+; j+; c.tu=k-1; /跳出循环时k多加了一次 cout两稀疏矩阵相加成功!n; return 0;void Sh

10、owSMatrix(TSMatrix M) /输出矩阵M,只输出含非零元的行、列以及元素值 cout遍历结果为:n; cout*n; for(int ii=1;ii=M.mu;ii+) for(int jj=1;jj=M.nu;jj+) int cnt=1; int flag=0; while(cnt=M.tu) if(M.datacnt.i=ii&M.datacnt.j=jj) flag=1; coutM.datacnt.e ; cnt+; if(flag=0) cout0 ; coutendl; cout*n; void menu() cout*n; cout* 稀疏矩阵基本操作 *n;

11、cout*n; cout* 1.转置 *n; cout* 2.相加 *n; cout* 3.遍历 *n; cout* 0.退出 *n; cout*n;cout请输入要选择的选项(0-3):n; int main() TSMatrix A,B,C,D,Q; cout创建A矩阵n; CreatSMatrix(A); couti; while(i) switch(i) case 1: char m1; coutm1; if(m1=A) D=A; else if(m1=B) D=B; else coutERROR!n; return 0; FastTransposeSMatrix(D,C); Show

12、SMatrix(C); break; case 2: AddMatrix(A,B,C); ShowSMatrix(C); break; case 3: char m1; coutm1; if(m1=A) D=A; else if(m1=B) D=B; else coutERROR!n; return 0; ShowSMatrix(D); break; default :couterrorn;break; /输入i值不合法时退出操作并报错 couti; return 0; 七、测试数据及结果整体操作过程:八、思考题1、如何提高矩阵转置算法效率?在上面的代码中我使用的是简单的矩阵转置算法,实际上书

13、上也将了矩阵的快速转置算法。快速转置算法通过添加辅助向量num和cpot,对于稀疏矩阵而言将时间复杂度从O(mu*nu)减为O(nu+tu)。2、如果用十字链表方式表示稀疏矩阵的话,如何来实现矩阵的相加操作呢?书上讲了十字链表的相加操作。主要是花费功夫在链表链接域的指向上。八、心得体会稀疏矩阵的相加算法参考了书上的两线性表的合并算法2.2的思路,即用while循环对每一个非零元进行操作,判断两个非零元的行数、列数相等时进行加和,不同的话根据行、列的大小比较分别加到新的稀疏矩阵中,最后将剩下的非零元加入到新的稀疏矩阵的后面。不过这个算法要求两个稀疏矩阵的datai里的行、列要按非递减排列,因此初始化时要按非递减的输入,有一定的局限性。通过这次实验对稀疏矩阵的存储结构以及转置、相加操作有了一定的了解,加深了对稀疏矩阵操作的理解。

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1