第五章 数组和广义表Word格式.docx
- 文档编号:15736049
- 上传时间:2022-11-15
- 格式:DOCX
- 页数:16
- 大小:65.97KB
第五章 数组和广义表Word格式.docx
《第五章 数组和广义表Word格式.docx》由会员分享,可在线阅读,更多相关《第五章 数组和广义表Word格式.docx(16页珍藏版)》请在冰豆网上搜索。
按行优先顺序存放(以二维数组为例)
元素aij的存储地址为:
Loc(aij)=Loc(a00)+(ixn+j)L(0≤i≤m,0≤j≤n)
(式中:
Loc(a00)为元素a00的存储位置,即二维数组的起始存储位置,也称基地址,m为二维数组的总行数,n为总列数,aij代表其中第i行、第j列的那个元素,每个数据元素占L个存储单元)
按列优先顺序存放
Loc(aij)=Loc(a00)+(jxm+i)L(0≤i≤m,0≤j≤n)
2.数组的抽象数据类型
ADTArray{
数据对象:
D={aj1j2…jn|ji=0,...,bi-1,i=1,2,..,n,
n(>
0)称为数组的维数,bi是数组第i维的长度,ji是数组元素的第i维下标,
aj1j2…jn∈ElemSet}
数据关系:
R={R1,R2,...,Rn}
Ri={<
aj,...j,...j,aj,...,j+1,...,j>
|0≤jk≤bk-1,1≤k≤n且k≠i,
0≤ji≤bi-2,
aj1…ji…jn,aj1…ji+1…jn∈D,i=2,...,n}
基本操作:
InitArray(&
A,n,bound1,...,boundn)
操作结果:
若维数n和各维长度合法,则构造相应的数组A,并返回OK。
DestroyArray(&
A)
销毁数组A。
Value(A,&
e,index1,...,indexn)
初始条件:
A是n维数组,e为元素变量,随后是n个下标值。
若各下标不超界,则e赋值为所指定的A的元素值,并返回OK。
Assign(&
A,e,index1,...,indexn)
若下标不超界,则将e的值赋给所指定的A的元素,并返回OK。
}ADTArray
5.2数组顺序存储的表示和实现
#include<
stdarg.h>
//标准头文件,提供宏va_start、va_arg和va_end,用于存取变长参数表
#defineMAX_ARRAY_DIM8//假设数组维数的最大值为8
typedefstruct{
ElemType*base;
//数组元素的基址,由InitArray分配
Intdim;
//数组维数
Int*bounds;
//数组维界基址,由InitArray分配
Int*constants;
//数组映象函数常量基址,由InitArray分配
}Array;
数组初始化
StatusInitArray(Array&
A,intdim,……){
//若维数dim和随后的各维长度合法,则构造数组A,并返回OK
if(dim<
1||dim>
MAX_ARRAY_DIM)returnERROR;
A.dim=dim;
A.bounds=(int*)malloc(dim*sizeof(int));
if(!
A.bounds)exit(OVERFLOW);
//若各维长度合法,则存入A.bounds,并求出A的元素总数elemtotal
elemtotal=1;
va_start(ap,dim);
//ap为va_list类型,是存放变长参数表信息的数组
for(I=0;
I<
dim;
++I){
A.bounds[I]=va_arg(ap,int);
if(A.bounds[I]<
0)returnUNDERFLOW;
elemtotal*=A.bounds[I];
}
va_end(ap);
A.base=(ElemType*)malloc(elemtotal*sizeof(ElemType));
//求映象函数的常数ci,并存入A.constants[i-1],i=1,……,dim
A.constants=(int*)malloc(dim*sizeof(int));
A.onstants)exit(OVERFLOW);
A.constants[dim-1]=1;
//L=1,指针的增减以元素的大小为单位
For(i=dim-2;
i>
=0;
--i)
A.constants[i]=A.bounds[i+1]+A.constants[i+1]
returnOK;
销毁数组
StatusDestroyArray(Array&
A){
if(!
A.base)returnERROR;
free(A.base);
A.base=NULL;
A.bounds)returnERROR;
free(A.bounds);
A.bounds=NULL;
A.constants)returnERROR;
free(A.constants);
A.constants=NULL;
求元素地址
StatusLocate(ArrayA,va_listap,int&
off){
//若ap指示的各下标合法,则求出该元素在A中相对地址off
off=0;
for(i=0;
i<
A.dim;
++i){
ind=va_arg(ap,int);
if(ind<
0||ind>
=A.bounds[i]returnOVERFLOW;
off+=A.constants[i]*ind;
取元素的值
StatusValue(ArrayA,ElemType&
e,……){
//A是n维数组,e为元素变量,随后是n个下标值
//若各下标不超界,则e赋值为所指定的A的元素值,并返回OK
va_start(ap,e);
if((result=Locate(A,ap,off))<
=0returnresult;
e=*(A.base+off);
给数组赋值
StatusAssign(Array&
A,ElemTypee,……){
//若各下标不超界,则将e的值赋给所指定的A的元素,并返回OK
*(A.base+off)=e;
5.3稀疏矩阵的压缩存储
稀疏矩阵(SparseMatrix):
是矩阵中的一种特殊情况,其非零元素的个数远小于零元素的个数。
设m行n列的矩阵含t个非零元素,则称
为稀疏因子,通常认为δ≤0.05的矩阵为稀疏矩阵
以二维数组表示高阶的稀疏矩阵时,会产生零值元素占的空间很大且进行了很多和零值的运算的问题。
特殊矩阵:
值相同的元素或0元素在矩阵中的分布有一定的规律。
如下三角阵、三对角阵、稀疏矩阵。
压缩存储:
为多个值相同的元素只分配一个存储空间;
对0元素不分配空间。
目的是节省大量存储空间。
nxn的矩阵一般需要n2个存储单元,当为对称矩阵时需要n(1+n)/2个单元。
2.三元组顺序表——压缩存储稀疏矩阵方法之一(顺序存储结构)
三元组顺序表又称有序的双下标法,对矩阵中的每个非零元素用三个域分别表示其所在的行号、列号和元素值。
它的特点是,非零元在表中按行序有序存储,因此便于进行依行顺序处理的矩阵运算。
当矩阵中的非0元素少于1/3时即可节省存储空间。
(1)稀疏矩阵的三元组顺序表存储表示方法
#defineMAXSIZE12500//假设非零元个数的最大值为12500
typedefstruct{
inti,j;
//该非零元的行下标和列下标
ElemTypee;
//非零元素的值
}Triple;
//三元组类型
typedefunion{//共用体
Tripledata[MAXSIZE+1];
//非零元三元组表,data[0]未用
intmu,nu,tu;
//矩阵的行数、列数和非零元个数
}TSMatrix;
//稀疏矩阵类型
(2)求转置矩阵的操作
●用常规的二维数组表示时的算法
for(col=1;
col<
=nu;
++col)
for(row=1;
row<
=mu;
++row)
T[col][row]=M[row][col];
其时间复杂度为:
O(mu×
nu)
●用三元组顺序表表示时的快速转置算法
StatusFastTransposeSMatrix(TSMatrixM,TSMatrix&
T){
//采用三元组顺序表存储表示,求稀疏矩阵M的转置矩阵T
T.mu=M.nu;
T.nu=M.mu;
T.tu=M.tu;
if(T.tu){
=M.nu;
++col)num[col]=0;
for(t=1;
t<
=M.tu;
++t)++num[M.data[t].j];
//求M中每一列所含非零元的个数
cpot[1]=1;
for(col=2;
++col)cpot[col]=cpot[col-1]+num[col-1];
//求M中每一列的第一个非零元在b.data中的序号
for(p=1;
p<
++p){//转置矩阵元素
col=M.data[p].j;
q=cpot[col];
//q为存入b中的位置号
T.data[q].i=M.data[p].j;
T.data[q].j=M.data[p].i;
T.data[q].e=M.data[p].e;
++cpot[col];
//求出下一个非0元在b中存入的位置
}//for
}//if
r
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第五章 数组和广义表 第五 数组 广义
![提示](https://static.bdocx.com/images/bang_tan.gif)