版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第 5 章数组和广义表第 5 章数组和广义表5.1 数组的定义5.1 数组定义ADT Array 数据对象:ji=0,.,bi-1,i=1,2,.,n, D=aj1j2.jn|n0, aj1j2.jnElemSet 数据关系: R=R1,R2,.,Rn Ri=| aj1. ji.jn, aj1.ji+1.jn D 基本操作: InitArray(&A,n,bound1,.boundn) DestroyArray(&A) Value(A,&e,index1,.indexn) Assign(&A,e,index1,.indexn)ADT Array数组定义ADT Array二维数组可以将二维数组看
2、成一个定长的线性表,它的每个数据元素也是一个定长线性表。A=(a0,a1,.,ap);ai=(a0j,a1j,.am-1j)typedef ElemType Array2mn;typedef ElemType Array1n;typedef Array1 Array2m;二维数组可以将二维数组看成一个定长的线性表,它的每个数据元素(0,0)(m-1,n-1)二维数组,m 行,n 列元素个数:m*n每个元素由行、列两个关系约束(0,0)(m-1,n-1)二维数组,m 行,n 列5.2 数组的顺序表示和实现5.2 数组的顺序存储结构以行为主序 例: A32 A00, A01, A10, A11,
3、A20, A21 LOCij=LOC00+(n*i+j)*L L为每个元素占用的空间单元数数组的顺序存储结构以行为主序数组的顺序存储结构以列为主序 例 A32 A00,A10,A20,A01,A11,A21 LOCij=LOC00+(m*j+i)*L L为每个元素占用的空间单元数数组的顺序存储结构以列为主序假设:b1,b2,b3,.bn为每一维的元素个数LOCj1,j2,.jn=LOC0,0,.,0 +(b2*b3.*bn*j1 + b3*.*bn*j2,+.+ bn*jn-1+jn)L=LOC0,0,.,0+( )L=LOC0,0,.,0+其中:cn=L,ci-1=bi*ci 1i=n假设:
4、b1,b2,b3,.bn为每一维的元素个数三维数组A684共6*8*4=192个元素假设:每个元素占据L=1个存储单元b1=6, b2=8, b3=4, L=1则:c3=L=1 c2=c3*b3=c3*4=1*4=4 c1=c2*b2=4*8=4*8=32A342=0+32*3+4*4+2 =114三维数组A684共6*8*4=192个元素#include /可变长参数#define MAX_ARRAY_DIM 8typedef struct ElemType *base; /数据元素基址 int dim; /数组维数 int *bounds; /每一维的元素个数 int *constants
5、; /映像函数常数#include /可变长参数Status InitArray(Array &A,int dim,.) if (dimMAX_ARRAY_DIM) return ERROR; A.dim=dim; A.bounds=new intdim; if (!A.bounds) exit(OVERFLOW); elemtotal=1; va_start(ap,dim); /初始化参数列表 for (i=0;idim;i+) A.boundsi=va_arg(ap,int); /读取参数 if (A.boundsi=0;i-) A.constantsi= A.boundsi+1*A.co
6、nstantsi+1; return OK; A.base=new ElemTypeelemtoStauts DestroyArray(Array &A) if (!A.base) return ERROR; delete A.base; A.base=NULL; if (!A.bounds) return ERROR; delete A.bounds; A.bounds=NULL; if (!contants) return ERROR; delete A.contants; A.contants=NULL; return OK;Stauts DestroyArray(Array &A)St
7、atus Locate(Array A,va_list ap,int &off) off=0; for (i=0;iA.dim;i+) ind=va_arg(ap,int); if (ind=A.boundsi) return OVERFLOW; off +=A.constantsi*ind; return OK;三维数组A684Status Locate(Array A,va_list Stauts Value(Array A,ElemType &e,.) va_start(ap,e); if (result=Locate(A,ap,off)=0) return result; e=*(A.
8、base+off); return OK;Stauts Value(Array A,ElemType Status Assign(Array &A,ElemType e,.) va_start(ap,e); if (result=Locate(A,ap,off)=j-1 ij2 0 0 0 02 4 7 9 5 7 52. 稀疏矩阵0 12 9 0 0 0 0 0 0 0 0 0 0 0-3 0 0 0 0 14 00 0 24 0 0 0 00 18 0 0 0 0 015 0 0 -7 0 0 06*7判定稀疏矩阵的标准:t/(m*n)T按照 T 中的顺序在 M 中选择相应的元素并放入T中
9、。 时间复杂度 O(M.nu*M.tu)依次把 M 中的元素转置到T中,再对T进行排序。 时间复杂度 O(M.tu*log(M.tu)转置方法 M-T按照 T 中的顺序在 M 中选择相应的元素Stauts TransposeSMatrix(TSMatrix M,TSMatrix &T) 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.dataq.j=M.data
10、p.i; T.dataq.e=M.datap.e; +q; return OK;时间复杂度:O(M.nu*M.tu)Stauts TransposeSMatrix(TSMatr三元组快速转置1 2 121 3 93 1 -33 6 144 3 245 2 186 1 156 4 -71 3 -31 6 152 1 122 5 183 1 93 4 244 6 -76 3 14M T三元组快速转置1 2 121 3快速转置法元素一次定位时间复杂度O(M.nu+M.tu)快速转置法元素一次定位for (col=1;col=M.nu;+=col) numcol=0;for (t=1;t=M.tu;+
11、t) +numM.datat.j;/累计每列的元素数目计算各列第一个非零元素在T中的位置cpot1=1;for (col=2;col=M.nu;+col) cpotcol=cpotcol-1+numcol-1统计M中各列的非零元素个数for (col=1;col=M.nu;+=col)统计M1 2 121 3 93 1 -33 6 144 3 245 2 186 1 156 4 -71 3 -31 6 152 1 122 5 183 1 93 4 244 6 -76 3 14M T22210101 2 3 4 5 6 7num1357889cpot1 2 121 3 -3M Status Fa
12、stTransposeSMatrix(TSMatrix M, TSMatrix &T) T.mu=M.nu; T.nu=M.mu; T.tu=M.tu; 计算num,cpot的值; 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+; return OK; Status FastTransposeSMatrix(TS(2) 行逻辑链接表示法为了便于随机存取任意一行的非零元素,需知道每一行的第一个非零元素在三元组表
13、中的位置。为此,将此信息保留在结构体类型中。typedef struct Triple dataMAXSIZE+1; int rposMAXRC+1; int mu,nu,tu;RLSMatrix;(2) 行逻辑链接表示法为了便于随机存取任意一行的非零元素,1 2 121 3 93 1 -33 6 144 3 245 2 186 1 156 4 -71 2 3 4 5 6133567M.rposM.mu=6M.nu=7M.tu=8M.data1 2 121 2 3 行逻辑链接矩阵相乘Q m1*n2=Mm1*n1*N m2*n2 (n1=m2)for (i=1;i=m1;i+) for (j=1
14、;j=n2+j) Qij=0; for (k=1;k=n1;k+) Qij=Qij+Mik*Nkj 时间复杂度O(m1*n1*n2)行逻辑链接矩阵相乘Q m1*n2=Mm1*n1*N m2*相乘操作的特点两个稀疏矩阵相乘,结果不一定是稀疏矩阵Qij= Mik*Nkj每个M.datap要与N中所有满足条件 M.datap.j = N.dataq.i 的元素进行相乘操作 相乘操作的特点两个稀疏矩阵相乘,结果不一定是稀疏矩阵M=1 2 3 4 1235rpos1 1 31 4 52 2 -13 1 21 2 22 1 13 1 -23 2 4N=0 0 50 -1 0 02 0 0 00 20-2
15、40 03*44*21 2 3 134rposM=1 2 3 4 1235Q 初始化;if (M与N都不是零矩阵) for (arow=1;arow=M.mu; arow +) ctemp =0; 计算Q中第arow行的积并存入ctemp 中; 将ctemp 中非零元素压缩存储到Q.data; i,kk,.Q 初始化;i,kk,.Status MultSMatrix(RLSMatrix M, RLSMatrix N,RLSMatrix &Q) if (M.nu!=N.mu) return ERROR; Q.mu=M.mu;Q.nu=N.nu; Q.tu=0; if (M.tu*N.tu) fo
16、r (arow=1;arow=M.mu;arow+) Ctemp=0; Q.rposarow=Q.tu+1; /Q的rpos值 if (arowM.mu) tp=M.rposarow+1; else tp=M.tu+1;Status MultSMatrix(RLSMatrix M for (p=M.rposarow;ptp;p+) brow=M.datap.j; /N中的位置 if (browN.mu) t=N.rposbrow+1; else t=N.tu+1; for (q=N.rposbrow;qt;q+) ccol=N.dataq.j; ctempccol+=M.datap.e*N.d
17、ataq.e; for (ccol=1;ccolMAXSIZE) return ERROR; Q.dataQ.tu=(arow,ccol,ctempccol); return OK; for (p=M.rposarow;pmnt; if (!(M.rhead=new OLinkm+1) exit(OVERFLOW); if (!(N.chead=new OLinkn+1) exit(OVERFLOW); M.rhead =M.chead =NULL; for (i=1;iije; if (!(p=new OLNode) exit(OVERFLOW): p-i=i;p-j=j;p-e=e; if
18、 (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)p-down=M.cheadj;M.cheadj=p; else for (q=M.cheadj;(q-down)&q-down-idown); p-down=q-down;q-down=p; return OK; Status CreateSMatrix_OL(CrossL
19、十字链表相加 A+B-A分析相加后结点由三类组成原A中结点 (Aij0,Bij=0)B 中结点 (Aij=0,Bij0)A,B之和 (Aij0,Bij0)十字链表相加 A+B-A分析思路逐行一列一列比较(pa-jpb-j)或 pa行已处理完在A中插入Bij;(pa-jj)A移动指针;(pa-j=pb-j)if 之和不为零 then 修改pa-e else 删除pa;思路逐行一列一列比较注意由于每个结点处在两个链表中,因而插入、删除要同时对两个方向的链表进行。没有破坏B十字链表。注意由于每个结点处在两个链表中,因而插入、删除要同时对两个方5.4 广义表的定义5.4 广义表的定义广义表的定义长度为
20、n的广义表是一种数据结构 Lists=(D,R)D=di|i=1,2,.,n,n=0, 且diD0或di ListsR=LR LR=|d i-1, di属于D,2=i=1 1=itag=ATOM) return 0; for (max=0,pp=L;pp;pp=pp-ptr.tp) dep=GListDepth(pp-ptr.hp); if (depmax) max=dep; return max+1;int GListDepth(GList L)复制广义表非空广义表由表头和表尾唯一确定基本项: 空表归纳项: 分别复制表头和表尾复制广义表非空广义表由表头和表尾唯一确定Status CopyGList(GList &T,GList L) if (!L) T=NULL; /空表 else if (!(T=new GLNode) exit(OVERFLOW); T-tag=L-tag; if (L-tag=ATOM) T-data=L-data; else CopyGList(T-ptr.hp,L-ptr.hp); CopyGList(T-ptr.tp,L-ptr.tp); return OK;Status CopyGList(GList &T,GLisStatus CreateGList(GLisst
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 周长的认识教学设计
- 办公区消防演习方案
- 齐齐哈尔市梅里斯达斡尔族区2025届数学三年级下学期期中达标测试试题含答案解析
- 《工序质量预控计划》试题测试卷附答案
- 2025广东汕尾海丰县国有资产监督管理局招聘6名县属国有企业工作人员拟聘用人员(第三批)笔试历年典型考点题库附带答案详解
- 2025广东佛山市禅城区国有资产监督管理局下属企业招聘工作人员1人笔试历年常考点试题专练附带答案详解
- 2025年陕西华山旅游集团有限公司招聘(50人)笔试历年难易错考点试卷带答案解析
- 2025年秋季安徽六安市霍邱联合村镇银行社会招聘笔试历年典型考题及考点剖析附带答案详解
- 2025年甘肃省白银有色集团股份有限公司技能操作人员社会招聘552人笔试历年典型考点题库附带答案详解
- 2025年河北石家庄兴蓉环境发展有限责任公司招聘化验技术岗岗位笔试历年常考点试题专练附带答案详解
- 2026年重庆市“五方面人员”选拔乡镇领导班子考试历年参考题库(含完整答案)
- (正式版)DB31 650-2020 《非织造布单位产品能源消耗限额》
- 2026年浙江基层法律服务工作者执业核准考试试题及答案
- GB/T 33969-2026高炉富氧喷煤技术规范
- 2026年幼儿园课程故事培训会
- LY/T 1497-2025枣
- 2025年全国检察官遴选考试真题及参考答案
- 2026年事业单位考试国内核心时事政治考点梳理(附50题)
- 2026中国铌期货市场投资策略与价格波动研究报告
- 2019超高压输变电系统内部过电压分析与PSCAD EMTDC仿真应用
- 消除艾梅乙母婴传播培训
评论
0/150
提交评论