第5章 数组和广义表 自测题含答案

合集下载

国开放大学数据结构(本科)单元5数组和广义表-单元测试题含答案

国开放大学数据结构(本科)单元5数组和广义表-单元测试题含答案

开放大学数据结构(本科)单元5数组和广义表单元测试题含答案试题1一维数组A采用顺序存储结构,每个元素占用4个字节,第8个元素的存储地址为120,则该数组的首地址是()。

选择一项:A.88B.92C.32D.90反馈正确答案是:92试题2稀疏矩阵采用压缩存储的目的主要是()。

选择一项:A.对矩阵元素的存取变得简单B.表达变得简单C.去掉矩阵中的多余元素D.减少不必要的存储空间的开销反馈正确答案是:减少不必要的存储空间的开销试题3一个非空广义表的表头()。

选择一项:A.只能是子表B.可以是子表或原子C.不可能是原子D.只能是原子反馈正确答案是:可以是子表或原子试题4常对数组进行的两种基本操作是()。

选择一项:A.索引与、和修改B.查找与索引C.查找和修改D.建立与删除反馈正确答案是:查找和修改试题5在二维数组A[8][10]中,每一个数组元素A[i][j] 占用3个存储空间,所有数组元素相继存放于一个连续的存储空间中,则存放该数组至少需要的存储空间是()。

选择一项:A.80B.270C.240D.100反馈正确答案是:240试题6设有一个18阶的对称矩阵A,采用压缩存储的方式,将其下三角部分以行序为主序存储到一维数组B中(数组下标从1开始),则矩阵中元素A10,8在一维数组B 中的下标是()。

选择一项:A.18B.53C.45D.58反馈正确答案是:53试题7广义表((a))的表尾是()。

选择一项:A.((a))B.(a)C.0D.a反馈正确答案是:0试题8设有一个10阶的对称矩阵A,采用压缩存储的方式,将其下三角部分以行序为主序存储到一维数组B中(数组下标从1开始),则矩阵中元素A8,5在一维数组B中的下标是()。

选择一项:A.32B.85C.41D.33反馈正确答案是:33试题9设广义表类((a,b,c)),则L的长度和深度分别为()。

选择一项:A.2和3B.1和2C.1和1D.1和3反馈正确答案是:1和2试题10广义表( a , a ,b , d , e ,( (i ,j ) ,k ) )的表头是________。

第五章 数组和广义表

第五章 数组和广义表

第五章数组和广义表一.选择题1.在二维数组A 中引用A[i,j]的时间_________。

A.与i、j的大小有关B.与i、j的大小无关C.与i的大小有关,与j的大小无关D.与i的大小无关,与j的大小有关2.在稀疏矩阵的带行指针向量的链接存储中,每一行单链表中的结点都具有相同的________。

A.行号 B.列号 C.元素值 D.地址3.二维数组A 按行顺序存储,其中每个元素占1个存储单元。

若 A[1][1]的存储地址为420, A[3][3]的存储地址为446,则A[5][5]的存储地址为_______。

A.470 B.471 C.472 D. 4734.在稀疏矩阵的十字链接存储中,每个列单链表中的结点都具有相同的_____。

A.行号 B.列号 C.元素值 D.地址5.下面的说法中,不正确的是________。

A.对称矩阵中只须存放包括主对角线元素在内的下(或上)三角部分的元素即可B.对角矩阵中只须存放的非零元素即可C.稀疏矩阵中值为零的元素较多,因此可以采用三元组表方法存储D.稀疏矩阵中大量值为零的元素分布有规律,因此可以采用三元组表方法存储6.对一些特殊矩阵采用压缩存储的目的主要是为了________。

A.表达变得简单 B.对矩阵元素的存取变得简单C.去掉矩阵中的多余元素 D.减少不必要的存储空间的开销7.若将n 阶对称矩阵 A 按照行序为主序方式将包括主对角线元素在内的下三角形的所有元素依次存放在一个一维数组 B 中,则该对称矩阵在 B 中占用了________个数组元素。

A.n2 B.n*(n-1) C.n*(n+1)/2 D.n*(n-1)8. 稀疏矩阵的三元组顺序表表示的一个三元组中不包括________。

A. 行号B.列号C.元素值D.元素总数9.稀疏矩阵一般的压缩存储方法有两种,即________。

A.二维数组和三维数组 B.三元组和散列C. 三元组和十字链表 D.散列和十字链表10.有一个 10 阶对称矩阵 A,采用压缩存储方式(以行序为主存储,且A[0 Ⅱ0]=1),则A[8][5]的地址是________。

第四、五章串、数组和广义表练习题答案

第四、五章串、数组和广义表练习题答案

第四、五章串、数组和广义表练习题答案一.填空题1. 不包括任何字符(长度为0)的串称为空串;由一个或多个空格(仅由空格符)组成的串称为空白串。

2. 设S=“A;/document/”,那么strlen(s)= 20 , “/”的字符定位的位置为3。

3. 子串的定位运算称为串的模式匹配;被匹配的主串称为目标串,子串称为模式。

4. 设目标T=”abccdcdccbaa”,模式P=“cdcc”,那么第 6 次匹配成功。

5. 假设n为主串长,m为子串长,那么串的古典(朴素)匹配算法最坏的情形下需要比较字符的总次数为(n-m+1)*m。

6. 假设有二维数组A6×8,每一个元素用相邻的6个字节存储,存储器按字节编址。

已知A的起始存储位置(基地址)为1000,那么数组A的体积(存储量)为 288 B ;末尾元素A57的第一个字节地址为 1282 ;假设按行存储时,元素A14的第一个字节地址为(8+4)×6+1000=1072 ;假设按列存储时,元素A47的第一个字节地址为 (6×7+4)×6+1000)=1276 。

(注:数组是从0行0列仍是从1行1列计算起呢?由末单元为A57可知,是从0行0列开始!)7. 〖00年运算机系考研题〗设数组a[1…60, 1…70]的基地址为2048,每一个元素占2个存储单元,假设以列序为主序顺序存储,那么元素a[32,58]的存储地址为8950 。

答:不考虑0行0列,利用列优先公式:LOC(a ij)=LOC(a c1,c2)+[(j-c2)*(d1-c1+1)+i-c1)]*L得:LOC(a32,58)=2048+[(58-1)*(60-1+1)+32-1]]*2=89508. 三元素组表中的每一个结点对应于稀疏矩阵的一个非零元素,它包括有三个数据项,别离表示该元素的行下标、列下标和元素值。

9.求以下广义表操作的结果:(1)GetHead【((a,b),(c,d))】=== (a, b) ; u=;(*b).nu=;(*b).tu=;if{ q=1;for(col=1; __ col<=, ________;col++)for(p=1;p<=;p++)if[p].j ==col){(*b).data[q].i=[p].j;(*b).data[q].j=[p].i;(*b).data[q].v=[p].v;__q++_________;}}23.基于三元组的稀疏矩阵转置的处置方式有两种,以下计算依照矩阵A的三元组的顺序进行转置,请在___________处用适当的句子用以填充。

数据结构第五章数组和广义表

数据结构第五章数组和广义表

第五章数组和广义表:习题习题一、选择题1.假设以行序为主序存储二维数组A[1..100,1..100],设每个数据元素占两个存储单元,基地址为10,则LOC(A[5,5])=( )。

A. 808B. 818C. 1010D. 10202.同一数组中的元素( )。

A. 长度可以不同B.不限C.类型相同 D. 长度不限3.二维数组A的元素都是6个字符组成的串,行下标i的范围从0到8,列下标j的范圈从1到10。

从供选择的答案中选出应填入下列关于数组存储叙述中( )内的正确答案。

(1)存放A至少需要( )个字节。

(2)A的第8列和第5行共占( )个字节。

(3)若A按行存放,元素A[8]【5]的起始地址与A按列存放时的元素( )的起始地址一致。

供选择的答案:(1)A. 90 B. 180 C. 240 D. 270 E.540(2) A. 108 B. 114 C. 54 D. 60 E.150(3)A.A[8][5] B. A[3][10] c.A[5][8] D.A[O][9]4.数组与一般线性表的区别主要是( )。

A.存储方面B.元素类型方面C.逻辑结构方面D.不能进行插入和删除运算5.设二维数组A[1..m,1..n]按行存储在数组B[1..m×n]中,则二维数组元素A [i,j]在一维数组B中的下标为( )。

A. (i-l)×n+jB. (i-l)×n+j-lC.i×(j-l) D. j×m+i-l6.所谓稀疏矩阵指的是( )。

A.零元素个数较多的矩阵B.零元素个数占矩阵元素中总个数一半的矩阵C.零元素个数远远多于非零元素个数且分布没有规律的矩阵D.包含有零元素的矩阵7.对稀疏矩阵进行压缩存储的目的是( )。

A.便于进行矩阵运算B.便于输入和输出C.节省存储空间D. 降低运算的时间复杂度8.稀疏矩阵一般的压缩存储方法有两种,即( )。

A.二维数组和三维数组B.三元组和散列C.三元组和十字链表D.散列和十字链表9.有一个100×90的稀疏矩阵,非0元素有10个,设每个整型数占两字节,则用三元组表示该矩阵时,所需的字节数是( )。

数据结构-5 数组与广义表

数据结构-5 数组与广义表

第五章数组与广义表一.单项选择题1.在以下的叙述中,正确的是。

A. 线性表的线性存储结构优于链表存储结构B. 二维数组是数据元素为线性表的线性表C. 栈的操作方式是先进先出D. 队列的操作方式是先进后出2.常对数组进行的两种操作是。

A. 建立与删除B. 索引和修改C. 查找和修改D. 查找与索引3.在数组A中,每个数组元素A[i,j]占用3个存储字,行下标i从1到8,列下标j从1到10。

所有数组元素相继存放在一个连续的存储空间,则存放该数组至少需要的存储字数是。

A. 80B. 100C. 240D. 2704.假设8行10列的二维数组a[1..8, 1..10]分别以行序为主序和以列序为主序顺序存储时,其首地址相同,那么以行序为主序时元素a[3][5]的地址与以列序为主序时元素 _______的地址相同。

A. a[5][3]B. a[8][3]C. a[1][4]D. 答案A、B、C均不对5.如果只保存一个n阶对称矩阵a的下三角元素(含对角线元素),并采用行主序存储在一维数组b中,a[i][j](或a[i,j])存于b[k],则对i<j,下标k与i、j的关系是_____。

A. B. C. D.6.将一个A[1..100,1..100]的三对角矩阵以行序为主序存入一维数组B[1..298]中,元素A[66,65]在B数组中的位置k等于_______。

A. 198B. 197C. 196D. 1957.稀疏矩阵一般的压缩存储方法有两种,即。

A. 二维数组和三维数组B. 三元组和散列C. 三元组和十字链表D. 散列和十字链表8. 一个非空广义表的表头_______。

A. 不可能是子表B. 只能是子表C. 只能是原子D. 可以是原子或子表9. 对广义表,通常采用的存储结构是______。

A. 数组B. 链表C. Hash表D. 三元组10. 一个三元组表用于表示一个_______。

A. 线性表B. 广义表C. 双向链表D. 稀疏矩阵11.广义表G=(a,b,(c,d,(e,f)),G)的长度是。

完整word版数据结构数组和广义表习题及答案

完整word版数据结构数组和广义表习题及答案

习题五数组和广义表一、单项选择题1.常对数组进行的两种基本操作是()A.建立与删除B. 索引与修改C. 查找与修改D. 查找与索引2.对于C语言的二维数组DataType A[m][n],每个数据元素占K个存储单元,二维数组中任意元素a[i,j] 的存储位置可由( )式确定.A.Loc[i,j]=A[m,n]+[(n+1)*i+j]*kB.Loc[i,j]=loc[0,0]+[(m+n)*i+j]*kC.Loc[i,j]=loc[0,0]+[(n+1)*i+j]*kD.Loc[i,j]=[(n+1)*i+j]*k3.稀疏矩阵的压缩存储方法是只存储 ( )A.非零元素B. 三元祖(i,j, aij)C. aijD. i,j4. 数组A[0..5,0..6]的每个元素占五个字节,将其按列优先次序存储在起始地址为1000的内存单元中,则元素A[5,5]的地址是( )。

A. 1175B. 1180C. 1205D. 12105. A[N,N]是对称矩阵,将下面三角(包括对角线)以行序存储到一维数组T[N(N+1)/2]中,则对任一上三角元素a[i][j]对应T[k]的下标k是()。

A. i(i-1)/2+jB. j(j-1)/2+iC. i(j-i)/2+1D. j(i-1)/2+16. 用数组r存储静态链表,结点的next域指向后继,工作指针j指向链中结点,使j 沿链移动的操作为( )。

A. j=r[j].nextB. j=j+1C. j=j->nextD. j=r[j]-> next7. 对稀疏矩阵进行压缩存储目的是()。

A.便于进行矩阵运算 B.便于输入和输出C.节省存储空间 D.降低运算的时间复杂度8. 已知广义表LS=((a,b,c),(d,e,f)),运用head和tail函数取出LS中原子e的运算是( )。

A. head(tail(LS))B. tail(head(LS))C. head(tail(head(tail(LS)))D. head(tail(tail(head(LS))))9. 广义表((a,b,c,d))的表头是(),表尾是()。

数据结构(c语言版)题集答案——第五章_数组和广义表

数据结构(c语言版)题集答案——第五章_数组和广义表

第五章数组和广义表5.18void RSh(int A[n],int k)//把数组A的元素循环右移k位,只用一个辅助存储空间{for(i=1;i<=k;i++)if(n%i==0&&k%i==0) p=i;//求n和k的最大公约数pfor(i=0;i{j=i;l=(i+n-k)%n;temp=A[i];while(l!=i){A[j]=A[l];j=l;l=(j+n-k)%n;}// 循环右移一步A[j]=temp;}//for}//RSh分析:要把A的元素循环右移k位,则A[0]移至A[k],A[k]移至A[2k]......直到最终回到A[0].然而这并没有全部解决问题,因为有可能有的元素在此过程中始终没有被访问过,而是被跳了过去.分析可知,当n和k的最大公约数为p时,只要分别以A[0],A[1],...A[p-1]为起点执行上述算法,就可以保证每一个元素都被且仅被右移一次,从而满足题目要求.也就是说,A的所有元素分别处在p个"循环链"上面.举例如下:n=15,k=6,则p=3.第一条链:A[0]->A[6],A[6]->A[12],A[12]->A[3],A[3]->A[9],A[9]->A[0].第二条链:A[1]->A[7],A[7]->A[13],A[13]->A[4],A[4]->A[10],A[10]->A[1].第三条链:A[2]->A[8],A[8]->A[14],A[14]->A[5],A[5]->A[11],A[11]->A[2].恰好使所有元素都右移一次.虽然未经数学证明,但作者相信上述规律应该是正确的.5.19void Get_Saddle(int A[m][n])//求矩阵A中的马鞍点{for(i=0;i{for(min=A[i][0],j=0;jif(A[i][j]for(j=0;jif(A[i][j]==min) //判断这个(些)最小值是否鞍点{for(flag=1,k=0;kif(minif(flag)printf("Found a saddle element!\nA[%d][%d]=%d",i,j,A[i][j]);}}//for}//Get_Saddle5.20int exps[MAXSIZE]; //exps数组用于存储某一项的各变元的指数int maxm,n; //maxm指示变元总数,n指示一个变元的最高指数void Print_Poly_Descend(int *a,int m)//按降幂顺序输出m元多项式的项,各项的系数已经按照题目要求存储于m维数组中,数组的头指针为a{maxm=m;for(i=m*n;i>=0;i--) //按降幂次序,可能出现的最高项次数为mnGet_All(a,m,i,0); //确定并输出所有次数为i的项}//Print_Poly_Descendvoid Get_All(int *a,int m,int i,int seq)//递归求出所有和为i的m个自然数{if(seq==maxm) Print_Nomial(a,exps); //已经求完时,输出该项else{min=i-(m-1)*n; //当前数不能小于minif(min<0) min=0;max=nfor(j=min;j<=max;j++){exps[seq]=j; //依次取符合条件的数Get_All(a,m-1,i-j,seq+1); //取下一个数}}//elseexps[seq]=0; //返回}//Get_Allvoid Print_Nomial(int *a,int exps[ ])//输出一个项,项的各变元的指数已经存储在数组exps中{pos=0;for(i=0;i{pos*=n;pos+=exps[i];}coef=*(a+pos); //取得该系数coefif(!coef) return; //该项为0时无需输出else if(coef>0) printf("+"); //系数为正时打印加号else if(coef<0) printf("-"); //系数为负时打印减号if(abs(coef)!=1) printf("%d",abs(coef)); //当系数的绝对值不为1时打印系数for(i=0;iif(exps[i]) //打印各变元及其系数{printf("x");printf("%d",i);printf("E");if(exps[i]>1) printf("%d",exp[i]); //系数为1时无需打印}}//Print_Nomial分析:本算法的关键在于如何按照降幂顺序输出各项.这里采用了一个递归函数来找到所有满足和为i的m个自然数作为各变元的指数.只要先取第一个数为j,然后再找到所有满足和为i-j的m-1个自然数就行了.要注意j的取值范围必须使剩余m-1个自然数能够找到,所以不能小于i-(m-1)*maxn,也不能大于i.只要找到了一组符合条件的数,就可以在存储多项式系数的数组中确定对应的项的系数的位置,并且在系数不为0时输出对应的项.5.21void TSMatrix_Add(TSMatrix A,TSMatrix B,TSMatrix &C)//三元组表示的稀疏矩阵加法{C.mu=A.mu;C.nu=A.nu;C.tu=0;pa=1;pb=1;pc=1;for(x=1;x<=A.mu;x++) //对矩阵的每一行进行加法{while(A.data[pa].iwhile(B.data[pb].iwhile(A.data[pa].i==x&&B.data[pb].i==x)//行列值都相等的元素{if(A.data[pa].j==B.data[pb].j){ce=A.data[pa].e+B.data[pb].e;if(ce) //和不为0{C.data[pc].i=x;C.data[pc].j=A.data[pa].j;C.data[pc].e=ce;pa++;pb++;pc++;}}//ifelse if(A.data[pa].j>B.data[pb].j){C.data[pc].i=x;C.data[pc].j=B.data[pb].j;C.data[pc].e=B.data[pb].e;pb++;pc++;}else{C.data[pc].i=x;C.data[pc].j=A.data[pa].j;C.data[pc].e=A.data[pa].epa++;pc++;}}//whilewhile(A.data[pa]==x) //插入A中剩余的元素(第x行){C.data[pc].i=x;C.data[pc].j=A.data[pa].j;C.data[pc].e=A.data[pa].epa++;pc++;}while(B.data[pb]==x) //插入B中剩余的元素(第x行){C.data[pc].i=x;C.data[pc].j=B.data[pb].j;C.data[pc].e=B.data[pb].e;pb++;pc++;}}//forC.tu=pc;}//TSMatrix_Add5.22void TSMatrix_Addto(TSMatrix &A,TSMatrix B)//将三元组矩阵B加到A上{for(i=1;i<=A.tu;i++)A.data[MAXSIZE-A.tu+i]=A.data[i];/把A的所有元素都移到尾部以腾出位置pa=MAXSIZE-A.tu+1;pb=1;pc=1;for(x=1;x<=A.mu;x++) //对矩阵的每一行进行加法{while(A.data[pa].iwhile(B.data[pb].iwhile(A.data[pa].i==x&&B.data[pb].i==x)//行列值都相等的元素{if(A.data[pa].j==B.data[pb].j){ne=A.data[pa].e+B.data[pb].e;if(ne) //和不为0{A.data[pc].i=x;A.data[pc].j=A.data[pa].j;A.data[pc].e=ne;pa++;pb++;pc++;}}//ifelse if(A.data[pa].j>B.data[pb].j){A.data[pc].i=x;A.data[pc].j=B.data[pb].j;A.data[pc].e=B.data[pb].e;pb++;pc++;}else{A.data[pc].i=x;A.data[pc].j=A.data[pa].j;A.data[pc].e=A.data[pa].epa++;pc++;}}//whilewhile(A.data[pa]==x) //插入A中剩余的元素(第x行){A.data[pc].i=x;A.data[pc].j=A.data[pa].j;A.data[pc].e=A.data[pa].epa++;pc++;}while(B.data[pb]==x) //插入B中剩余的元素(第x行){A.data[pc].i=x;A.data[pc].j=B.data[pb].j;A.data[pc].e=B.data[pb].e;pb++;pc++;}}//forA.tu=pc;for(i=A.tu;i}//TSMatrix_Addto5.23typedef struct{int j;int e;} DSElem;typedef struct{DSElem data[MAXSIZE];int cpot[MAXROW];//这个向量存储每一行在二元组中的起始位置int mu,nu,tu;} DSMatrix; //二元组矩阵类型Status DSMatrix_Locate(DSMatrix A,int i,int j,int &e)//求二元组矩阵的元素A[i][j]的值e {for(s=A.cpot[i];sif(s{e=A.data[s];return OK;}return ERROR;}//DSMatrix_Locate5.24typedef struct{int seq; //该元素在以行为主序排列时的序号int e;} SElem;typedef struct{SElem data[MAXSIZE];int mu,nu,tu;} SMatrix; //单下标二元组矩阵类型Status SMatrix_Locate(SMatrix A,int i,int j,int &e)//求单下标二元组矩阵的元素A[i][j]的值e {s=i*A.nu+j+1;p=1;while(A.data[p].seqif(A.data[p].seq==s) //找到了元素A[i][j]{e=A.data[p].e;return OK;}return ERROR;}//SMatrix_Locate5.25typedef enum{0,1} bool;typedef struct{int mu,nu;int elem[MAXSIZE];bool map[mu][nu];} BMMatrix; //用位图表示的矩阵类型void BMMatrix_Add(BMMatrix A,BMMatrix B,BMMatrix &C)//位图矩阵的加法{C.mu=A.mu;C.nu=A.nu;pa=1;pb=1;pc=1;for(i=0;ifor(j=0;j{if(A.map[i][j]&&B.map[i][j]&&(A.elem[pa]+B.elem[pb]))//结果不为0{C.elem[pc]=A.elem[pa]+B.elem[pb];C.map[i][j]=1;pa++;pb++;pc++;}else if(A.map[i][j]&&!B.map[i][j]){C.elem[pc]=A.elem[pa];C.map[i][j]=1;pa++;pc++;}else if(!A.map[i][j]&&B.map[i][j]){C.elem[pc]=B.elem[pb];C.map[i][j]=1;pb++;pc++;}}}//BMMatrix_Add5.26void Print_OLMatrix(OLMatrix A)//以三元组格式输出十字链表表示的矩阵{for(i=0;i{if(A.rhead[i])for(p=A.rhead[i];p;p=p->right) //逐次遍历每一个行链表printf("%d %d %d\n",i,p->j,p->e;}}//Print_OLMatrix5.27void OLMatrix_Add(OLMatrix &A,OLMatrix B)//把十字链表表示的矩阵B加到A上{for(j=1;j<=A.nu;j++) cp[j]=A.chead[j]; //向量cp存储每一列当前最后一个元素的指针for(i=1;i<=A.mu;i++){pa=A.rhead[i];pb=B.rhead[i];pre=NULL;while(pb){if(pa==NULL||pa->j>pb->j) //新插入一个结点{p=(OLNode*)malloc(sizeof(OLNode));if(!pre) A.rhead[i]=p;else pre->right=p;p->right=pa;pre=p;p->i=i;p->j=pb->j;p->e=pb->e; //插入行链表中if(!A.chead[p->j]){A.chead[p->j]=p;p->down=NULL;}else{while(cp[p->j]->down) cp[p->j]=cp[p->j]->down;p->down=cp[p->j]->down;cp[p->j]->down=p;}cp[p->j]=p; //插入列链表中}//ifelse if(pa->jj){pre=pa;pa=pa->right;} //pa右移一步else if(pa->e+pb->e){pa->e+=pb->e;pre=pa;pa=pa->right;pb=pb->right;} //直接相加else{if(!pre) A.rhead[i]=pa->right;else pre->right=pa->right;p=pa;pa=pa->right; //从行链表中删除if(A.chead[p->j]==p)A.chead[p->j]=cp[p->j]=p->down;else cp[p->j]->down=p->down; //从列链表中删除free (p);}//else}//while}//for}//OLMatrix_Add分析:本题的具体思想在课本中有详细的解释说明.5.28void MPList_PianDao(MPList &L)//对广义表存储结构的多元多项式求第一变元的偏导{for(p=L->hp->tp;p&&p->exp;pre=p,p=p->tp){if(p->tag) Mul(p->hp,p->exp);else p->coef*=p->exp; //把指数乘在本结点或其下属结点上p->exp--;}pre->tp=NULL;if(p) free (p); //删除可能存在的常数项}//MPList_PianDaovoid Mul(MPList &L,int x)//递归算法,对多元多项式L乘以x{for(p=L;p;p=p->tp){if(!p->tag) p->coef*=x;else Mul(p->hp,x);}}//Mul5.29void MPList_Add(MPList A,MPList B,MPList &C)//广义表存储结构的多项式相加的递归算法{C=(MPLNode*)malloc(sizeof(MPLNode)); if(!A->tag&&!B->tag) //原子项,可直接相加{C->coef=A->coef+B->coef;if(!C->coef){free(C);C=NULL;}}//ifelse if(A->tag&&B->tag) //两个多项式相加{p=A;q=B;pre=NULL;while(p&&q){if(p->exp==q->exp){C=(MPLNode*)malloc(sizeof(MPLNode)); C->exp=p->exp;MPList_Add(A->hp,B->hp,C->hp);pre->tp=C;pre=C;p=p->tp;q=q->tp;}else if(p->exp>q->exp){C=(MPLNode*)malloc(sizeof(MPLNode)); C->exp=p->exp;C->hp=A->hp;pre->tp=C;pre=C;p=p->tp;}else{C=(MPLNode*)malloc(sizeof(MPLNode)); C->exp=q->exp;C->hp=B->hp;pre->tp=C;pre=C;q=q->tp;}}//whilewhile(p){C=(MPLNode*)malloc(sizeof(MPLNode)); C->exp=p->exp;C->hp=p->hp;pre->tp=C;pre=C;p=p->tp;}while(q){C=(MPLNode*)malloc(sizeof(MPLNode));C->exp=q->exp;C->hp=q->hp;pre->tp=C;pre=C;q=q->tp;} //将其同次项分别相加得到新的多项式,原理见第二章多项式相加一题}//else ifelse if(A->tag&&!B->tag) //多项式和常数项相加{x=B->coef;for(p=A;p->tp->tp;p=p->tp);if(p->tp->exp==0) p->tp->coef+=x; //当多项式中含有常数项时,加上常数项if(!p->tp->coef){free(p->tp);p->tp=NULL;}else{q=(MPLNode*)malloc(sizeof(MPLNode));q->coef=x;q->exp=0;q->tag=0;q->tp=NULL;p->tp=q;} //否则新建常数项,下同}//else ifelse{x=A->coef;for(p=B;p->tp->tp;p=p->tp);if(p->tp->exp==0) p->tp->coef+=x;if(!p->tp->coef){free(p->tp);p->tp=NULL;}else{q=(MPLNode*)malloc(sizeof(MPLNode));q->coef=x;q->exp=0;q->tag=0;q->tp=NULL;p->tp=q;}}//else}//MPList_Add5.30int GList_Getdeph(GList L)//求广义表深度的递归算法{if(!L->tag) return 0; //原子深度为0else if(!L) return 1; //空表深度为1m=GList_Getdeph(L->ptr.hp)+1;n=GList_Getdeph(L->ptr.tp);return m>n?m:n;}//GList_Getdeph5.31void GList_Copy(GList A,GList &B)//复制广义表的递归算法{if(!A->tag) //当结点为原子时,直接复制{B->tag=0;B->atom=A->atom;}else //当结点为子表时{B->tag=1;if(A->ptr.hp){B->ptr.hp=malloc(sizeof(GLNode));GList_Copy(A->ptr.hp,B->ptr.hp);} //复制表头if(A->ptr.tp){B->ptr.tp=malloc(sizeof(GLNode));GList_Copy(A->ptr.tp,B->ptr.tp);} //复制表尾}//else}//GList_Copy5.32int GList_Equal(GList A,GList B)//判断广义表A和B是否相等,是则返回1,否则返回0 { //广义表相等可分三种情况:if(!A&&!B) return 1; //空表是相等的if(!A->tag&&!B->tag&&A->atom==B->atom) return 1;//原子的值相等if(A->tag&&B->tag)if(GList_Equal(A->ptr.hp,B->ptr.hp)&&GList_Equal(A->ptr.tp,B->ptr.tp))return 1; //表头表尾都相等return 0;}//GList_Equal5.33void GList_PrintElem(GList A,int layer)//递归输出广义表的原子及其所在层次,layer表示当前层次{if(!A) return;if(!A->tag) printf("%d %d\n",A->atom,layer);else{GList_PrintElem(A->ptr.hp,layer+1);GList_PrintElem(A->ptr.tp,layer); //注意尾表与原表是同一层次}}//GList_PrintElem5.34void GList_Reverse(GList A)//递归逆转广义表A{GLNode *ptr[MAX_SIZE];if(A->tag&&A->ptr.tp) //当A不为原子且表尾非空时才需逆转{for(i=0,p=A;p;p=p->ptr.tp,i++){if(p->ptr.hp) GList_Reverse(p->ptr.hp); //逆转各子表ptr[i]=p->ptr.hp;}for(p=A;p;p=p->ptr.tp) //重新按逆序排列各子表的顺序p->ptr.hp=ptr[--i];}}//GList_Reverse5.35Status Create_GList(GList &L)//根据输入创建广义表L,并返回指针{scanf("%c",&ch);if(ch==' '){L=NULL;scanf("%c",&ch);if(ch!=')') return ERROR;return OK;}L=(GList)malloc(sizeof(GLNode));L->tag=1;if(isalphabet(ch)) //输入是字母{p=(GList)malloc(sizeof(GLNode)); //建原子型表头p->tag=0;p->atom=ch;L->ptr.hp=p;}else if(ch=='(') Create_GList(L->ptr.hp); //建子表型表头else return ERROR;scanf ("%c",&ch);if(ch==')') L->ptr.tp=NULL;else if(ch==',') Create_GList(L->ptr.tp); //建表尾else return ERROR;return OK;}//Create_GList分析:本题思路见书后解答.5.36void GList_PrintList(GList A)//按标准形式输出广义表{if(!A) printf("()"); //空表else if(!A->tag) printf("%d",A->atom);//原子else{printf("(");for(p=A;p;p=p->ptr.tp){GList_PrintList(p->ptr.hp);if(p->ptr.tp) printf(","); //只有当表尾非空时才需要打印逗号}printf(")");}//else}//GList_PrintList5.37void GList_DelElem(GList &A,int x)//从广义表A中删除所有值为x的原子{if(A&&A->ptr.hp){if(A->ptr.hp->tag) GList_DelElem(A->ptr.hp,x);else if(!A->ptr.hp->tag&&A->ptr.hp->atom==x){q=A;A=A->ptr.tp; //删去元素值为x的表头free(q);GList_DelElem(A,x);}}if(A&&A->ptr.tp) GList_DelElem(A->ptr.tp,x);}//GList_DelElem5.39void GList_PrintElem_LOrder(GList A)//按层序输出广义表A中的所有元素{InitQueue(Q);for(p=L;p;p=p->ptr.tp) EnQueue(Q,p);while(!QueueEmpty(Q)){DeQueue(Q,r);if(!r->tag) printf("%d",r->atom);elsefor(r=r->ptr.hp;r;r=r->ptr.tp) EnQueue(Q,r);}//while}//GList_PrintElem_LOrder分析:层序遍历的问题,一般都是借助队列来完成的,每次从队头取出一个元素的同时把它下一层的孩子插入队尾.这是层序遍历的基本思想.。

第5章数组和广义表答案

第5章数组和广义表答案

第5章数组和⼴义表答案第五章答案5.2设有三对⾓矩阵A n×n,将其三条对⾓线上的元素逐⾏的存于数组B[1..3n-2]中,使得B[k]=a ij,求:(1)⽤i,j表⽰k的下标变换公式;(2)⽤k表⽰i、j的下标变换公式。

【解答】(1)k=2(i-1)+j(2) i=[k/3]+1, j=[k/3]+k%3 ([ ]取整,%取余)5.4在稀疏矩阵的快速转置算法5.2中,将计算position[col]的⽅法稍加改动,使算法只占⽤⼀个辅助向量空间。

【解答】算法(⼀)FastTransposeTSMatrix(TSMartrix A, TSMatrix *B){/*把矩阵A转置到B所指向的矩阵中去,矩阵⽤三元组表表⽰*/int col,t,p,q;int position[MAXSIZE];B->len=A.len; B->n=A.m; B->m=A.n;if(B->len>0){position[1]=1;for(t=1;t<=A.len;t++)position[A.data[t].col+1]++; /*position[col]存放第col-1列⾮零元素的个数, 即利⽤pos[col]来记录第col-1列中⾮零元素的个数*/ /*求col列中第⼀个⾮零元素在B.data[ ]的位置,存放在position[col]中*/ for(col=2;col<=A.n;col++)position[col]=position[col]+position[col-1];for(p=1;p{col=A.data[p].col;q=position[col];B->data[q].row=A.data[p].col;B->data[q].col=A.data[p].row;B->data[q].e=A.data[p].e;Position[col]++;}}}算法(⼆)FastTransposeTSMatrix(TSMartrix A, TSMatrix *B){int col,t,p,q;int position[MAXSIZE];B->len=A.len; B->n=A.m; B->m=A.n;if(B->len>0){for(col=1;col<=A.n;col++)position[col]=0;for(t=1;t<=A.len;t++)position[A.data[t].col]++; /*计算每⼀列的⾮零元素的个数*//*从最后⼀列起求每⼀列中第⼀个⾮零元素在B.data[]中的位置,存放在position[col]中*/ for(col=A.n,t=A.len;col>0;col--) { t=t-position[col];position[col]=t+1;}for(p=1;p{col=A.data[p].col;q=position[col];B->data[q].row=A.data[p].col;B->data[q].col=A.data[p].row;B->data[q].e=A.data[p].e;Position[col]++;}}}5.6画出下⾯⼴义表的两种存储结构图⽰:((((a), b)), ((( ), d), (e, f)))【解答】第⼀种存储结构第⼆种存储结构5.7求下列⼴义表运算的结果:(1)HEAD[((a,b),(c,d))]; (a,b) (2)TAIL[((a,b),(c,d))]; ((c,d)) (3)TAIL[HEAD[((a,b),(c,d))]]; (b)(4)HEAD[TAIL[HEAD[((a,b),(c,d))]]]; b(5)TAIL[HEAD[TAIL[((a,b),(c,d))]]]; (d)。

中南大学数据结构与算法第5章数组和广义表课后作业答案

中南大学数据结构与算法第5章数组和广义表课后作业答案

中南⼤学数据结构与算法第5章数组和⼴义表课后作业答案第5章数组与⼴义表习题练习答案5.1请按⾏及按列优先顺序列出四维数组A2*3*2*3的所有元素在内存中的存储次序,开始结点为a0000。

解:按⾏优先的顺序排列时,先变化右边的下标,也就是右到左依次变化,这个四维数组的排列是这样的:(将这个排列分⾏写出以便与阅读,只要按从左到右的顺序存放就是在内存中的排列位置) a0000a0001a0002a0010a0011a0012a0100a0101a0102a0110a0111a0112a0200a0201a0202a0210a0211a0212a1000a1001a1002a1010a1011a1012a1100a1101a1102a1110a1111a1112a1200a1201a1202a1210a1211a1212按列优先的顺序排列恰恰相反,变化最快的是左边的下标,然后向右变化,所以这个四维数组的排列将是这样的,(这⾥为了便于阅读,也将其书写为分⾏形式):a0000a1000a0100a1100a0200a1200a0010a1010a0110a1110a0210a1210a0001a1001a0101a1101a0201a1201a0011a1011a0111a1111a0211a1211a0002a1002a0102a1102a0202a1202a0012a1012a0112a1112a0212a02125.2 给出C语⾔的三维数组地址计算公式。

解:因为C语⾔的数组下标下界是0,所以Loc(A mnp)=Loc(A000)+((i*n*p)+k)*d其中Amnp表⽰三维数组。

Loc(A000)表⽰数组起始位置。

i、j、k表⽰当前元素的下标,d表⽰每个元素所占单元数。

5.3设有三对⾓矩阵A n*n,将其三条对⾓线上的元素逐⾏地存储到向量B[0...3n-3]中,使得B[k]=a ij,求:(1)⽤i , j 表⽰k的下标变换公式。

《第5章 数组和广义表》习题解答

《第5章 数组和广义表》习题解答
returnA.base[off];
}
4.根据下标(script)修改数组元素的操作
操作int Assign(Array& A,int* script,EType e)的作用是,根据下标向量script修改数组A中相应元素的值为e。如果下标合理返回1表示修改成功,否则返回0表示操作失败。
int Assign(Array& A,int* script,EType e)
void Arrayoutput(Array A)
{int s[3],i,len=1;
switch(A.dim)
{
case 1://按一维数组格式输出
for(s[0]=0;s[0]<A.bounds[0];s[0]++) cout<<Value(A,s)<<" ";
cout<<endl;
break;
该存储结构以最右面的下标为主序,左下标优先变化,即下标变化顺序是从左到右。
以二维数组:
为例,其内存结构如图5.2(a)所示。
对于三维数组: (有2页、2行、3列),按右下标为主序的内存结构如图5.2(b)所示。
2.左下标为主序存储的n维数组中的元素a(j0,j1,...,jn-1)的地址计算公式
对于一个已经被定义的二维数组Ab0×b1=(a[i][j])b0×b1,只要给出该数组存放的起始地址LOC(a[0][0])、数组元素的行下标i和列下标j,以及每个元素所占用的存储单元(字节)数L,便可以求得元素a[i][j]在内存中的首地址LOC(a[i][j])。
int Value(Array A,int* script,EType &e)

第5章数组和广义表答案

第5章数组和广义表答案

第5章数组和广义表答案第 5 章数组和广义表一、选择1.设有一个10阶的对称矩阵A,采用压缩存储方式,以行序为主存储,a11为第一元素,其存储地址为1,每个元素占一个地址空间,则a85的地址为( B )。

A. 13B. 33C. 18D. 402. 设有数组A[i,j],数组的每个元素长度为3字节,i的值为1 到8 ,j的值为1 到10,数组从内存首地址BA开始顺序存放,当用以列为主存放时,元素A[5,8]的存储首地址为(B )。

A. BA+141B. BA+180C. BA+222D. BA+2253. 假设以行序为主序存储二维数组A=array[1..100,1..100],设每个数据元素占2个存储单元,基地址为10,则LOC[5,5]=( B )。

A. 808B. 818C. 1010D. 10204. 二维数组A的元素都是6个字符组成的串,行下标i的范围从0到8,列下标j的范围从0到9。

从供选择的答案中选出应填入下列关于数组存储叙述中()内的正确答案。

(1)存放A至少需要( E )个字节;(2)A的第8列和第5行共占( A )个字节;(3)若A按行存放,元素A[8,5]的起始地址与A按列存放时的元素( B )的起始地址一致。

供选择的答案:(1)A. 90 B. 180 C. 240 D. 270 E. 540(2)A. 108 B. 114 C. 54 D. 60 E. 150 (3)A. A[8,5] B. A[4,9]C. A[5,8]D. A[0,9]5. 若对n阶对称矩阵A以行序为主序方式将其下三角形的元素(包括主对角线上所有元素)依次存放于一维数组B[1..(n(n+1))/2]中,则在B中确定aij(i<="" b="" p="">A. i*(i-1)/2+jB. j*(j-1)/2+iC. i*(i+1)/2+jD. j*(j+1)/2+i6. A[N,N]是对称矩阵,将下面三角(包括对角线)以行序存储到一维数组T[N(N+1)/2]中,则对任一上三角元素a[i][j]对应T[k]的下标k是( B )。

第五章数组和广义表

第五章数组和广义表

第五章数组和广义表一、单项选择题1.一维数组A采用顺序存储结构,每个元素占用6个字节,第6个元素的存储地址为100,则该数组的首地址是()。

A.64 B.28C.70 D.902.稀疏矩阵采用压缩存储的目的主要是()。

A.表达变得简单B.对矩阵元素的存取变得简单C.去掉矩阵中的多余元素D.减少不必要的存储空间的开销3.一个非空广义表的表头()。

A.不可能是原子B.只能是子表C.只能是原子D.可以是子表或原子4.常对数组进行的两种基本操作是()。

A.建立与删除B.索引与修改C.查找和修改D.查找与索引5. 设二维数组A[5][6]按行优先顺序存储在内存中,已知A[0][0] 起始地址为1000,每个数组元素占用5个存储单元,则元素A[4][4]的地址为()。

A.1140 B.1145 C.1120 D.11256.设有一个20阶的对称矩阵A,采用压缩存储的方式,将其下三角部分以行序为主序存储到一维数组B中(数组下标从1开始),则矩阵中元素a9,2在一维数组B中的下标是()。

A.41 B.32 C.18 D.387.稀疏矩阵的压缩存储方式通常有两种,即()。

A.二元组和三元组B.三元组和散列C.三元组和十字链表D.散列和十字链表8.广义表(a,(a,b),d,e,((I,j),k))的长度和深度分别是()。

A.5,3 B.5,5 C.6,4 D.6,69.广义表((a),a)的表头是()。

A.a B.(a)C.()D.((a))10.二维数组A[20][10]采用行序为主序方式存储,每个数据元素占4个存储单元,且A[10][5]的存储地址是1000,则A[18][9]的存储地址是()。

A.1208 B.1212 C.1368 D.133611.二维数组A中,每个数据元素占4个字节,行下标从0到4,列下标从0到5,按行优先存储时元素A[3][5]的地址域同按列优先存储时元素()的地址相同。

A.A[2][4] B.A[3][4] C.A[3][5] D.A[4][4]二、问答题1、简述广义表和线性表的区别与联系。

数据结构 第5章 数组和广义表答案

数据结构 第5章  数组和广义表答案

第五章数组和广义表一、选择题部分答案解释如下。

1. 错误。

对于完全二叉树,用一维数组作存储结构是效率高的(存储密度大)。

4. 错误。

数组是具有相同性质的数据元素的集合,数据元素不仅有值,还有下标。

因此,可以说数祖是元素值和下标构成的偶对的有穷集合。

5. 错误。

数组在维数和界偶确定后,其元素个数已经确定,不能进行插入和删除运算。

6. 错误。

稀疏矩阵转置后,除行列下标及行列数互换外,还必须确定该元素转置后在新三元组中的位置。

8. 错误。

广义表的取表尾运算,是非空广义表除去表头元素,剩余元素组成的表,不可能是原子。

9. 错误。

广义表的表头就是广义表的第一个元素。

只有非空广义表才能取表头。

10. 错误。

广义表中元素可以是原子,也可以是表(包括空表和非空表)。

11. 错误。

广义表的表尾,指去掉表头元素后,剩余元素所组成的表。

三、填空题1. 顺序存储结构2.(1)9572(2)12283.(1)9174(2)87884. 11005. 1164 公式:LOC(a ijk)=LOC(a000)+[v2*v3*(i-c1)+v3*(j-c2)+(k-c3)]*l (l为每个元素所占单元数)6. 2327. 13408. 11969. 第1行第3列10. (1)270 (2)27 (3)2204 11. i(i-1)/2+j (1<=i,j<=n)12. (1)n(n+1)/2 (2)i(i+1)/2 (或j(j+1)/2) (3)i(i-1)/2+j (4)j(j-1)/2+i (1<=i,j<=n)13. 1038 三对角矩阵按行存储:k=2(i-1)+j (1<=i,j<=n)14. 33 (k=i(i-1)/2+j) (1<=i,j<=n)15. 非零元很少(t<<m*n)且分布没有规律 16. 节省存储空间。

17. 上三角矩阵中,主对角线上第r(1≤r≤n) 行有n-r+1个元素,a ij所在行的元素数是j-i+1。

第5章数组和广义表

第5章数组和广义表

第五章习题参考答案一、简答题1.【参考答案】:数组是一组具有相同数据类型的数据集合。

数据元素按次序存储于一段地址连续的内存空间中。

可以通过下标找到存放该元素的存储地址,访问该数据元素的值。

数组中的每一个元素和下标惟一对应。

访问数组中任意指定的数据元素形式是,数组名[下标]。

举例略。

2.【参考答案】:数组是一组具有相同数据类型的数据集合。

数据元素按次序存储于一段地址连续的内存空间中。

即数组是数据元素的线性组合,类似于顺序存储结构的线性表。

3.【参考答案】:在n阶方阵A中,若元素满足下述性质:aij=aji (0≤i,j≤n-1)则称A为n阶对称矩阵。

三角矩阵是指n阶矩阵中上三角(不包括对角线)或下三角(不包括对角线)中的元素均为常数c或为0的n阶方阵。

以主对角线划分,三角矩阵有上三角和下三角两种。

在n阶矩阵A中,所有的非零元素都集中在以对角线为中心的带状区域中,则称A为n阶对角矩阵。

实质上,除了主对角线和主对角线相邻两侧的若干条对角线上的元素之外,其余元素均为零或为常数c。

稀疏矩阵压缩存储方法有两类:顺序存储结构和链式存储结构。

共同点:为了节省存储单元,可只存储非零元素,压缩零元素的存储空间;非零元素的分布一般是没有规律的;在存储非零元素的同时,还必须存储非零元素所在的行号、列号,才能惟一确定非零元素是矩阵中的哪一个元素。

稀疏矩阵中的所有非零元素构成了三元组线性表。

4.【参考答案】:一个阶数较大的m×n矩阵中,设有s个非零元素,如果s<<m×n时,则称该矩阵为稀疏矩阵。

准确的讲,在矩阵A中,有s个非零元素。

令e=s/(m×n),称e 为矩阵的稀疏因子。

通常认为e≤0.05时,称矩阵A为稀疏矩阵。

特点:非零元素分布没有规律,而且很少,远小于矩阵中的元素总个数。

采用压缩存储,节省存储空间,只存储非零元素,并且每个非零元素都需要一个三元组(i,j,aij)惟一表示。

数据结构第五章数组和广义表

数据结构第五章数组和广义表

第五章数组和广义表:习题习题一、选择题1.假设以行序为主序存储二维数组A[1..100,1..100],设每个数据元素占两个存储单元,基地址为10,则LOC(A[5,5])=( )。

A. 808B. 818C. 1010D. 10202.同一数组中的元素( )。

A. 长度可以不同 B.不限 C.类型相同 D. 长度不限3.二维数组A的元素都是6个字符组成的串,行下标i的范围从0到8,列下标j的范圈从1到10。

从供选择的答案中选出应填入下列关于数组存储叙述中( )内的正确答案。

(1)存放A至少需要( )个字节。

(2)A的第8列和第5行共占( )个字节。

(3)若A按行存放,元素A[8]【5]的起始地址与A按列存放时的元素( )的起始地址一致。

供选择的答案:(1)A. 90 B. 180 C. 240 D. 270(2) A. 108 B. 114 C. 54 D. 60(3)[8][5] B. A[3][10] [5][8] [O][9]4.数组与一般线性表的区别主要是( )。

A.存储方面B.元素类型方面C.逻辑结构方面D.不能进行插入和删除运算5.设二维数组A[1..m,1..n]按行存储在数组B[1..m×n]中,则二维数组元素A[i,j]在一维数组B中的下标为( )。

A. (i-l)×n+jB. (i-l)×n+j-lC.i×(j-l) D. j×m+i-l6.所谓稀疏矩阵指的是( )。

A.零元素个数较多的矩阵B.零元素个数占矩阵元素中总个数一半的矩阵C.零元素个数远远多于非零元素个数且分布没有规律的矩阵D.包含有零元素的矩阵7.对稀疏矩阵进行压缩存储的目的是( )。

A.便于进行矩阵运算B.便于输入和输出C.节省存储空间D. 降低运算的时间复杂度8.稀疏矩阵一般的压缩存储方法有两种,即( )。

A.二维数组和三维数组B.三元组和散列C.三元组和十字链表D.散列和十字链表9.有一个100×90的稀疏矩阵,非0元素有10个,设每个整型数占两字节,则用三元组表示该矩阵时,所需的字节数是( )。

第五章 数组和广义表练习题

第五章 数组和广义表练习题

第五章数组和广义表练习题一选择题1.假设有60行70列的二维数组a[1…60, 1…70]以列序为主序顺序存储,其基地址为10000,每个元素占2个存储单元,那么第32行第58列的元素a[32,58]的存储地址为()。

(无第0行第0列元素)A、16902 B、16904 C、14454 D、答案A, B, C均不对2.二维数组M的元素是4个字符(每个字符占一个存储单元)组成的串,行下标i的范围从0到4,列下标j的范围从0到5,M按行存储时元素M[0][5]的起始地址与M按列存储时元素( ) 的起始地址相同。

A. M[2][4]B. M[3][4]C. M[4][5]D. M[4][0]3. 稀疏矩阵一般的压缩存储方法有两种,即()。

A 二维数组和三维数组 B.三元组和散列 C.三元组和十字链表D.散列和十字链表4. 一个n阶对称矩阵,如果以行或列为主序放入内存,则容量为_______A. n*nB. n**/2C. (n+1)*(n+1)/2D. n*(n+1)/25、广义表((a),(a))的表头是______,表尾是______A. aB. (a)C. ((a))D. ()6. 设矩阵A是一个对称矩阵,为了节省存储,将其下三角部分按行序存放在一维数组B[1,n(n-1)/2]中,对下三角部分中任一元素ai,j(i<=j),在一组数组B的下标位置k的值是()。

A. i(i-1)/2+j-1B. i(i-1)/2+jC. i(i+1)/2+j-1D. i(i+1)/2+j答案(隐藏中)A 【按列优先顺序存储的二维数组Amn地址计算公式LOC(aij)=LOC(a11)+[(j-1)×m+i-1]×dD C D CB D二填空题1、设有二维数组A(m*n),其中每个元素占w个存储单元,第一个元素a[1][1]的起始地址为L,则以列主序方式存储a[i][j]的存储单元地址是__________.2、在C语言中有定义,float b[5][7];设其首地址是1900,则元素b[3][5]•的存储地址是________.3、假设一个10阶的下三角矩阵A 按列优顺序压缩存储在一维数组C 中,则C 数组的大小应为________。

数据结构第05章 数组与广义表习题

数据结构第05章 数组与广义表习题

第五章 数组和广义表一、选择题1、设广义表L=((a ,b ,c)),则L 的长度和深度分别为( )。

A. 1和1B. 1和3C. 1和2D. 2和32、广义表((a),a)的表尾是( )。

A. aB. (a)C. ()D. ((a))3、设有一个10阶的对称矩阵A ,采用压缩存储方式,以行序为主存储,a11为第一个元素,其存储地址为1,每元素占1个地址空间,则a85的地址为( )。

A. 13B. 33C. 18D. 404、一个非空广义表的表头( )。

A. 不可能是子表B. 只能是子表C. 只能是原子D. 可以是子表或原子5、设矩阵A 是一个对称矩阵,为了节省存储,将其下三角部分按行序存放在一维数组B[1,n(n-1)/2]中,对下三角部分中任一元素ai,j(i>=j),在一维数组B 的下标位置k 的值是( )。

A. i(i-1)/2+j-1B. i(i-1)/2+jC. i(i+1)/2+j-1D. i(i+1)/2+j6、广义表G=(a,b(c,d,(e,f)),g)的长度是( )。

A. 3B. 4C. 7D. 87、采用稀疏矩阵的三元组表形式进行压缩存储,若要完成对三元组表进行转置,只要将行和列对换,这种说法( )。

A. 正确B. 错误C. 无法确定D. 以上均不对8、常对数组进行两种基本操作是( )。

A. 建立和删除B. 索引和修改C. 查找和修改D. 查找与索引9、对一些特殊矩阵采用压缩存储的目的主要是为了( )。

A. 表达变得简单B. 对矩阵元素的存取变得简单C. 去掉矩阵中的多余元素D. 减少不必要的存储空间的开销 10、假设以三元组表表示稀疏矩阵,则与如图所示三元组表对应的4×5的稀疏矩阵是(注:矩阵的行列下标均从1开始)( )。

A. ⎪⎪⎪⎪⎪⎭⎫ ⎝⎛--00405000000000706080 B. ⎪⎪⎪⎪⎪⎭⎫ ⎝⎛--00000004053000706080 C. ⎪⎪⎪⎪⎪⎭⎫ ⎝⎛--00405000073000006080D. ⎪⎪⎪⎪⎪⎭⎫ ⎝⎛--00000304050000706080二、判断题1、广义表中原子个数即为广义表的长度。

数据结构第五章数组和广义表练习及答案

数据结构第五章数组和广义表练习及答案

数据结构第五章数组和广义表练习及答案一、选择题1、设二维数组A[0..m-1][0..n-1]按行优先顺序存储在内存中,每个元素a ij占d个字节,则元素a ij的地址为()A、LOC(a00)+(i*n+j)*dB、LOC(a00)+((i-1)*n+j-1)*dC、LOC(a00)+((j-1)*n+i-1)*dD、LOC(a00)+(j*n+i-1)*d2、已知二维数组A8*10中,元素a12的地址为1000,每个元素占2个字节,则元素a00的地址为()A、972B、974C、976D、9783、若数组A[0..m-1][0..n-1]按列优先顺序存储,则a ij地址为()A、LOC(a00)+j*m+iB、LOC(a00)+j*n+IC、LOC(a00)+(j-1)*n+i-1D、LOC(a00)+(j-1)*m+I-14、若下三角矩阵A n*n,按行顺序压缩存储在数组a[0..(n+1)n/2]中,则非零元素a ij的地址为()(设每个元素占d个字节)A、LOC(a00)+((j-1)j/2+i)*dB、LOC(a00)+((i+1)i/2+j)*dC、LOC(a00)+((i-1)i/2+i-1)*dD、LOC(a00)+((i-1)i/2+j-1)*d5、设有广义表D=(a,b,D),其长度为(B),深度为(A)A、∞B、3C、2D、56、广义表A=(a),则表尾为()A、aB、(())C、空表D、(a)7、广义表A=((x,(a,b)),((x,(a,b)),y)),则运算head(head(tail(A)))为()A、xB、(a,b)C、(x,(a,b))D、A8、数组A中,每个元素的长度为3个字节,行下标i从1到8,列下标j从1到10,从首地址a开始连续存放在存储器内,存放该数组至少需要的单元数为()A、80B、100C、240D、2709、数组A中,每个元素的长度为3个字节,行下标i从1到8,列下标j从1到10,从首地址a开始连续存放在存储器内,该数组按行存放时,元素A[8][5]的起始地址为()A、a+141B、a+144C、a+222D、a+22510、稀疏矩阵一般的压缩存储方法有两种,即()A、二维数组和三维数组B、三元组和散列C、三元组和十字链表D、散列和十字链表11、一个广义表的表头总是一个()A、广义表B、元素C、空表D、元素或广义表12、数组就是矩阵,矩阵就是数组,这种说法()A、正确B、错误C、前一句对,后一句错D、后一句对二、填空题1、广义表LS=(),其长度为(0);深度为(0)。

第5章数组和广义表

第5章数组和广义表

第5章数组和广义表一、判断题:( )1.数组不适合作为任何二叉树的存储结构。

( )2.从逻辑结构上看,n维数组的每个元素均属于n个向量。

( )3.稀疏矩阵压缩存储后,必会失去随机存取功能。

( )4.数组是同类型值的集合。

( )5.数组可看成线性结构的一种推广,因此与线性表一样,可以对它进行插入、删除等操作。

( )6.二维以上的数组其实是一种特殊的广义表。

( )7.若一个广义表的表头为空表,则此广义表亦为空表。

( )8.广义表中的元素或者是一个不可分割的原子,或者是一个非空的广义表。

( )9.所谓取广义表的表尾就是返回广义表中最后一个元素。

( )10.广义表的同级元素(直属于同一个表中的各元素)具有线性关系。

二、填空题:1.数组的存储结构采用__________存储方式。

2.设二维数组A[-20..30,-30..20], 每个元素占有4 个存储单元, 存储起始地址为200.如按行优先顺序存储,则元素A[25,18]的存储地为_________;如按列优先顺序存储,则元素A[-18,-25]的存储地址为____________。

3.设数组a[1..50,1..80]的基地址为2000,每个元素占2个存储单元,若以行序为主序顺序存储,则元素a[45,68] 的存储地址为____________;若以列序为主序顺序存储,则元素a[45,68]的存储地址为____________。

4.将整型数组A[1..8,1..8]按行优先次序存储在起始地址为1000的连续的内存单元中,则元素A[7,3]的地址是__________。

5.设有二维数组A[0..9,0..19],其每个元素占两个字节,第一个元素的存储地址为100,若按列优先顺序存储,则元素A[6,6]存储地址为_____________。

6.已知数组A[0..9,0..9]的每个元素占5个存储单元,将其按行优先次序存储在起始地址为1000的连续的内存单元中,则元素A[6,8]的地址为__________。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第5章 数组和广义表 自测题含答案
一、单选题
1. 假设有二维数组A 6×8,每个元素用相邻的6个字节存储,存储器按字节编址。

已知A 的起始存储位置(基地址)为1000,则数组A 的体积(存储量)为 288
B ;末尾元素A 57的第一个字节地址为 1282 ;若按行存储时,元素A 14的第一个字节地址为 (8+4)×6+1000=1072 ;若按列存储时,元素A 47的第一个字节地址为 (6×7+4)×6+1000)=1276 。

2. 〖00年计算机系考研题〗设数组a[1…60, 1…70]的基地址为2048,每个元素占2个存储单元,若以列序为主序顺序存储,则元素a[32,58]的存储地址为 8950 。

答:不考虑0行0列,利用列优先公式: LOC(a ij )=LOC(a c 1,
c 2)+[(j-c 2)*(
d 1-c 1+1)+i-c 1)]*L
得:LOC(a 32,58)=2048+[(58-1)*(60-1+1)+32-1]]*2=8950
3. 三元素组表中的每个结点对应于稀疏矩阵的一个非零元素,它包含有三个数据项,分别表示该元素的 行下标 、 列下标 和 元素值 。

4. 求下列广义表操作的结果:
(1) GetHead 【((a,b),(c,d))】=== (a, b) ; //头元素不必加括号
(2) GetHead 【GetTail 【((a,b),(c,d))】】=== (c,d) ;
(3) GetHead 【GetTail 【GetHead 【((a,b),(c,d))】】】=== b ;
(4) GetTail 【GetHead 【GetTail 【((a,b),(c,d))】】】=== (d ) ;
二、单选题( A )1. 〖01年计算机系考研题〗假设有60行70列的二维数组a[1…60, 1…70]以列序为主序顺序存储,其基地址为10000,每个元素占2个存储单元,那么第32行第58列的元素a[32,58]的存储地址为 。

(无第0行第0列元素)
A.16902 B.16904 C.14454 D.答案A, B, C 均不对 答:此题与填空题第8小题相似。

(57列×60行+31行)×2字节+10000=16902
( B )2. 设矩阵A 是一个对称矩阵,为了节省存储,将其下三角部分(如下图所示)按行序存放在一维数组B[ 1, n(n-1)/2 ]中,对下三角部分中任一元素a i,j (i ≤j), 在一维数组B 中下标k 的值是:
A.i(i-1)/2+j-1 B.i(i-1)/2+j C.i(i+1)/2+j-1
D.i(i+1)/2+j ⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎣⎡=n n n n a a a a a a A ,2
,1,2
,21,21
,1
3. 【91初程P78】从供选择的答案中,选出应填入下面叙述?内的最确切的解答,把相应编号写在答卷的对应栏内。

有一个二维数组A,行下标的范围是0到8,列下标的范围是1到5,每个数组元素用相邻的4个字节存储。

存储器按字节编址。

假设存储数组元素A[0,1]的第一个字节的地址是0。

存储数组A的最后一个元素的第一个字节的地址是A 。

若按行存储,则A[3,5]和A[5,3]的第一个字节的地址分别是 B 和 C 。

若按列存储,则A[7,1]和A[2,4]的第一个字节的地址分别是 D 和 E 。

供选择的答案:
A~E:①28 ②44 ③76 ④92 ⑤108
⑥116 ⑦132 ⑧176 ⑨184 ⑩188
答案:ABCDE=8, 3, 5, 1, 6
4.【94程P12】有一个二维数组A,行下标的范围是1到6,列下标的范围是0到7,每个数组元素用相邻的6个字节存储,存储器按字节编址。

那么,这个数组的体积是 A 个字节。

假设存储数组元素A[1,0]的第一个字节的地址是0,则存储数组A的最后一个元素的第一个字节的地址是 B 。

若按行存储,则A[2,4]的第一个字节的地址是 C 。

若按列存储,则A[5,7]的第一个字节的地址是 D 。

供选择的答案
A~D:①12 ②66 ③72 ④96 ⑤114 ⑥120
⑦156 ⑧234 ⑨276 ⑩282 (11)283 (12)288
答案:ABCD=12, 10, 3, 9
三、简答题
1. 【其他教材】已知二维数组Am,m采用按行优先顺序存放,每个元素占K个存储单元,并且第一个元素的存储地址为Loc(a11),请写出求Loc(aij)的计算公式。

如果采用列优先顺序存放呢?
解:公式教材已给出,此处虽是方阵,但行列公式仍不相同;
按行存储的元素地址公式是:Loc(aij)= Loc(a11) +[ (i-1)*m+(j-1) ] * K
按列存储的元素地址公式是:Loc(aij)= Loc(a11) +[ (j-1)*m+(i-1) ] * K
2.【全国专升本资格考试】递归算法比非递归算法花费更多的时间,对吗?为什么?
答:不一定。

时间复杂度与样本个数n有关,是指最深层的执行语句耗费时间,而递归算法与非递归算法在最深层的语句执行上是没有区别的,循环的次数也没有太大差异。

仅仅是确定循环是否继续的方式不同,递归用栈隐含循环次数,非递归用循环变量来显示循环次数而已。

四、计算题
1. (P60 4-18)用三元组表表示下列稀疏矩阵:
⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡2000000000000005000000000006000000000000030008000000000000000000)1( ⎥⎥⎥⎥⎥⎥⎥⎦
⎤⎢⎢⎢⎢⎢⎢⎢⎣⎡-000003000000000500000000000009200000)2( 解:参见填空题4. 三元素组表中的每个结点对应于稀疏矩阵的一个非零元素,它包含有三个数据项,分别表示该元素的 行下标 、 列下标 和 元素值 。

(2)可列表为:
2. (P60 4-19)下列各三元组表分别表示一个稀疏矩阵,试写出它们的稀疏矩阵。

⎥⎥⎥⎥⎥⎥⎥⎥⎥⎦
⎤⎢⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡16166354443131212221646)1( ⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎣⎡73465382
3942
111554)2(
解:(1)为6×4矩阵,非零元素有6个。

(2)为4×5矩阵,非零元素有5个
五、算法设计题
1.【严题集5.18⑤】试设计一个算法,将数组An 中的元素A[0]至A[n-1]循环
右移k位,并要求只用一个元素大小的附加存储,元素移动或交换次数为O(n)解:
分析:要把A的元素循环右移k位,则A[0]移至A[k],A[k]移至A[2k]......直到最终回到A[ 0].然而这并没有全部解决问题,因为有可能有的元素在此过程中始终没有被访问过,而是被跳了过去.分析可知,当n和k的最大公约数为p时,只要分别以A[0],A[1],...A[p-1]为起点执行上述算法,就可以保证每一个元素都被且仅被右移一次,从而满足题目要求.也就是说,A的所有元素分别处在p个"循环链"上面.举例如下:
n=15,k=6,则p=3.
第一条链:A[0]->A[6],A[6]->A[12],A[12]->A[3],A[3]->A[9],A[9]->A[0]. /已“顺便”移动了A[6]、A[12]…
第二条链:A[1]->A[7],A[7]->A[13],A[13]->A[4],A[4]->A[10],A[10]->A[1].
第三条链:A[2]->A[8],A[8]->A[14],A[14]->A[5],A[5]->A[11],A[11]->A[2].
恰好使所有元素都右移一次.
虽然未经数学证明,但作者相信上述规律应该是正确的. 程序如下:
void RSh(int A[n],int k)//把数组A的元素循环右移k位,只用一个辅助存储空间{
for(i=1;i<=k;i++)
if(n%i==0&&k%i==0) p=i;//求n和k的最大公约数p
for(i=0;i<p;i++)
{
j=i;l=(i+k)%n;temp=A[i];
while(l!=i)
{
A[j]=temp;
temp=A[l];
A[l]=A[j];
j=l;l=(j+k)%n;
}// 循环右移一步
A[i]=temp;
}//for
}//RSh。

相关文档
最新文档