第5章 数组和义表.docVIP

  • 3
  • 0
  • 约3.3千字
  • 约 6页
  • 2016-10-08 发布于贵州
  • 举报
第5章 数组和广义表 5.1 数组的定义 这里的数组与C语言中的传统的数组略有不同。在C中,数组的定义: int a[10]; // int n; scanf(%d,n); int b[n]; //想随着变量n的值而变化,错误的。 数组的长度在编译时就必须确定下来,而上面的输入到n中,是在运行时才能有结果。 这种方法的缺陷,长度不好把握,所以在数据结构中,一般是使用指针+malloc函数来实现: int *a; int m; scanf(%d,m); a=(int*)malloc( m*sizeof(int)); //完全正确 5.2 数组的顺序表示和实现 数组一般都采用顺序表示,也就是说,其中的元素都是一个挨一个,他们之间的位置相对固定。因此,可以直接计算出数组中每个元素的地址。其计算方法: 设有一个数组a,其首地址(a[0]的地址)为1000,元素类型为int型(注:此处一个int用2字节),那么a[36]的地址: Addr36=1000+36*2 也正因为如此,数组的存取可以随机存取(所谓随机存取,就是想存取哪个元素就可直接进行存取)。其使用方法有: a[36]=-3; *(a+36)=-3; //速度要比上面的快,上面的在编译后,就是转化为这种方法 对于多维数组,其计算方法也是统一的,以三维为例: int a[100][200][300]; //100页,每页有200行,每行有300列 其首地址(a[0][0][0]的地址)为1000,则a[23][34][45]的地址: Addr a[23][34][45]=1000+(23*200*300+34*300+45)*2 5.3 矩阵的压缩存储 5.3.1 矩阵的基本概念 A称为A4×3矩阵,B称为B3×4,在计算机中,可以用二维数组来存储。 int a[4][3]={{1,0,1},{-1,2,3},{0,0,1},{2,1,-1}}; int c[4][4]={{……},……}; 方阵:就是行数与列数相等的矩阵。 在方阵中,有几个概念: 1)主对角线、副对角线 主对角线:行数与列数相等的那些元素。 2)如何取到每一个元素? for( i=0; i4; i++ ) //i管行 for( j=0; j4; j++ ) //j管列 { c[i][j]=...; } 3)如何取到主对象线的元素? 方法一: for( i=0; i4; i++ ) //i管行 for( j=0; j4; j++ ) //j管列 { if( i==j ) //行与列相等,就是主对角线元素 c[i][j]=...; } 方法二: for( i=0; i4; i++ ) c[i][i]=...; 4)上三角、下三角 行号大于或等于列号的是下三角,行号小于或等于列号的是上三角。 5)如何取到上三角元素? 方法一: for( i=0; i4; i++ ) { for( j=0; j4; j++ ) { if( i=j ) //这是上三角,如果取下三角:if( i=j ) c[i][j]=...; } } 方法二: for( i=0; i4; i++ ) { for( j=i; j4; j++ ) //上三角 c[i][j]=...; } for( i=0; i4; i++ ) { for( j=0; j=i; j++ ) { c[i][j]=...; } } 5.3.2 矩阵的基本运算 1、矩阵的加减: 如果有两个矩阵A3×4,B3×4,构造C3×4,C=A+B for( i=0; i3; i++ ) { for( j=0; j4; j++ ) { c[i][j]=a[i][j]+b[i][j]; } } 2、转置 今有A4×3,要转置为B3×4, for( i=0; i4; i++ ) { for( j=0; j3; j++ ) { b[j][i]=a[i][j]; } } 3、乘法: C=A×B,要求A的列数==B的行数,结果C的行数为A的行数,C的列数为B的列数。如果C=A4×3×B3×4,结果C是4×4 C中的每个元素如C[i][j]元素=A的第i行中的3个元素与B中的第j列的3个元素乘积的和 for( i=0; i4; i++ ) { for( j=0; j4; j++ ) { //计算出c[i][j]的值 c[i][j]=0; for( k=0; k3; k++ ) { c[i][j]+=a[i][k]*b[k][j]; } } } 4、如何将一个二维数组放到一个一维数组中进行存取? int a[4][3]; i

文档评论(0)

1亿VIP精品文档

相关文档