PAGE PAGE 8 Ch2数组	(共23题,其中14道算法设计题) 一、填空题 1、填空题 (每小空1分,共5分) 一维数组的逻辑结构是( ① ),存储结构是( ② )。对于二维数组,有( ③ )和( ④ )两种不同的存储方式。对于一个二维数组A[m][n],若采取按行存储的方式,则任一数组元素A[i][j]相对于A[0][0]的地址为( ⑤ )。 Key:	① 线性结构	② 顺序存储表示	③ 行优先顺序	④ 列优先顺序	⑤ n * i + j 二、判断题 2、判断下列叙述的对错。如果正确,在题前的括号内填入“?”,否则填入“?”。 (?) 线性表的逻辑顺序与物理顺序总是一致的。 (?) 线性表的顺序存储表示优于链式存储表示。 (?) 线性表若采用链式存储表示时所有存储单元的地址可连续可不连续。 (?) 二维数组是其数组元素为线性表的线性表。 (?) 每种数据结构都应具备三种基本运算:插入、删除和搜索。 三、简答题 3、顺序表的插入和删除要求仍然保持各个元素原来的次序。设在等概率情形下, 对有127个元素的顺序表进行插入, 平均需要移动多少个元素? 删除一个元素, 又平均需要移动多少个元素?	Key:	插入时平均移动元素个数AMN = ,	所以平均移动	63.5	个元素	删除时平均移动元素个数AMN = ,	所以平均移动	63	个元素 4、设有一个10?10的对称矩阵A[10][10],采取按行压缩存储的方式存放于一个一维数组B[ ]中,则数组B[ ]的容量应有多大?若设A[0][0]为第一个元素,存放于B[0],且数组A[ ][ ]的每一个数组元素在数组B[ ]中占一个数组元素位置,则A[8][5]在数组B[ ]中的地址是多少? Key:	1)数组B共应有 = 55个元素。	2)对于上三角矩阵,A[8][5] = A[5][8] =	= 43	对于下三角矩阵,A[8][5] =	= 41 5、设有三对角矩阵A[n][n],将其三条对角线中的元素逐行存储到一维数组B[3n-2 ]中,使得B[k] = A[i][j]。试求: (1) 用i, j表示k的地址转换公式; (2) 用k表示i, j的地址转换公式; Key:	1)在一维数组B中A[i][j]在第i行,它前面有3*i-1个非零元素,在本行第j列前面有j-i+1个,所以元素A[i][j]在B中的位置为k=2*i + j。	2)	i = ???k+1)/3	j=	k-2*i 6、上三角矩阵A[n][n],将其上三角元素逐行存储到一维数组B[m]中,使得B[k] = A[i][j],且k = f1 (i) + f2 (j) + C。试推导出函数f1 (i)、f2 (j)和常数C,要求f1 (i)和f2 (j)中不包含常数项。 Key:	若i≤j,数组元素在数组B中的存放位置为n+(n-1)+……+(n-i+1)+j-i	即为:,……	若i>j,数组元素A[i][j]在矩阵的下三角部分,在数组B中没有存放,因此找它们的对称元素A[j][i],即,…… 7、设有一个二维数组A[m][n],假设A[0][0]存放位置在644(10),A[2][2]存放位置在676(10),每个元素占一个空间,问A[4][4]在什么位置,下标(10)表示用10进数表示。 8、设A和B均为下三角矩阵,每一个都有n行。因此在下三角区域中各有n(n+1)/2个元素。另设有一个二维数组C,它有n行n+1列。试设计一个方案,将两个矩阵A和B中的下三角区域元素存放于同一个C中。要求将A的下三角区域中的元素存放于C的下三角区域中,B的下三角区域中的元素转置后存放于C的上三角区域中。并给出计算A的矩阵元素aij和B的矩阵元素bij在C中的存放位置下标的公式。 9、设带状矩阵A[n][n] 是n?n阶的方阵,其中所有的非零元素都在由主对角线及主对角线上下各b条对角线构成的带状区域内,其它都为零元素。试问:	(1) 该带状矩阵中有多少个非零元素?	(2) 若用一个一维数组B[ ] 按行顺序存放各行的非零元素,且设A[1][1]存放在B[0]中,请给出一个公式,计算任一非零元素aij在一维数组B中的存放位置。 四、算法设计题 10、已知整数数组A[ ]中有n个元素,试设计一个算法,求数组中所有元素值的和。 Key:	int sum_array(array,n)	int array[],n;	{	int i,sum = 0;	for(i=0;i temp)	return array[n-1];	else	return temp;	} } int sum_array(array,n) int *array; int n; {	if(n==1)	return array[0];	else	return (array[n-1]+sum_array(array,n-1)); } float ave_array(array,n) int *array; int n; {	float temp;	if(n==1)	return (float) array[0];	else	return (float) (array[n-1] + ave_array(array,n-1)*(n-1))/n; } 15、若矩阵A[m][n] 中的某一元素A[i][j] 是第i行中的最小值,同时又是第j列中的最大值,则称此元素为该矩阵的一个鞍点。假设以二维数组存放矩阵,试编写一个函数,确定鞍点在数组中的位置(若鞍点存在时),并分析该函数的时间复杂度。 16、已知一个顺序表中的元素按元素值非递减有序排列,试定义顺序表的存储表示,并编写一个函数,删除表中值相同的多余元素。 17、设有两个整数类型的顺序表A(有 m个元素)和B(有n个元素),其元素均以从小到大的升序排列。试编写一个函数,将这两个顺序表合并成一个顺序表C,要求C的元素也以从小到大的升序排列。(见题库ch1 六(2)) 18、试编写一个函数计算n!*2n的值,其结果存放于数组A[arraySize] 的第n个数组元素中,0≤n maxInt时,应按出错处理。一种出错处理方式是在算法实现时用返回整数函数值0, 1来区别是正常返回还是错误返回。试利用这种方式来实现函数。 19、试编写一个函数,将一个有n个非零元素的整数一维数组A[n] 拆分为两个一维数组,使得A[ ] 中大于零的元素存放在B[ ] 中,小于零的元素存放在C[ ] 中。 20、设定整数数组B[m+1][n+1]的数据在行、列方向上都按从小到大的顺序排序,且整型变量x中的数据在B中存在。试设计一个算法,找出一对满足B[i][j] == x的i, j值。要求比较次数不超过m+n。 21、已知在一维数组A[m+n] 中依次存放着两个顺序表 (a1, a2, ?, am) 和(b1, b2, ?, bn)。试编写一个函数,将数组中两个顺序表的位置互换,即将 (b1, b2, ?, bn) 放在 (a1, a2, ?, am) 的前面。 22、试编写一个函数,以不多于3n/2的平均比较次数,在一个有 n个整数的顺序表A中找出具有最大值和最小值的整数。(见题库ch1 六(2)) 23、设A = (a1, a2, ?, am) 和B = (b1, b2, ?, bn)均为顺序表,A’ 和B’ 分别是除去最大公共前缀后的子表。如A = ( b, e, i, j, i, n, g ),B = ( b, e, i, f, a, n, g ),则两者的最大公共前缀为b, e, i,在两个顺序表中除去最大公共前缀后的子表分别为A’ = ( j, i, n, g ),B’ = ( f, a, n, g )。若A’ = B’ = 空表,则A = B;若A’ = 空表且B’ ? 空表,或两者均不空且A’的第一个元素值小于B’的第一个元素的值,则AB。	试编写一个函数,根据上述方法比较A和B的大小。