[理学]数据结构chap05.ppt

[理学]数据结构chap05

软件教研室 第五章 数组和广义表 5.1 数组的定义 例1 有声明 int NO[2][4],如果起始地址为1820,则数组NO存放在内存中的情况如何?NO[i][j]的转换函数是什么?地址是什么? 解答:声明 int[2][4] 表示行有2行,列有4列,数据类型长度为2个字节. 转换函数:f(i,j)=i×b2+j =i×4 +j 所以地址 Loc(i,j)=Loc(0,0)+f(i,j)×l =1820+(i×4+j)×2 练习 : (1)若声明 char A[4][5],如果A的起始地址为200010,则A[3][2]的地址是什么? (2)若声明 int B[4][5],如果B的起始地址为200016,则B[2][3]的地址是什么? 例2 有声明 char A[2][3][4],且A的起始地址为1234,则A[0][2][3]的地址是什么?A[i][j][k]的地址是什么? 解答:可把数组想成是一个立方体,共有2×3×4=24个数据元素。 转换函数:f(i,j,k)=b2×b3×i+b3×j+k =3×4×i +4×j+k 所以地址 Loc(0,2,3)=Loc(0,0,0)+f(i,j,k)×l =1234+(3×4×0+4×2+3)×1 =1234+11=1245 A[i][j][k]=Loc(0,0,0)+f(i,j,k)×L =1234+b2×b3×i+b3×j+k 例 3 设计一个数组No[10],在其偶数下标元素中放入1,11,21,31,41,在奇数下标元素中放入0,-10,-20,-30,-40。 数据结构:数组No[10],整数 算法:当下标为0,2,4,6,8时, a[i]=5×i +1 当下标为1,3,5,7,9时: a[i]=0-((i-1)/2×10) 程序如下: #include stdio.h Void main(void) { int No[10],i; for(i=0;i=9;i=i+2) No[i]=5*i+1; for(i=1;i=9;i++) No[i]=0-((i-1)/2*10); For(i=0;i=9;i++) printf(“No[%d]=%d\n”,I,No[i]); } 例4 在一个5×5的数组中,在(0,0),(1,1),(2,2),(3,3),(4,4)的位置分别放入20,21,22,23,24。 程序如下: #include stdio.h Void main(void) { int A[5][5],i,j,pre=0; for(I=0;I5;I++) { for (j=0;j5;j++) { if(I==j) {if(pre==0) A[i][j]=1 else A[i][j]=2*pre; pre=A[i][j];} Else A[i][j]=0; Printf(“[%d][%d]=%3d”,I,j,A[i][j]); Printf(“\n”);}} } } 思考题: 1、试着写一个程序,将所有的正奇数填入索引值为奇数的位置,将所有的负偶数填入索引值为偶数的位置,数组的大小最大为50,数值序列如下:0,1,-2,3,-4,5,-6,…,-48,49。 然后,利用数组的遍历,由最大的索引值开始输出如下: 49,-48,…,-6,5,-4,3,-2,1,0 2、试着写一个程序输入矩阵A= , 矩阵B= ,将矩阵A与矩阵B进行 加法、减法、乘法运算并输出结果。 2、稀疏矩阵的压缩存储方法 3、求转置矩阵 4、十字链表 问题描述:已知一个稀疏矩阵的三元组表,求该矩阵转置矩阵的三元组表。 解决思路: (1)将矩阵行、列维数互换 (2)将每个三元组中的i和j相互调换 (3)重排三元组次序,使mb中元素以T的行(M的列)为主序 6 7 8 1 2 12 1

文档评论(0)

1亿VIP精品文档

相关文档