本文已参与「新人创作礼」活动,一起开启掘金创作之路。
第五章 数组
数组的定义与顺序存储
数组的定义:
数组A为n(n>0)个元素的有穷序列,记作A=(a1,a2,......an)
ai(1<=i=<n)或者全部为相同数据类型的原子项ei(即具体数值);或者全部为具有相同定义的数组Bi。
数组A=(a1,......,an)的维度Dim递归定义为:
C语言:
语法:ElemType arrayName[L1]......[Ln];
语义:第1维长度L1,元素L2......Ln的数组。
数组的顺序存储:
核心问题:数组元素多维结构到一堆内存空间的映射
数组A=(a1,...,an)(n>0)顺序存储方案的递归定义:
递归基础:ai为原子项ei 递归条件:ai为数组Bi C语言:ElemType A [m] [n] (低下标优先存储)
例如:
C,Basic,Pascal等语言,数组元素按照低维下标大小升序排列存放。
A为矩阵时,亦称为按行优先存储。
二维数组A中任一元素a(i,j) 的存储位置:LOC(i,j) = LOC(0,0) + (b2×i+j)×L Loc(i,j)为基地址或基址
Fortran:ElemType A (m,n) (高下标优先存储) Fortran语言,数组元素按照高维下标大小按次序存放。
A为矩阵时,亦称为按列优先存储。
数组的基本操作:
初始化: InitArray(A,bound1,...,boundn)
InitArray(A,low1,up1,...,lown,upn)
销毁: Destory(A)
赋值: SetValue(A,e,index1,...,indexn)
取值: GetValue(A,e,index1,...,indexn)
操作特点:
- 以数组元素的读取和写入为主;
- 一般不在数组中插入和删除数据元素;
- 支持使用下标(元素在各维数组中的位置序号)对数组元素进行随机访问。
小结:
数组特点:
- 数据元素亦为相同结构数组。
- 数据元素宏观为线性关系。
顺序存储方案:
- 可表达数组的递归结构,并体现数据元素之间的关系。
- 实现了数据元素多维关系到一维内存的映射。
- 通过下标可以随机访问数组元素。
普通矩阵的表示和实现:
矩阵的乘法
#include <stdio.h>
#include <stdlib.h>
int main()
{
float A[3][4] = { {2,-3,1,5}, {-1,4,-4,-2}, {2,-3,4,2} };
float B[4][2] = { {4,-1}, {3,2}, {1,-1}, {-2,4} };
float C[3][2] = {0};
int i, j, k;
for (i=0; i<3; i++)
{
for (j=0; j<2; j++)
{
C[i][j] = 0;
for (k=0; k<4; k++)
C[i][j] += A[i][k] * B[k][j];
}
}
for (i=0; i<3; i++)
{
for (j=0; j<2; j++)
{ printf("%d ", (int)C[i][j]);
}
printf("\n");
}
}
矩阵与三角矩阵
#include <stdio.h>
#include <stdlib.h>
int main()
{
float A[4][4] = { {8,2,-1,2}, {-2,1,-3,-8}, {2,-1,7,-1},{1,-8,1,-2} };
float U[4][4], f1, f2, f3; int i, j, k;
for (i=0; i<4; i++)
{ for (j=0; j<4; j++)
{ U[i][j] = A[i][j]; }
}
for (i=0; i<3; i++)
{ f1 = U[i][i];
for (j=i+1; j<4; j++)
{ f2 = U[j][i] / f1;
for(k=0; k<4; k++)
{ f3 = U[i][k] * f2; U[j][k] = U[j][k] - f3; }
}
}
for (i=0; i<4; i++)
{
for (j=0; j<4; j++)
{ printf("%9f ",U[i][j]); }
printf("\n");
}
scanf("%d",&i);
}
行列式的值
#include <stdio.h>
#include <stdlib.h>
int main()
{
float A[4][4] = { {8,2,-1,2}, {-2,1,-3,-8}, {2,-1,7,-1},{1,-8,1,-2} };
float U[4][4], f1, f2, f3; int i, j, k;
for (i=0; i<4; i++)
{ for (j=0; j<4; j++)
{ U[i][j] = A[i][j]; }
}
for (i=0; i<3; i++)
{ f1 = U[i][i];
for (j=i+1; j<4; j++)
{ f2 = U[j][i] / f1;
for(k=0; k<4; k++)
{ f3 = U[i][k] * f2; U[j][k] = U[j][k] - f3; }
}
}
for (i=0; i<4; i++)
{ for (j=0; j<4; j++)
{ printf("%9f ",U[i][j]); }
printf("\n"); }
f3=1; for(i=0; i<4; i++) f3=f3 * U[i][j];
printf(“行列式值: %f \n”, f3);
scanf("%d",&i);
}
矩阵压缩存储:
特殊矩阵简介:
-
三角矩阵
-
带状矩阵
-
稀疏矩阵
e)
存储方案:
特殊矩阵:(顺序存储)
-
三角矩阵
下三角矩阵
上三角矩阵
-
带状矩阵
稀疏矩阵:
-
三元组顺序表 (顺序存储)
#define MAXSIZE 1000 typedef struct { int row,col; ElemType e; }Triple; typedef struct { Triple data[MAXSIZE+1]; int m,n,len; }TSMatrix; -
十字链表 (链式存储)
typedef struct OLNode
{
int row,col; //行,列
ElemType value;
struct OLNode *right,*down; //行列指针
}OLNode,*OLink;
typedef struct
{
OLink *row_head,*col_head; //行列链表头指针数组
int m,n;
}CrossList;