数据结构(C语言版)第五章数组和广义表
第五章 数组和广义表 5.2 数组的顺序表示和实现 练习 假设按低下标优先存储整数数组A9*3*5*8,第一个元素的字节地址是100,每个整数占有4字节,问下列元素的存储地址是多少?(若按高下标优先存储呢?) A0000A1111A3125A8247 5.3.1 特殊矩阵 三角矩阵 Type struct OLNode{ int i,j; int e; struct OLNode *right,*down; }OLNode; *OLink;Type struct { OLink *rhead,*chead; int mu,nu,tu; }CrossList; 第五章 作 业 5.1 假设有二维数组A 6?8,每个元素用相邻的6个字节存储,存储器按字节编址。已知A的起始存储位置(基地址)为1000,计算: (1)数组A的体积(即存储量); (2)数组A的最后一个元素a57的第一个字节的地址; (3)按行存储时,元素a14的第一个字节的地址; (4)按列存储时,元素a47的第一个字节的地址。 第五章 作 业 5.10 求下列广义表操作的结果: (1)GetHead( (p, h, w) ); (4) GetTail( ((a ,b) ,(c ,d)) ); (5) GetHead ( GetTail ( ((a,b),(c,d)) ) )。 5.12 按教科书5.5节中图5.8所示结点结构,画出下列广义表的存储结构图,并求它的深度。 (1)( ( ( ) ) , a , ( ( b , c ) , ( ) , d ) , ( ( ( e ) ) ) ) (2 ( ( ( ( a ) , b ) ) , ( ( ( ) , d ) , ( e , f ) ) ) 用常规的二维数组表示时的算法 其时间复杂度为: O(mu×nu) for (col=1; col<=nu; ++col) for (row=1; row<=mu; ++row) T[col][row] = M[row][col]; 将M转置为T 1 2 12 1 3 9 3 1 -3 3 6 14 4 3 24 5 2 18 6 1 15 6 4 -7 i j e 0 1 2 3 4 5 6 7 8 i j e 1 3 -3 1 6 15 2 1 12 2 5 18 3 1 9 3 4 24 4 6 -7 6 3 14 0 1 2 3 4 5 6 7 8 ? a.data b.data 解决思路: 只要做到 ?将矩阵行、列个数互换(mu,nu); ?将每个三元组中的i和j相互调换; ?重排三元组次序,使b.data中元素以行(M的列)为主序 方法一:按a的列序转置(p98) 按b.data中三元组次序依次在a.data中找到相应的三元组进行转置,即按照矩阵a的列序来进行置换。 为找到a中每一列所有非零元素,需对其三元组表a.data从第一行起扫描一遍。由于a.data中以a行序为主序,所以由此得到的恰是b.data中应有的顺序。 1 2 12 1 3 9 3 1 -3 3 6 14 4 3 24 5 2 18 6 1 15 6 4 -7 i j e 0 1 2 3 4 5 6 7 8 a.data 1 3 -3 1 6 15 2 1 12 2 5 18 3 1 9 3 4 24 4 6 -7 6 3 14 i j