广州大学松田学院6数据结构复习题-广义表-参考答案

合集下载

数据结构(数组和广义表)习题与答案

数据结构(数组和广义表)习题与答案

1、以行序优先顺序存储数组A[5][5];假定A[0][0]的地址为1000, 每个元素占4个字节,下标变量A[4][3]的地址是____。

A.1069B.1092C.1023D.1046正确答案:B2、数组a[1..6][1..5] (无0行0列)以列序优先顺序存储,第一个元素a[1][1]的地址为1000,每个元素占2个存储单元,则a[3][4]的地址是____。

A.1040B.1026C.1046D.1038正确答案:A3、设有一个5行4列的矩阵A,采用行序优先存储方式,A[0][0]为第一个元素,其存储地址为1000,A[2][2]的地址为1040,则A[3][0]的地址为_________。

A.1048B.1024C.1096D.1060正确答案:A4、设有一个10行10列的矩阵A,采用行序优先存储方式,存储全部数据需要400个字节的空间。

如果A[0][0]为第一个元素,其存储地址为1000,则A[3][6]的地址为_________。

A.1036B.1144C.1014D.10565、设有一个10行10列的矩阵A,采用行序优先存储方式。

如果A[0][0]为第一个元素,其存储地址为1000,A[2][3]的存储地址为1069,则存储一个元素需要的单元数是_________。

A.4B.1C.2D.3正确答案:D6、不能够对数据元素进行随机访问的物理结构是_________。

A.三元组顺序表B.对称矩阵的压缩存储C.三对角矩阵的压缩存储D.数组的顺序存储正确答案:A7、对特殊矩阵采用压缩存储的目的主要是_________。

A.表达变得简单B.去掉矩阵中的多余元素C.对矩阵元素的存储变得简单D.减少不必要的存储空间正确答案:D8、对n*n的对称矩阵进行压缩存储,需要保存的数据元素的个数是_________。

A.nB.n(n+1)/2C.n2D.n(n+1)9、设10*10的对称矩阵下三角保存SA[1..55]中,其中A[1][1]保存在SA[1]中,A[5][3] 保存在SA[k]中,这里k等于_________。

数据结构习题广义线性表-多维数组和广义表

数据结构习题广义线性表-多维数组和广义表

第4 章广义线性表——多维数组和广义表课后习题讲解1. 填空⑴ 数组通常只有两种运算:()和(),这决定了数组通常采用()结构来实现存储。

【解答】存取,修改,顺序存储【分析】数组是一个具有固定格式和数量的数据集合,在数组上一般不能做插入、删除元素的操作。

除了初始化和销毁之外,在数组中通常只有存取和修改两种操作。

⑵ 二维数组A中行下标从10到20,列下标从5到10,按行优先存储,每个元素占4个存储单元,A[10][5]的存储地址是1000,则元素A[15][10]的存储地址是()。

【解答】1140【分析】数组A中每行共有6个元素,元素A[15][10]的前面共存储了(15-10)×6+5个元素,每个元素占4个存储单元,所以,其存储地址是1000+140=1140。

⑶ 设有一个10阶的对称矩阵A采用压缩存储,A[0][0]为第一个元素,其存储地址为d,每个元素占1个存储单元,则元素A[8][5]的存储地址为()。

【解答】d+41【分析】元素A[8][5]的前面共存储了(1+2+…+8)+5=41个元素。

⑷ 稀疏矩阵一般压缩存储方法有两种,分别是()和()。

【解答】三元组顺序表,十字链表A 数组是一种线性结构B 数组是一种定长的线性结构C 除了插入与删除操作外,数组的基本操作还有存取、修改、检索和排序等D 数组的基本操作有存取、修改、检索和排序等,没有插入与删除操【解答】C【分析】数组属于广义线性表,数组被创建以后,其维数和每维中的元素个数是确定的,所以,数组通常没有插入和删除操作。

⑷ 对特殊矩阵采用压缩存储的目的主要是为了()A 表达变得简单B 对矩阵元素的存取变得简单C 去掉矩阵中的多余元素D 减少不必要的存储空间【解答】D【分析】在特殊矩阵中,有很多值相同的元素并且他们的分布有规律,没有必要为值相同的元素重复存储。

⑸ 下面()不属于特殊矩阵。

A 对角矩阵B 三角矩阵C 稀疏矩阵D 对称矩阵【解答】C⑹ 若广义表A满足Head(A)=Tail(A),则A为()A ( )B (( ))C (( ),( )) D(( ),( ),( ))【解答】BA 广义表是一种多层次的结构B 广义表是一种非线性结构C 广义表是一种共享结构D 广义表是一种递归【解答】B【分析】从各层元素各自具有的线性关系讲,广义表属于线性结构。

2010广东省数据结构理论考试试题及答案

2010广东省数据结构理论考试试题及答案

1、已知广义表L=((x,y,z),a,(u,t,w)),从L 表中取出原子项t 的操作是( D )。

A) Head(Head(Tail(Tail(L))))B) Tail(Head(Head(Tail(L))))C) Head(Tail(Head(Tail(L))))D)Head(Tail(Head(Tail(Tail(L)))))2、广义表A=(A,B,(C,D),(E,(F,G))),则head(tail(head(tail(tail(A)))))=( D )。

A) (G) B) (D) C) C D) D3、与无向图相关的术语有( C )。

A)强连通图 B)入度C)路径 D)弧4、设单链表中指针p指着结点A,若要删除A之后的结点(若存在),则需要修改指针的操作为( A )。

A)p->next=p->next->next B)p=p->nextC)p=p->nexe->next D)p->next=p5、在一个链队列中,假定front和rear分别为队首和队尾指针,则插入一个结点的操作为( B )。

A)front=front->next; B) rear=rear->next;C) rear=front->next; D) front=rear->next ;6、设给定问题的规模为变量n,解决该问题的算法所需时间为Tn=O(f(n)),Tn表示式中记号O表示( A )。

A)一个数量级别B)一个平均值C)一个最大值 D)一个均方值7、串的逻辑结构与( D )的逻辑结构不同。

A)线性表 B)栈C)队列 D)树8、采用链结构存储线性表时,其地址( B )。

A)必须是连续的 B)连续不连续都可以C)部分地址必须是连续 D)必须是不连续的9、下列各种数据结构中属于线性结构的有( A )。

A)栈 B) 二叉树C) 广义表 D) 图10、数据结构研究的内容是( D )。

广州大学松田学院2数据结构复习题-线性表-参考答案

广州大学松田学院2数据结构复习题-线性表-参考答案

2数据结构复习题(线性表)一.判断题(下列各题,正确的请在前面的括号内打√;错误的打╳)(×)(1)线性表的链式存储结构优于顺序存储。

(×)(2)链表的每个结点都恰好包含一个指针域。

(√)(3)在线性表的链式存储结构中,逻辑上相邻的两个元素在物理位置上并不一定紧邻。

(×)(4)顺序存储方式的优点是存储密度大,插入、删除效率高。

(×)(5)线性链表的删除算法简单,因为当删除链中某个结点后,计算机会自动地将后续的各个单元向前移动。

(×)(6)顺序表的每个结点只能是一个简单类型,而链表的每个结点可以是一个复杂类型。

(√)(7)线性表链式存储的特点是可以用一组任意的存储单元存储表中的数据元素。

(√)(8)线性表采用顺序存储,必须占用一片连续的存储单元。

(×)(9)顺序表结构适宜于进行顺序存取,而链表适宜于进行随机存取。

(ㄨ)(10)插入和删除操作是数据结构中最基本的两种操作,所以这两种操作在数组中也经常使用。

二.填空题(1)顺序表中逻辑上相邻的元素在物理位置上必须相连。

(2)线性表中结点的集合是有限的,结点间的关系是一对一关系。

(3)顺序表相对于链表的优点是:节省存储和随机存取。

(4)链表相对于顺序表的优点是:插入、删除方便。

(5)采用顺序存储结构的线性表叫顺序表。

(6)(7)链表相对于顺序表的优点是插入、删除方便;缺点是存储密度(8)在双链表中要删除已知结点*P(9)在单链表中要在已知结点*P之前插入一个新结点,需找到*P的直接前趋结点的地址,其查找的时间复杂度为 O(n) 。

(10)单链表中需知道头指针才能遍历整个链表。

(11)性表中第一个结点没有直接前趋,称为开始结点。

(12)在一个长度为n的顺序表中删除第i个元素,要移动n-i 个元素。

(13)在一个长度为n的顺序表中,如果要在第i个元素前插入一个元素,要后移n- i +1 个元素。

(14)在无头结点的单链表中,第一个结点的地址存放在头指针中,而其它结点的存储地址存放在前趋结点的指针域中。

数据结构复习数组和广义表

数据结构复习数组和广义表
将一个a100100的三对角矩阵以行主序存入一维数组b298中元素a6564在b数组中的位置k等3稀疏矩阵的存储方式三元组法矩阵a中有非零元个数s远远小于矩阵元素的总数则称a为稀疏矩阵
数据结构复习 (数组和广义表)
第5章 数组和广义表
一、数组 1、数组的顺序存储方式和地址计算方法 数组的存储方式有:
(1)对称矩阵和上(或下)三角矩阵的压缩存储。 例:下三角矩阵的存储,按行主序方式。 k=i(i+1)/2+j 当i>=j时 k= 0 当i<j时 a[i][j] 在一维数组s[k] 中(i>=j)或为0(i<j)。 (2)对角矩阵 例:以三对角矩阵为例,按行主序方式存储, 仅存储非零部分。 将一个a[100][100]的三对角矩阵以行主序存入一 维数组B[298]中,元素a[65][64]在B数组中的位置k等 于 。
3、稀疏矩阵的存储方式 ——三元组法 矩阵A中有非零元个数s远远小于矩阵元素的 i j v 总数,则称A为稀疏矩阵。
1 2 3 1 6 3 12 9 -3 14 24
M=
0 12 9 0 0 0 0 0 0 000 -3 0 0 0 0 14 0 0 24 1、广义表的定义
广义表 ls=(d1,d2,……,dn)。其中每个元素可以是原子, 也可以是子表。 称d1为表头,d2,……,dn为表尾。 n: 表示广义表的长度,括号层数表示广义表的深度。
2、广义表与线性表的区别
线性表(a1,a2,……,an)中每个元素都具有相同的类型, 有两种存储结构:顺序表和链表。 广义表(d1,d2,……,dn)中每个元素可以是原子,也可以 是子表。可以将广义表看作是线性表的推广。由于原子和子 表的类型不同,所以只能用链式存储结构。

数据结构1800试题-第5章 数组和广义表 - 答案

数据结构1800试题-第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。

数据结构 数组与广义表练习

数据结构 数组与广义表练习

1.多维数组之所以有行优先顺序和列优先顺序两种存储方式是因为( )A .数组的元素处在行和列两个关系中B .数组的元素必须从左到右顺序排列C .数组的元素之间存在次序关系D .数组是多维结构,内存是一维结构 2.从广义表LS =((p, q), r, s )中分解出原子q 的运算是( ) A .tail (head (LS))B .head (tail (head (LS)))C .head (tail (LS))D .tail (tail (head (LS)))3.二维数组A [12][18]采用列优先的存储方法,若每个元素各占3个存储单元,且第1个元素的地址为150,则元素A [9][7]的地址为( )A. 429B. 432C. 435D. 4384.二维数组A [10][20]采用按行为主序的存储方式,每个元素占4个存储单元,若A [0][0]的存储地址为300,则A [10][10]的地址为( )A.700B.1120C.1180D.11405.假设以行优先顺序存储三维数组R[6][9][6],其中元素R[0][0][0]的地址为2100,且每个元素占4个存储单元,则存储地址为2836的元素是( )A .R[3][3][3]B .R[3][3][4]C .R[4][3][5]D .R[4][3][4]6.二维数组A[8][9]按行优先顺序存储,若数组元素A[2][3]的存储地址为1087,A[4][7]的存储地址为1153,则数组元素A[6][7]的存储地址为( )A .1207B .1209C .1211D .12137.对广义表L=((a,b),(c,d),(e,f))执行操作tail(tail(L))的结果是( )A. (e,f)B. ((e,f))C. (f)D. ( )8.设有二维数组A [n ][n ]表示如下:⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡ 653421, 则A [i ][i ](0≤i ≤n-1)的值为( )A .i*(i-1)/2B.i*(i+1)/2C.(i+2)*(i+1)/2D.i 2/2 9.对广义表L=((a,b),((c,d),(e,f)))执行head(tail(head(tail(L))))操作的结果是( )A .dB .eC .(e)D .(e,f )10.假设按行优先顺序将一个20阶的三对角矩阵A 压缩存储在一维数组Q 中,其中Q[0]存放矩阵的第1个元素a 1,1,那么矩阵元素a 3,4在Q 中的存储位置k=_______。

数据结构第4章作业参考答案

数据结构第4章作业参考答案

第4章(数组和广义表)作业参考答案一、单项选择题1.将一个A[1..100,1..100]的三对角矩阵,按行优先压缩存储到一维数组B[1‥298]中,A 中元素A[66][65]在B数组中的位置K为(C )。

A. 198B. 197C. 195D. 1962.广义表(a,(b,c),d,e)的表头为( A )。

A. aB. a,(b,c)C. (a,(b,c))D. (a)3.在三对角矩阵中,非零元素的行标i和列标j的关系是( A )。

A. |i-j|≤1B. i>jC. i==jD. i<j4.广义表L=(a,(b,c)),进行Tail(L)操作后的结果为( D )。

A. cB. b,cC.(b,c)D.((b,c))5.设二维数组A[1..m,1..n](即m行n列)按行存储在数组B[1..m*n]中,则二维数组元素A[i,j]在一维数组B中的下标为( D )。

A. j*m+i-1B. (i-1)*n+j-1C. i*(j-1)D. (i-1)*n+j6.广义表(( ),( ),( ))的深度为( C )。

A. 0B. 1C. 2D. 37.假设以行序为主序存储二维数组A[0..99,0..99],设每个数据元素占2个存储单元,基地址为10,则LOC(A[4][4])=( C )。

A. 1020B. 1010C. 818D. 8088.已知广义表A=((a,b),(c,d)),则head(A)等于( A )。

A. (a,b)B. ((a,b))C. a,bD. a9.已知一个稀疏矩阵的三元组表如下:(1,2,3),(1,6,1),(3,1,5),(3,2,-1),(4,5,4),(5,1,-3)则其转置矩阵的三元组表中第3个三元组为( C )。

A. (2,3,-1)B. (3,1,5)C. (2,1,3)D. (3,2,-1)10.广义表((b,c),d,e)的表尾为( C )。

完整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分析:层序遍历的问题,一般都是借助队列来完成的,每次从队头取出一个元素的同时把它下一层的孩子插入队尾.这是层序遍历的基本思想.。

数据结构广义表

数据结构广义表

{ printf("("); /*输出'('*/
if (g->val.sublist==NULL) printf(""); /*输出空子表*/
else DispGL(g->val.sublist); /*递归输出子表*/
}
else printf("%c", g->val.data); /*为原子时输出元素值*/
假如把每个表旳名字(若有旳话)写在其表旳前面,则 上面旳5个广义表可相应地体现如下:
A()
B(e)
C(a,(b,c,d))
D(A(),B(e),C(a,(b,c,d)))
E((a,(a,b),((a,b),c)))
若用圆圈和方框分别体现表和单元素,并用线段把表 和它旳元素(元素结点应在其表结点旳下方)连接起来,则 可得到一种广义表旳图形体现。例如,上面五个广义表 旳图形体现如下图所示。
A() B(e) C(a,(b,c,d)) D(A(),B(e),C(a,(b,c,d))) E((a,(a,b),((a,b),c)))
AB e
C A
a b cd
D BC
ea b cd
E
a
ab
c
ab
8.2 广义表旳存储构造
广义表是一种递归旳数据构造,所以极 难为每个广义表分配固定大小旳存储空间,所
GLNode *CreatGL(char *&s)
{ GLNode *h;char ch=*s++; /*取一种扫描字符*/
if (ch!='\0')
/*串未结束判断*/
{ h=(GLNode *)malloc(sizeof(GLNode));/*创建新结点*/

数据结构考试试题库含答案解析

数据结构考试试题库含答案解析

数据结构习题集含答案目录目录 (1)选择题 (2)第一章绪论 (2)第二章线性表 (4)第三章栈和队列 (6)第四章串 (7)第五章数组和广义表 (8)第六章树和二叉树 (8)第七章图 (11)第八章查找 (13)第九章排序 (14)简答题 (19)第一章绪论 (19)第二章线性表 (24)第三章栈和队列 (26)第四章串 (28)第五章数组和广义表 (29)第六章树和二叉树 (31)第七章图 (36)第八章查找 (38)第九章排序 (39)编程题 (41)第一章绪论 (41)第二章线性表 (41)第三章栈和队列 (52)第四章串 (52)第五章数组和广义表 (52)第六章树和二叉树 (52)第七章图 (52)第八章查找 (52)第九章排序 (57)选择题第一章绪论1.数据结构这门学科是针对什么问题而产生的?(A )A、针对非数值计算的程序设计问题B、针对数值计算的程序设计问题C、数值计算与非数值计算的问题都针对D、两者都不针对2.数据结构这门学科的研究内容下面选项最准确的是(D )A、研究数据对象和数据之间的关系B、研究数据对象C、研究数据对象和数据的操作D、研究数据对象、数据之间的关系和操作3.某班级的学生成绩表中查得张三同学的各科成绩记录,其中数据结构考了90分,那么下面关于数据对象、数据元素、数据项描述正确的是(C )A、某班级的学生成绩表是数据元素,90分是数据项B、某班级的学生成绩表是数据对象,90分是数据元素C、某班级的学生成绩表是数据对象,90分是数据项D、某班级的学生成绩表是数据元素,90分是数据元素4.*数据结构是指(A )。

A、数据元素的组织形式B、数据类型C、数据存储结构D、数据定义5.数据在计算机存储器内表示时,物理地址与逻辑地址不相同,称之为(C )。

A、存储结构B、逻辑结构C、链式存储结构D、顺序存储结构6.算法分析的目的是(C )A、找出数据的合理性B、研究算法中的输入和输出关系C、分析算法效率以求改进D、分析算法的易懂性和文档型性7.算法分析的主要方法(A )。

广州大学松田学院6数据结构复习题-广义表-参考答案

广州大学松田学院6数据结构复习题-广义表-参考答案

6数据结构复习题(广义表)一.判断题(下列各题,正确的请在前面的括号内打√;错误的打╳)(√)(1)n维的多维数组可以视为n-1维数组元素组成的线性结构。

(√)(2)稀疏矩阵中非零元素的个数远小于矩阵元素的总数。

(ㄨ)(3)上三角矩阵主对角线以上(不包括主对角线中的元素),均为常数C。

(√)(4)数组元素可以由若干个数据项组成。

(√)(5)数组的三元组表存储是对稀疏矩阵的压缩存储。

(ㄨ)(6)任何矩阵都可以进行压缩存储。

(ㄨ)(7)广义表是线性表的推广,所以广义表也是线性表。

(ㄨ)(8)广义表LS=(a0,a1,……a n-1),则a n-1是其表尾。

(√)(9)广义表((a,b),a,b)的表头和表尾是相等的。

(√)(10)一个广义表的表尾总是一个广义表。

二.填空题(1)多维数组的顺序存储方式有按行优先顺序存储和按列优先顺序存储两种。

(2)在多维数组中,数据元素的存放地址可以直接通过地址计算公式算出,所以多维数组是一种随机存取结构。

(3)在n维数组中的每一个元素最多可以有n 个直接前驱。

(4)输出二维数组A[n][m]中所有元素值的时间复杂度为O(n*m) 。

(5)数组元素a[0..2][0..3]的实际地址上2000,元素长度是4,则LOC[1,2]= 2024 。

LOC[1,2]=2000+(1*4+2)*4(6)稀疏矩阵的三元组有 3 列。

(7)稀疏矩阵的三元组中第1列存储的是数组中非零元素所在的行数。

(8)n阶对称矩阵,如果只存储下三角元素,只需要n(n-1)/2 个存储单元。

(9)稀疏矩阵A如下图所示,其非零元素存于三元组表中,三元组(4,1,5)按列优先顺序存储在三元组表的第 4 项。

A=稀疏矩阵A(10)稀疏疏矩阵的压缩存储方法通常有三元组表和十字链表两种。

(11)任何一个非空广义表的表尾必定是广义表(或子表)。

(12)tail(head((a,b),(c,d))= b 。

(13)设广义表((a,b,c)),则将c分离出来的运算是head(tail(tail(head(L)))) 。

数据结构答案-第6章-多维数组和广义表学习指导

数据结构答案-第6章-多维数组和广义表学习指导

数据结构答案-第6章-多维数组和广义表学习指导本页仅作为文档封面,使用时可以删除This document is for reference only-rar21year.March第6章多维数组和广义表知识点分析1.多维数组概念多维数组是向量的推广,对于二维数组A m×n既可以看成m行向量组成的向量,也可以看成n行向量组成的向量。

多维数组在计算机中有两种存储形式:按行优先顺序存储和按列优先顺序存储。

2.多维数组的存储二维数组a ij的地址为:LOC(a ij) = LOC(a00) + ( i×n + j ) × d (0下标起始的语言)三维数组a ijk的地址为:LOC(a ijk)=LOC(a000)+( (i×n×p+ j×p +k) ×d (0下标起始的语言)d为每个数据元素占有的字节数。

3.特殊矩阵在矩阵中非零元素或零元素的分布有一定规律的矩阵称为特殊矩阵,如三角矩阵、对称矩阵、稀疏矩阵等。

当矩阵的阶数很大时,用普通的二维数组存储这些特殊矩阵将会占用很多的存储单元。

从节约存储空间的角度考虑,以下特殊矩阵的存储方法。

(1)对称矩阵对称矩阵是一种特殊矩阵,n阶方阵的元素满足性质:a ij=a ji(0≤i , j≤n-1)。

对称矩阵是关于主对角线的对称,因此只需存储上三角或下三角部分的数据即可。

(2)三角矩阵三角矩阵的特殊性是以主对角线划分矩阵。

下三角矩阵,主对角线以上均为同一个常数;上三角矩阵,主对角线以下均为同一个常数,可以采用压缩存储。

(3)稀疏矩阵在m*n的矩阵中有t个非零元素,且t远小于m×n,这样的矩阵称稀疏矩阵。

为了节约存储空间,稀疏矩阵中零元素无需存储,只需存储矩阵中的非零元素。

稀疏矩阵常用的有:三元组表存储、带行指针的链表存储、十字链表存储等存储方法。

4.广义表广义表是n(n≥0)个数据元素的有序序列,广义表的元素可以是单元素,也可以是一个广义表。

数据结构-数组和广义表作业解答

数据结构-数组和广义表作业解答

数组和广义表 作业4 单项选择题1.有一矩阵为A[-3:1,2:6],每个元素占一个存储单元,存储的首地址为100,以行序为主,则元素a -1,4的地址为( )。

A )111B )112C )113D )125【分析】对于二维数组A[c 1:d 1,c 2:d 2],设每个元素占用l 个存储单元,LOC(c 1,c 2)是第一个元素a c 1,c 2的存储位置,则按行存放时,a ij 的存储位置如下: LOC(i,j)=LOC(c 1,c 2)+[(d 2-c 2+1)(i-c 1)+(j-c 2)]l对于本题,c 1=-3,c 2=2,d 1=1,d 2=6,l =1,LOC(c 1,c 2)=100,所以元素a -1,4的地址为:LOC(-1,4)=100+[(6-2+1)*(-1-(-3))+(4-2)]*1=112。

【答案:B 】2.一n ×n 的三角矩阵A=[a ij ]如下:⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡nn n n a a a a a a22211211 将三角矩阵中元素a ij (i ≤j)按行序为主序的顺序存储在一维数组B[1..n(n+1)/2]中,则a ij 在B 中的位置是( )。

A )(i-1)(2n+i)/2+i-j+1B )(i-1)(2n-i+2)/2+j-i+1C )(i-1)(2n-i)/2+j-iD )(i-1)(2n-i+2)/2+j-i 【分析】存储位置=n+(n-1)+…+(n -i+2)+i-j+1=(i-1)(2n-i+2)/2+j-i+1。

【答案:B 】3.广义表((a,b),(c,d))的表尾是( )。

(四川大学计算机学院2004年试题)A )(c,d)B )((c,d))C )(d)D )d【分析】广义表((a,b),(c,d))可看成是(d1,d2)所组成,其中d1=(a,b),d2=(c,d),所以表尾为(d2)=((c,d))。

【答案:B 】4.若广义表A 满足Head(A)==Tail(A),则A 为( )。

数据结构习题答案

数据结构习题答案

习题1一、单项选择题1.数据结构是指()。

A.数据元素的组织形式B.数据类型C.数据存储结构D.数据定义2.数据在计算机存储器内表示时,物理地址与逻辑地址不相同的,称之为()。

A.存储结构B.逻辑结构C.链式存储结构D.顺序存储结构3.树形结构是数据元素之间存在一种()。

A.一对一关系B.多对多关系C.多对一关系D.一对多关系4.设语句x++的时间是单位时间,则以下语句的时间复杂度为()。

for(i=1; i<=n; i++)for(j=i; j<=n; j++)x++;A.O(1)B.O(2n)C.O(n)D.O(3n)5.算法分析的目的是(1),算法分析的两个主要方面是(2)。

(1) A.找出数据结构的合理性 B.研究算法中的输入和输出关系C.分析算法的效率以求改进D.分析算法的易懂性和文档性(2) A.空间复杂度和时间复杂度 B.正确性和简明性C.可读性和文档性D.数据复杂性和程序复杂性6.计算机算法指的是(1),它具备输入,输出和(2)等五个特性。

(1) A.计算方法 B.排序方法C.解决问题的有限运算序列D.调度方法(2) A.可行性,可移植性和可扩充性 B.可行性,确定性和有穷性C.确定性,有穷性和稳定性D.易读性,稳定性和安全性7.数据在计算机内有链式和顺序两种存储方式,在存储空间使用的灵活性上,链式存储比顺序存储要()。

A.低B.高C.相同D.不好说8.数据结构作为一门独立的课程出现是在()年。

A.1946B.1953C.1964D.19689.数据结构只是研究数据的逻辑结构和物理结构,这种观点()。

A.正确B.错误C.前半句对,后半句错D.前半句错,后半句对10.计算机内部数据处理的基本单位是()。

A.数据B.数据元素C.数据项D.数据库二、填空题1.数据结构按逻辑结构可分为两大类,分别是______________和_________________。

2.数据的逻辑结构有四种基本形态,分别是________________、__________________、__________________和__________________。

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

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

数据结构第五章数组和广义表练习及答案一、选择题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)。

数据结构广义表实验例题

数据结构广义表实验例题

选择题在广义表((a, b), (c, (d, e)))中,元素'd'的深度是?A. 1B. 2C. 3(正确答案)D. 4下列哪个广义表表示的是空广义表?A. (())B. ()(正确答案)C. (a, ())D. ((), a)广义表((1, 2), 3, (4, (5, 6)))的长度是?A. 2B. 3(正确答案)C. 4D. 5在广义表(a, (b, c), (d, (e, f)))中,元素'c'的广度位置是?A. 1B. 2C. 3(正确答案)D. 4下列哪个选项不是广义表的基本操作?A. 求广义表的长度B. 求广义表的深度C. 广义表的合并(正确答案)D. 取广义表的元素广义表((), (a), (b, c))中,第一个非空子表的元素是?A. a(正确答案)B. bC. cD. 空集在广义表((x, y), z, (w, (u, v)))中,元素'v'的父元素是?A. wB. (u, v)(正确答案)C. (w, (u, v))D. ((x, y), z, (w, (u, v)))下列哪个广义表与广义表(a, (b, (c, d)))不等价?A. (a, (b, c, d))B. (a, b, (c, d))C. (a, (b, (c, (d))))(正确答案)D. (a, (b, (c d)))若广义表L=((1), (2, 3), (4, (5, 6))),则L的第二个元素的第一个子元素是?A. 1B. 2(正确答案)C. 3D. 4。

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

6数据结构复习题(广义表)一.判断题(下列各题,正确的请在前面的括号内打√;错误的打╳)(√)(1)n维的多维数组可以视为n-1维数组元素组成的线性结构。

(√)(2)稀疏矩阵中非零元素的个数远小于矩阵元素的总数。

(ㄨ)(3)上三角矩阵主对角线以上(不包括主对角线中的元素),均为常数C。

(√)(4)数组元素可以由若干个数据项组成。

(√)(5)数组的三元组表存储是对稀疏矩阵的压缩存储。

(ㄨ)(6)任何矩阵都可以进行压缩存储。

(ㄨ)(7)广义表是线性表的推广,所以广义表也是线性表。

(ㄨ)(8)广义表LS=(a0,a1,……a n-1),则a n-1是其表尾。

(√)(9)广义表((a,b),a,b)的表头和表尾是相等的。

(√)(10)一个广义表的表尾总是一个广义表。

二.填空题(1)多维数组的顺序存储方式有按行优先顺序存储和按列优先顺序存储两种。

(2)在多维数组中,数据元素的存放地址可以直接通过地址计算公式算出,所以多维数组是一种随机存取结构。

(3)在n维数组中的每一个元素最多可以有 n 个直接前驱。

(4)输出二维数组A[n][m]中所有元素值的时间复杂度为O(n*m) 。

(5)数组元素a[0..2][0..3]的实际地址上2000,元素长度是4,则LOC[1,2]= 2024 。

LOC[1,2]=2000+(1*4+2)*4(6)稀疏矩阵的三元组有 3 列。

(7)稀疏矩阵的三元组中第1列存储的是数组中非零元素所在的行数。

(8)n阶对称矩阵,如果只存储下三角元素,只需要 n(n-1)/2 个存储单元。

(9)稀疏矩阵A如下图所示,其非零元素存于三元组表中,三元组(4,1,5)按列优先顺序存储在三元组表的第 4 项。

A=稀疏矩阵A(10)稀疏疏矩阵的压缩存储方法通常有三元组表和十字链表两种。

(11)任何一个非空广义表的表尾必定是广义表(或子表)。

(12)tail(head((a,b),(c,d))= b 。

(13)设广义表((a,b,c)),则将c分离出来的运算是 head(tail(tail(head(L)))) 。

(14)广义表((a,b),c,d),表尾是(c,d)。

(15) n阶下三角矩阵,因为对角线的上方是同一个常数,需要 n(n-1)/2+1 个存储单元。

(16)稀疏矩阵中有n个非零元素,则三元组有n 行。

(17)广义表LS=(a,(b),((c,(d))))的长度是 3 。

(18)广义表LS=(a,(b),((c,(d))))的深度是 4 。

(19)广义表L=((),L),则L的深度是∞。

(20)广义表LS=(a,(b),((c,(d))))的表尾是 ((b),((c,(d)))) 。

三.选择题(1)在一个m维数组中,( D )恰好有m个直接前驱和m个直接界后继。

A.开始结点B.总终端结点C.边界结点D.内部结点(2)对下述矩阵进行压缩存储后,失去随机存取功能是( D )。

A.对称矩阵 B.三角矩阵C.三对角矩阵 D.稀疏矩阵(3)在按行优先顺序存储的三元组表中,下述陈述错误的是( D )。

A.同一行的非零元,是按列号递增次序存储的B.同一列的非零元,是按行号递增次序存储的C.三元组表中三元组行号递增的D.三元组表中三元组列号递增的(4)对稀疏矩阵进行压缩存储是为了( B )。

A.降低运算时间 B.节约存储空间C.便于矩阵运算 D.便于输入和输出(5)若数组A[0..m][0..n]按列优先顺序存储,则aij的地址为( A )。

A.LOC(a00)+[j*m+i] B.LOC(a00)+[j*n+i]C.LOC(a00)+[(j-1)*n+i-1] D.LOC(a00)+[(j-1)*m+i-1](6)下列矩阵是一个( B )A.对称矩阵 B.三角矩阵C.稀疏矩阵 D.带状矩阵(7)在稀疏矩阵的三元组表示法中,每个三元组表示( D )。

A.矩阵中非零元素的值B.矩阵中数据元素的行号和列号C.矩阵中数据元素的行号、列号和值D.矩阵中非零数据元素的行号、列号和值(8)已知二维数组A[6][10],每个数组元素占4个存储单元,若按行优先顺序存放数组元素a[3][5]的存储地址是1000,则a[0][0]的存储地址是( B )。

A.872 B.860 C.868 D.8641000=B+(3*10+5)*4 B=1000-(3*10+5)*4=1000-140=860(9)广义表是线性表的推广,它们之间的区别在于( A )。

A.能否使用子表 B.能否使用原子项C.是否能为空 D.表的长度(10)下列广义表属于线性表的是( B )。

A.E=(a,E) B.E=(a,b,c)C.E=(a,(b,c)) D.E=(a,L);L=()(11)广义表((a,b),c,d)的表尾是( D )。

A.a B.d C.(a,b) D.(c,d)(12)广义表A=((x,(a,b)),(x,(a,b),y)),则运算head(head(tail(A)))为( A )。

A.x B.(a,b) C.(x,(a,b)) D.A(13)tail(head((a,b),c,(c,d)))的结果是( B )。

A.b B.(b) C.(a,b) D.(d)(14)若广义表满足head(L)=tail(L),则L的形式是( B )A.空表 B.若L=(a1,…,a n),则a1=(a2,…a n) C.若L=(a1,…,a n),则a1=a2=…=a n) D.((a1),(a1))(15)数组是一个( B )线性表结构。

A.非 B.推广了的C.加了限制的 D.不加限制的(16)数组A[0:1,0:1,0:1]共有( D )元素。

A.4 B.5 C.6 D.8(17)广义表((a,b),c,d)的表头是( C )。

A.a B.d C.(a,b) D.(c,d)(18)广义表A=(a),则表尾为( C )。

A.a B.(()) C.空表D.(a)(19)以下( C )是稀疏矩阵的压缩存储方法。

A.一维数组 B.二维数组C.三元组表 D.广义表(20)设广义表D=(a,b,c,D), 其深度为( D )。

A.2 B.3 C.4 D.∞四.算法阅读题1.已知A[]是一个下三角矩阵,下述算法的功能是什么?int f1(int A[],int n){ // 设B[0..(n+1)n/2-1]存放下三角元素int i,k,s=0;k=0;s=A[0];for (i=0;i<n-1;i++){ k=k+i+2;s=s+A[k];}return s;}算法功能:求矩阵主对角线上元素之和。

分析:注意k的变化依次为:0,2,5,9,14,正好是a ii在A中的存储位置。

在循环中k 每次增加i+2。

第i行主对角线上的元素a ii,其在A中的位置为:i(i+1)/2+i; (1)第i+1行主对角线上的元素a i+1 i+1,其在A中的位置为:(i+1)(i+2)/2+(i+1), (2)(2)-(1)得i-2。

2.在按行优先顺序存储的三元组表中,求某列非零元素之和的算法如下,填空以完成算法。

#define SMAX 100 // 定义一个足够大的三元组表typedef struct{int i,j,v; // 非零元素的行、列、值}SPNode; // 三元组类型typedef struct // 定义稀疏矩阵{ int m,n,t; // 矩阵的行、列及非零元素的个数 SPNode data[SMAX]; // 三元组表}SPMatrix; // 三元组表的存储类型if f2(SPNode *a,col){ // 求第col列非零元素之和int k,sum=0;if ( ① a->t<=0 )printf(“a<=0”);if ( ② col<0 || col >=a->n )printf(“列错!”);for (③ k=0 ; k<a->t ; ④ k++ )if (a->tada[k].j==n)sum= ⑤ sum + a->data[k].v ;return sum;}五.编程题1.试编写求一个三元组表的稀疏矩阵对角线元素之和的算法。

#include "stdio.h"#define ERROR –99999typedef struct{ int row;int col;int data;}Triple;int MDSum(Triple *a){ int i;int sum=0;if (a[0].row!=a[0].col)return ERROR;for (i=1;i<=a[0].data;i++){ if (a[i].row==a[i].col)sum+=a[i].data;}return sum;}2.试编写求广义表中原子元素个数的算法。

解:设j 为原子个数,则求广义表中原子元素个数的算法可递归定义如下:LS 为空表尾原子元素个数+1LS 非空且表头为原子元素表头子表原子元素个数+表尾原子元素个数+1LS 非空且表头子表int atomnum(Gnode *head) {if (head==NULL) return 0; if (head->tag==0)return(atomnum(head->next)+1); elsereturn(atomnum(head->next)+atomnum(head->val.sublist)); }3.试编写求广义表最大中原子元素个数的算法。

int maxele(Gnode *head) {int m=0,a; while(head) {if (head->tag==1){ a=maxele(head->val.sublist); if (a>m) m=a; } elseif (head->val.data>m) m=head->val.data; head=head->next; }return m; }j=【例7】在按行存储的三元组表中,求某列(col)的非零元素之和的算法如下,请填空以完成算法。

#define SMAX 100 // 定义一个足够大的三元组表struct SPNode // 定义三元组{int i,j,v; // 三元组非零元素的行、列和值};struct sparmatrix // 定义稀疏矩阵{int row,col,terms; // 稀疏矩阵行、列和非零元素的个数S PNode data[SMAX]; // 三元组表}TTT;int f2 (TTT *a, col) // 求第col列非零元素之和{ int i,sum=0;if ( ①)Error(“非零元素的个数是不大于0”);if ( ②)Error(“列号不合法”);for( ③; ④; k++ )if (a->data[k].j==col)sum+= ⑤;}return sum;}分析:本算法首先检查非零元素的个数是否大于0,以及给定的列号是否合法。

相关文档
最新文档