数组与广义表的算法的实验报告.pdf
《数组与广义表的算法的实验报告.pdf》由会员分享,可在线阅读,更多相关《数组与广义表的算法的实验报告.pdf(28页珍藏版)》请在咨信网上搜索。
1、数组与广义表的算法数组与广义表的算法实验工具:visual C+实验内容:1、三元组表示稀疏矩阵的转置算法(一般&快速)2、稀疏矩阵乘法、加法的算法(一般&十字链表)3、广义表的各种算法体验:通过利用 visual C+实验工具,实现数组与广义表各类算法的过程中,本人对数组与广义表的知识有了更深的了解,而且认识到数组与广义表各类操作可由形式多样的算法结构实现。算法并非统一标准的,同样的结果可有多种算法得出,算法的编写鼓励创造性思维。1、三元组表示稀疏矩阵的转置算法(一般三元组表示稀疏矩阵的转置算法(一般&快速)快速)代码:代码:#include#include#include#include#
2、define OK 1#define ERROR 0#define OVERFLOW 0#define MAXSIZE 100#define MAXRC 100typedef int ElemType;typedef structint i,j;ElemType e;Triple;typedef structTriple dataMAXSIZE+1;/非零元三元组int rposMAXRC+1;/各行第一个非零元的位置表int mu,nu,tu;/矩阵的行数、列数和非零元个数RLSMatrix;CreateSMatrix(RLSMatrix&M)/创建稀疏矩阵 Mint i,m,n;ElemT
3、ype e;int k,j;printf(输入矩阵的行数、列数、非零元的个数:);scanf(%d%d%d,&M.mu,&M.nu,&M.tu);M.data0.i=0;for(i=1;i3)/控制跳出死循环printf(本次输入失败!);return ERROR;printf(按行序输入第%d 个非零元素所在的行(1%d)列(1%d)值:,i,M.mu,M.nu);scanf(%d%d%d,&m,&n,&e);k=0;if(mM.mu|nM.nu)/行或列超出范围k=1;if(mM.datai-1.i|m=M.datai-1.i&nM.datai-1.j)k=1;while(k);M.dat
4、ai.i=m;M.datai.j=n;M.datai.e=e;/end forprintf(n);return(OK);void DestroySMatrix(RLSMatrix&M)/销毁稀疏矩阵 MM.mu=0;M.nu=0;M.tu=0;void PrinRLSMatrix(RLSMatrix M)/遍历稀疏矩阵 Mint i;printf(稀疏矩阵对应的三元组表为:nn);printf(行 列 元素值、nn);for(i=1;i=M.tu;i+)printf(%2d%4d%8dn,M.datai.i,M.datai.j,M.datai.e);printf(nn);void print(
5、RLSMatrix A)/打印矩阵函数,以通常形式输出矩阵 int k=1,a,b;printf(稀疏矩阵的通常形式为:n);int MMAXSIZEMAXSIZE;for(a=0;aA.mu;a+)/初始化矩阵 Mfor(b=0;bA.nu;b+)Mab=0;while(k=A.tu)MA.datak.i-1A.datak.j-1=A.datak.e;k+;for(a=0;aA.mu;a+)printf(|);for(b=0;bA.nu;b+)printf(%d,Mab);printf(|n);void showtip()/菜单printf(*请选择要执行的操作*nn);printf(&1
6、采用一般算法实现&n);printf(&2 采用快速转置的算法实现&n);printf(&3 同时采用两种算法,先显示一般算法,再显示快速算法&n);printf(*nn);/头文件结束TransposeSMatrix(RLSMatrix M,RLSMatrix&T)/求稀疏矩阵 M 的转置矩阵 T(一般算法)int p,q,col;T.mu=M.nu;T.nu=M.mu;T.tu=M.tu;if(T.tu)q=1;for(col=1;col=M.nu;+col)/按列序求转置for(p=1;p=M.tu;+p)if(M.datap.j=col)T.dataq.i=M.datap.j;T.da
7、taq.j=M.datap.i;T.dataq.e=M.datap.e;+q;return OK;FastTransposeSMatrix(RLSMatrix M,RLSMatrix&T)/快速转置算法int p,q,t,col,*num,*cpot;num=(int*)malloc(M.nu+1)*sizeof(int);cpot=(int*)malloc(M.nu+1)*sizeof(int);T.mu=M.nu;T.nu=M.mu;T.tu=M.tu;if(T.tu)for(col=1;col=M.nu;+col)numcol=0;for(t=1;t=M.tu;+t)+numM.data
8、t.j;cpot1=1;for(col=2;col=M.nu;+col)cpotcol=cpotcol-1+numcol-1;printf(n 辅助数组的值为:n);printf(列号:);for(t=1;t=M.nu;+t)printf(%4d,t);printf(n);printf(num);for(t=1;t=M.nu;+t)printf(%4d,numt);printf(n);printf(cpot);for(t=1;t=M.nu;+t)printf(%4d,cpott);printf(nn);for(p=1;p=M.tu;+p)col=M.datap.j;q=cpotcol;T.da
9、taq.i=M.datap.j;T.dataq.j=M.datap.i;T.dataq.e=M.datap.e;+cpotcol;free(num);free(cpot);return OK;void main()int result;int j;RLSMatrix A,B;/*COORD Co=0,0;DWORD Write;SetConsoleTitle(稀疏矩阵的转置n);HANDLE hOut=GetStdHandle(STD_OUTPUT_HANDLE);SetConsoleTextAttribute(hOut,FOREGROUND_RED|FOREGROUND_BLUE|FOREG
10、ROUND_INTENSITY);FillConsoleOutputAttribute(hOut,FOREGROUND_RED|FOREGROUND_BLUE|FOREGROUND_INTENSITY,100000000,Co,&Write);/windows 的 API 函数,用来设置控制台标题doshowtip();/调用菜单函数int i;scanf(%d,&i);switch(i)case 1:printf(创建矩阵 A:);if(result=CreateSMatrix(A)=0)exit(ERROR);PrinRLSMatrix(A);printf(求 A 的转置矩阵 B(一般算法
11、):n);TransposeSMatrix(A,B);PrinRLSMatrix(B);print(B);DestroySMatrix(B);printf(nn);break;case 2:printf(创建矩阵 A:);if(result=CreateSMatrix(A)=0)exit(ERROR);PrinRLSMatrix(A);printf(求 A 的转置矩阵 B(快速转置):n);FastTransposeSMatrix(A,B);PrinRLSMatrix(B);print(B);DestroySMatrix(A);DestroySMatrix(B);printf(nn);brea
12、k;case 3:printf(创建矩阵 A:);if(result=CreateSMatrix(A)=0)exit(ERROR);PrinRLSMatrix(A);printf(求 A 的转置矩阵 B-(一般算法):n);TransposeSMatrix(A,B);PrinRLSMatrix(B);print(B);DestroySMatrix(B);printf(nn);printf(求 A 的转置矩阵 B-(快速转置):n);FastTransposeSMatrix(A,B);PrinRLSMatrix(B);print(B);DestroySMatrix(A);DestroySMatr
13、ix(B);printf(nn);break;printf(*请选择是否继续输入其他稀疏矩阵?*n);printf(1 是,输入其他矩阵n);printf(0 否,不输入n);printf(*);fflush(stdin);/清除输入缓存区scanf(%d,&j);while(j=1);运行结果:运行结果:(1)创建矩阵(2)一般转置 (3)快速转置 2、稀疏矩阵乘法、加法的算法(一般稀疏矩阵乘法、加法的算法(一般&十字链表)十字链表)代码:代码:#include#include#define Size 2501#define Size1 51typedef structint i;int j
14、;int e;/非零元的值triple;/定义三元组typedef structtriple dataSize+1;/矩阵中的元素int ropsSize1+1;/ropsi为第 i 行元素中的首非零元在 data中的序号int mu;/行数int nu;/列数int tu;/非零元数 juzhen;/定义矩阵typedef struct node/定义十字链表元素int i,j,e;struct node*right,*down;/该非零元所在行表和列表的后继元素 node,*link;typedef struct/定义十字链表对象结构体 link*rhead,*chead;/行和列的头指针
15、int m,n,t;/系数矩阵的行数,列数,和非零元素个数 crosslist;void createcross(crosslist&M)/建立十字链表int i,j,e,k;node*p,*q;printf(输入行,列和非零元数,空格隔开:n);scanf(%d%d%d,&M.m,&M.n,&M.t);M.rhead=(link*)malloc(M.m+1)*sizeof(link);/给行和列的头指针分配内存 M.chead=(link*)malloc(M.n+1)*sizeof(link);for(k=1;k=M.m;k+)/初始化行,列的头指针M.rheadk=NULL;for(k=1
16、;k=M.n;k+)M.cheadk=NULL;printf(输入非零元的行,列和值,空格隔开:n);for(k=1;ki=i;p-j=j;p-e=e;if(M.rheadi=NULL|M.rheadi-jj)/插入元素所在行无非零元或首非零元的列标大于插入元素的列标p-right=M.rheadi;M.rheadi=p;else for(q=M.rheadi;(q-right)&q-right-jright);/空循环找到第一个列标大于或等于插入元素列标的元素p-right=q-right;q-right=p;if(M.cheadj=NULL|(M.cheadj-ii)/插入元素所在列无非零
17、元或首非零元的行标大于插入元素的行标p-down=M.cheadj;M.cheadj=p;elsefor(q=M.cheadj;(q-down)&q-down-idown);/空循环找到第一个行标大于或等于插入元素行标的元素p-down=q-down;q-down=p;void printcross(crosslist A)/输出十字链表if(A.m=0)printf(十字链表为空!n);elseprintf(十字链表为:n);int i,j;for(i=1;i=A.m;i+)link p=A.rheadi;for(j=1;jj)printf(%5d,p-e);p=p-right;elsepr
18、intf(%5d,0);printf(n);printf(n);crosslist addcross()printf(十字链表加法:n);crosslist a,b;/创建两个十字链表对象,并初始化createcross(a);createcross(b);node*pre,*h51,*pa,*pb,*q;/定义辅助指针,pa,pb 分别为 a,b 当前比较的元素,pre 为 pa 的前驱元素 int i,j,k=0,m,n;/hj指向 j 列的当前插入位置 if(a.m!=b.m|a.n!=b.n)printf(格式不对,不能相加!n);elsefor(i=1;i=a.m;i+)pa=a.r
19、headi;pb=b.rheadi;pre=NULL;for(j=1;ji=pb-i;p-j=pb-j;p-e=pb-e;if(pa=NULL|pa-jpb-j)/当 a 此行已经检查完或者 pb 因该放在 pa前面if(pre=NULL)a.rheadp-i=p;else pre-right=p;p-right=pa;pre=p;if(hp-j=NULL)/当前插入位置下面无非零元/因为是逐行处理,so,hp-j,依次下移/因此每次都是指向插入的位置 a.chead p-j=p;p-down=NULL;else p-down=hp-j-down;hp-j-down=p;hp-j=p;/*hp
20、-j下移指向下次插入的位置pb=pb-right;/pb 指向该行下个元素else if(pa&pa-jj)/只要移动 pa 的指针*先不加|(pb=NULL&pa)pre=pa;hpa-j=pa;/移动 h,使其指向下次插入的位置pa=pa-right;else if(pa-j=pb-j)pa-e+=pb-e;if(pa-e)/不为零pre=pa;hpa-j=pa;pb=pb-right;/加else/pa-e 为零,删除节点if(pre=NULL)a.rhead pa-i=pa-right;else pre-right=pa-right;p=pa;/p 指向 pa,用来在下面修改列指针pa
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数组 广义 算法 实验 报告
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【人****来】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【人****来】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。