【数据结构】数组和广义表

一、数组的定义

1、数组的定义和基本运算

(1)数组的特点是每个数据元素可以又是一个线性表结构

(2)因此,数组结构可以简单定义为:若线性表中的数据元素(不可再分的原子结构),则称为一维数组,即为向量。

(3)若一维数组中的数据元素又是一个一维数组结构,则称为二维数组。

(4)依此类推,若二维数组中的元素又是一个一维数组结构,则称作三维数组。

(5)数组与线性表的区别与联系:
相同之处:它们都是若干个相同数据类型的数据元素a0,a1,a2.......an-1构成的有限序列。

不同之处:

·数组要求其元素占用一块地址连续的内存单元空间,而线性表无此要求。

·线性表的元素是逻辑意义上不可再分的元素,而数组中的每一个元素还可以是一个数组。

·数组的操作主要是向某个下标的数组元素中存放数据和取某个下标的数组元素,这与线性表的插入与删除操作不同。

(6)

·一维数组:当n=1时,n维数组就退化成定长的线性表。

eg.int num[12]

·二维数组:二维数组可看成以定长线性表为元素的特殊定长线性表。

eg:

//定义一个M行N列的二维数组类Array2
typedef Elemtype Array2[M][N];
//等价于
typedef Elemtype Array1[N];
typedef Elemtype Array2[M];

(线性表结构是数组结构的一个特例,而数据结构又是线性表结构的扩展)

二、数组的存储结构

1、二维数组结构的基本操作:
(1)给定一组下标,修改该位置元素的内容

Assign(A,item,index1,index2)

(2)给定一组下标,返回该位置的元素内容

Value(A,item,index1,index2)

(3)数组结构在创建时就确定了组成该结构的行向量数目和列向量数目。因此,在数据结构中不存在插入、删除元素的操作。

(4)从理论上讲,数组结构也可以使用两种存储结构,即顺序存储结构和链式存储结构。然而数组结构没有插入、删除元素的操作,所以使用顺序存储结构更为合适,换一句话说,一般的数组结构不使用链式存储结构。

(5)组成数组结构的元素可以是多维的,但存储数据结构元素的内存单元地址是一维的,因此,在存储数组结构之前,需要解决将多维关系映射到一维关系的问题。

(6)数组的实现机制:

·一维数组(n个元素)中任意一个元素ai的内存单元地址:LOC(ai)=LOC(a0)+i*k(0<=i<n)

·一个m行n列的二维数组:LOC(ai,j)=LCO(a00)+(n*i+j)*k (0<=i<m,0<=j<n)

三、矩阵及其压缩存储

1、特殊矩阵及其压缩存储

(1)对称矩阵

int Value(int A[],ElemType *item,int i,int j){
//A为压缩后数组,i、j是压缩前数组下标
if(i<1||i>MAX_ROW_INDEX ||
j<1 || j>MAX_COL_INDEX)
return FALSE;
else {
if(i>=j) k=i*(i+1)/2+j; //下三角区域
else k=j*(j+1)/2+i-1;
*item=A[k];
return TRUE;
}}

(2)上/下三角矩阵

int value(int A[],Elemtype *item,int i,int j){
if(i<1 || i>MAX_ROW_INDEX || j<1 || j>MAX_COL_INDEX)
RETURN FALSE;
else{if(i>=j) k=i*(i+1)/2+j;
else k=n*(n-1)/2;
*item=A[K];
RETURN TRUE;
}}

(3)对角矩阵

int value(int A[],Elemtype *item,int i,int j)
{
if(i<1||i>MAX_ROW_INDEX||j<1||j>MAX_COL_INDEX)
return FALSE;
else{if(j>=(i-1)&&j<=(i+1))
k=3*i+j-i+1;
else k=0;
*item=A[k];
return TRUE;
}
}

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值