第五章_数组
C#教程——05第5章 数组
本页已使用福昕阅读器进行编辑。
福昕软件(C)2005-2007,版权所有,仅供试用。
第5章数组如果需要使用同一类型的多个对象,就可以使用集合和数组。
C# 用特殊的记号声明和使用数组。
Array类在后台发挥作用,为数组中元素的排序和过滤提供了几个方法。
使用枚举器,可以迭代数组中的所有元素。
本章讨论如下内容:●简单数组●多维数组●锯齿数组●Array类●数组的接口●枚举5.1 简单数组如果需要使用同一类型的多个对象,就可以使用数组。
数组是一种数据结构,可以包含同一类型的多个元素。
5.1.1 数组的声明在声明数组时,应先定义数组中元素的类型,其后是一个空方括号和一个变量名。
例如,下面声明了一个包含整型元素的数组:int[] myArray;5.1.2 数组的初始化声明了数组后,就必须为数组分配内存,以保存数组的所有元素。
数组是引用类型,所以必须给它分配堆上的内存。
为此,应使用new运算符,指定数组中元素的类型和数量来初始化数组的变量。
下面指定了数组的大小。
第5章数组提示:值类型和引用类型请参见第3章。
myArray = new int[4];,如图5-1所示。
在声明和初始化警告:在指定了数组的大小后,如果不复制数组中的所有元素,就不能重新设置数组的大小。
如果事先不知道数组中应包含多少个元素,就可以使用集合。
集合请参见第10章。
除了在两个语句中声明和初始化数组之外,还可以在一个语句中声明和初始化数组:int[] myArray = new int[4];还可以使用数组初始化器为数组的每个元素赋值。
数组初始化器只能在声明数组变量时使用,不能在声明数组之后使用。
int[] myArray = new int[4] {4, 7, 11, 2};如果用花括号初始化数组,还可以不指定数组的大小,因为编译器会计算出元素的个数:int[] myArray = new int[] {4, 7, 11, 2};使用C# 编译器还有一种更简化的形式。
Chapter05_数组和广义表_数据结构(C语言版)_严蔚敏_配套ppt课件
M
1 1 2 3 3 4
1 5 3 1 2 4
3 7 -1 -1 -2 2
N
1 1 2 3 4 5
1 3 3 2 4 1
3 -1 -2 -1 2 7
行列下 标调换
1 5 3 1 2 4
1 1 2 3 3 4
3 7 -1 -1 -2 2
按行下 标排序
法1:
按照矩阵M的列序进行转置,即按三元组A的 第二个字段值(列下标)由小到大的顺序进行转置。 为了找到M中每一列中所有的非零元素,需要对其 三元组表a.data从第一行起整个扫描一遍,由于 a.data是以M的行序为主序来存放每个非零元素 的,对于M中具有相同列下标的非零元来讲,先扫 描到的非零元的行下标一定小于后扫描到的非零元 的行下标,由此得到的恰是b.data应有的顺序。
• 压缩的含义
– 为多个值相同的元素只分配一个存贮空间; – 零元素不分配或少分配存贮空间。
• 特殊矩阵:元素值相同或零元素分布有 一定规律的矩阵。 • 稀疏矩阵:元素值相同或零元素分布没 有规律的矩阵。 • 特殊矩阵的压缩存贮实际是将二维数组 的数据元素压缩到一维数组上。
特殊矩阵的压缩存储
特殊矩阵: 非零元在矩阵中的分布有一定规则
常用的稀疏矩阵的存储方法
三元组表示法 顺序存储 行逻辑联接的顺序表 带辅助行向量的二元组表示法 伪地址表示法 带行指针向量的单链表示法 链接存储 散列存储 行列表示法(十字链表) 多链表示法(正交表)
顺序存储
1、三元组表示法 用一个线性表来表示稀疏矩阵,线性表的每个 结点对应稀疏矩阵的一个非零元素。其中包括三个 域,分别为该元素的行下标、列下标和值。结点间 的先后顺序按矩阵的行优先顺序排列(跳过零元 素),将线性表用顺序的方法存储在连续的存储区 里。
[工学]《C语言程序设计》第5章___数组、字符串、指针
5.2.2 一维数组的初始化
1、数组声明时初始化 在编译阶段进行的。这样将减少运行时间, 提高效率。 数组初始化的一般形式为: 类型符 数组名[常量表达式]={值,值…值}; 例如: int a[10]={ 0,1,2,3,4,5,6,7,8,9 }; 相当于a[0]=0; a[1]=1;... a[9]=9;
…
a[9]
#include <stdio.h> 声明有10个元素 void main() 的一维数组a {int n,i; float s=0, ave, a[10]; a[0] a[1] … a[9] for(i=0;i<10;i++) a[i] { scanf("%f",&a[i]); a[i] s=s+a[i]; } ave=s/10; for(i=0;i<10;i++) a[i] a[i] if (a[i]>ave) printf("%f ",a[i]); }
说明: ① int a[10]={0,1,2,3,4};
给前5个元素赋 值,其余赋0值 不能给数组整体 赋值,改成{1} 静态存储类型, 初值为0 可以省略数组元 素个数。 初值的个数不能 超过元素个数
② int a[10]=1;
③ static int a[3]; ④ int a[ ]={1,2,3,4,5}; ⑤ int a[5]={1,2,3,4,5,1 };
代码: for(i=0; i<N-1; i<5; i++) { p=i; for(j=i+1; i<N; j<6; j++) if(a[j]<a[p]) p=j; t=a[i]; a[i]=a[p]; a[p]=t; } 5-5.c
《数据结构与算法》第五章-数组和广义表学习指导材料
《数据结构与算法》第五章数组和广义表本章介绍的数组与广义表可视为线性表的推广,其特点是数据元素仍然是一个表。
本章讨论多维数组的逻辑结构和存储结构、特殊矩阵、矩阵的压缩存储、广义表的逻辑结构和存储结构等。
5.1 多维数组5.1.1 数组的逻辑结构数组是我们很熟悉的一种数据结构,它可以看作线性表的推广。
数组作为一种数据结构其特点是结构中的元素本身可以是具有某种结构的数据,但属于同一数据类型,比如:一维数组可以看作一个线性表,二维数组可以看作“数据元素是一维数组”的一维数组,三维数组可以看作“数据元素是二维数组”的一维数组,依此类推。
图5.1是一个m行n列的二维数组。
5.1.2 数组的内存映象现在来讨论数组在计算机中的存储表示。
通常,数组在内存被映象为向量,即用向量作为数组的一种存储结构,这是因为内存的地址空间是一维的,数组的行列固定后,通过一个映象函数,则可根据数组元素的下标得到它的存储地址。
对于一维数组按下标顺序分配即可。
对多维数组分配时,要把它的元素映象存储在一维存储器中,一般有两种存储方式:一是以行为主序(或先行后列)的顺序存放,如BASIC、PASCAL、COBOL、C等程序设计语言中用的是以行为主的顺序分配,即一行分配完了接着分配下一行。
另一种是以列为主序(先列后行)的顺序存放,如FORTRAN语言中,用的是以列为主序的分配顺序,即一列一列地分配。
以行为主序的分配规律是:最右边的下标先变化,即最右下标从小到大,循环一遍后,右边第二个下标再变,…,从右向左,最后是左下标。
以列为主序分配的规律恰好相反:最左边的下标先变化,即最左下标从小到大,循环一遍后,左边第二个下标再变,…,从左向右,最后是右下标。
例如一个2×3二维数组,逻辑结构可以用图5.2表示。
以行为主序的内存映象如图5.3(a)所示。
分配顺序为:a11 ,a12 ,a13 ,a21 ,a22,a23 ; 以列为主序的分配顺序为:a11 ,a21 ,a12 ,a22,a13 ,a23 ; 它的内存映象如图5.3(b)所示。
java教程_第5章 数组
第5章数组什么是数组?数组在实际程序中起到什么作用?数组用来存储数据,类似数据的缓存,是一组有序列的数据集合。
通过本章的学习,可以了解数组如何进行数据存储,并且结合编程实例,掌握数组的设计和操作。
5.1数组概念的引入本节将介绍数组的一些基本概念。
这些概念有助于在以后的编程过程中,更好的使用数组。
5.1.1实例的引入走进一家运动器材店,会看到很多的体育运动器材,有篮球、排球、足球、羽毛球、乒乓球、高尔夫、滑板、健身器材等等。
如果要为这家店作一个数据库系统,首先要建立一个类似于集合的表格,如下所示。
{篮球,排球,足球,羽毛球,乒乓球,高尔夫,滑板,健身器材}在程序开发中,将这种集合形式经过改装,变成了本章要重点讲述的数组,将上述的例子用数组来表示:运动器材{篮球,排球,足球,羽毛球,乒乓球,高尔夫,滑板,健身器材}5.1.2数组的概念数组是具有相同数据类型的数据的集合,例如上一小节中提到的运动器材集合。
相同的数据类型,意味着数组中每个数据都是同一类型数据,或者属于基本数据类型中相同类型的数据,或者属于对象类型中相同类型的数据。
在生活中,一个班级的学生、一个学校的所有人、一个汽车厂的所有汽车等等,这些都可以形成一个数组。
数组如果按照维数来分,分为一维数组、二维数组、三维数组和多维数组等,每一维代表一个空间的数据。
一维数组代表的就是一维空间的数据,例如自然数从1~10。
{1,2,3,4,5,6,7,8,9,10}二维数组代表的就是二维空间的数据,例如在数学中的坐标。
{(1,2),(3,4),(5,6),(7,8)}这里的每一组数据都代表了二维空间中的x和y的坐标值。
三位数组代表的就是三维空间的数据,所谓三维空间就是指立体空间,例如立体坐标。
{(1,2,3),(2,3,4),(3,4,5),(4,5,6),(5,6,7)}这里的每一组数据都代表了三维空间中的(x,y,z)轴的坐标值。
5.1.3用实例说明数组的用处本节重点是说明数组的优点,可能会遇到后面小节讲述的内容,先不要理会。
数据结构-第5章--数组练习题
数据结构-第5章--数组练习题第5章数组一、选择题3.设有数组A[i,j],数组的每个元素长度为3字节,i的值为1到8,j的值为1到10,数组从内存首地址BA开始顺序存放,当用以列为主存放时,元素A[5,8]的存储首地址为(A)。
A.BA+141B.BA+180C.BA+222D.BA+2254.假设以行序为主序存储二维数组A=array[1..100,1..100],设每个数据元素占2个存储单元,基地址为10,则LOC[5,5]=(A)。
A.808B.818C.1010D.10205.数组A[0..5,0..6]的每个元素占五个字节,将其按列优先次序存储在起始地址为1000的内存单元中,则元素A[5,5]的地址是()。
1195A.1175B.1180C.1205D.12107.将一个A[1..100,1..100]的三对角矩阵,按行优先存入一维数组B[1‥298]中,A中元素A6665(即该元素下标i=66,j=65),在B数组中的位置K为()。
供选择的答案:A.198B.195C.1972+64某3=19410.若对n阶对称矩阵A以行序为主序方式将其下三角形的元素(包括主对角线上所有元素)依次存放于一维数组B[1..(n(n+1))/2]中,则在B中确定aij(iA.i某(i-1)/2+jB.j某(j-1)/2+iC.i某(i+1)/2+jD.j某(j+1)/2+i11.设A是n某n的对称矩阵,将A的对角线及对角线上方的元素以列为主的次序存放在一维数组B[1..n(n+1)/2]中,对上述任一元素aij(1≤i,j≤n,且i≤j)在B中的位置为(C)。
A.i(i-l)/2+jB.j(j-l)/2+iC.j(j-l)/2+i-1D.i(i-l)/2+j-112.A[N,N]是对称矩阵,将下面三角(包括对角线)以行序存储到一维数组T[N(N+1)/2]中,则对任一上三角元素a[i][j]对应T[k]的下标k是(AB)。
vb第五章 数组
5.2 数组的基本操作
VB不允许对数组整体操作,例如: Dim A(2,3) As Integer A=2 不允许! 只能对数组元素进行操作,例如: A(1,1)=1 A(1,3)=2 A(2,2)=A(1,1)*2+A(1,3)
25
一、数组元素的赋值
1、用赋值语句给数组元素赋值 例如:A(1,1)=1 A(1,2)=5 2、通过循环语句给数组元素赋值 例如: For I=1 To 10 A(I)=Int(100*Rnd)+1 Next I 该循环语句产生10个100以内的随机整数,存 入数组A中。
22
For Each –Next举例(一维数组的使用) P90例
运行结果: Option base 1 14 21 28 35 42 49 Private Sub Form_Click() 56 63 Dim A(12) As Integer, V As Variant 70 77 84 91 Dim I%, Js% Js = 0 Js = 14 For Each V In A For I = 1 To 12 Js = Js + 1 A(I) = Js Print V; If Js Mod 6 = 0 Then Print Js = Js + 7 输出每行 Next V Next I 6个元素 Print End Sub
数组是具有相同数据类型的多个 值的集合,数组的所有元素按一定顺 序存储在连续的存储单元中。
14
一维数组的结构
逻辑结构 内存的存 放次序
StrA(0) StrA(1) StrA(2) StrA(3) StrA(4) StrA(5) StrA(6) StrA(7) StrA(8)
存储结构
第5章 数组
说明
► “类型说明符”、“数组名”及“常量表达
式”的含义与一维数组中的相关定义相同。 ► 二维数组中有两个下标,每一维的下标都 是从0算起。
第16页
共49页
5-2-2 二维数组元素的引用
► 二维数组元素的引用格式为: ► 数组名[行下标表达式][列下标表达式]
第17页
共49页
说明
► 字符数组的定义 ► 字符数组的初始化 ► 字符数组的引用
► 字符串和字符串结束标志
► 字符数组的输入输出
► 字符串处理函数
► 字符数组的应用
第23页 共49页
5-3-1 字符数组的定义
► 字符数组的定义与前面介绍的数值数组的
定义类似。
第24页
共49页
5-3-2 字符数组的初始化
► 逐个字符赋值 ► 用字符串对字符数组赋初值
第42页 共49页
5-4 程序案例
► 筛选完成后,筛子中剩下的即为素数。 ► #include <stdio.h> ► main() ►{
► ►
int i,a[100]; /*筛子数组*/ int i,n=0; /*n为素数个数,用于输出格 式控制*/ ► int minp,doub; /* minp为筛选种 子,doub为倍数*/ ► for(i=0;i<100;i++) /*建立筛子*/
第27页
共49页
5-3-3 字符数组的引用
► 字符数组的引用和前面几节数组的引用没
有什么区别,也是通过对数组元素的引用 实现的,每次得到一个字符,只是要注意 数据元素的类型现在是字符型。
第28页
共49页
5-3-4 字符串和字符串结束标志
数据结构(C语言版)第5章数组
数据结构
数组和广义表可看成是一种特殊的线性表,其特 殊在于,表中的数据元素本身也是一种线性表。
5.1 数组的定义
由于数组中各元素具有统一的类型,并且数组元素的下标一 般具有固定的上界和下界,因此,数组的处理比其它复杂 的结构更为简单。多维数组是向量的推广。例如,二维数 组:
(a11 (a 21 ( ... ( m1 a
m1 m2
mn
Loc(aij)=Loc(aa )+[(j-1)m+(i-1)]*l Loc( aij)=Loc( 11 )+[(i-1)n+(j-1)]*l 11
m*n-1 m*n-1
数据结构
无论规定行优先或列优先,只要知道以下三要素便可随时求出 任一元素的地址(这样数组中的任一元素便可以随机存取!): ①开始结点的存放地址(即基地址) ②维数和每维的上、下界; ac1,c2 … ac1,d2 ③每个数组元素所占用的单元数 Amn= … aij … ad1,c2 … ad1,d2 计算二维数组元素地址的通式
数据结构
第五章
一、教学内容:
1、 2、 3、 4、 数组的定义和顺序存储方式; 特殊矩阵的压缩存储; 稀疏矩阵
数组和广义表
广义表的概念、表示及基本操作;广义表存储结构的实现。
二、教学要求:
1、 法; 2、 3、 掌握对特殊矩阵进行压缩存储时的下标变换公式; 了解稀疏矩阵的两种压缩存储方法的特点和适用范围,理解以三元组表示稀疏矩阵 了解数组的两种存储表示方法,并掌握数组在以行为主的存储结构中的地址计算方
a00 a01 a10 a11 a12 a21 … … a n-1 n-2 a n-1 n-1
K=0 1 2 3 4 5 … … 3n-2 3n-1 数组sa中的元素sa[k]与三对角带状矩阵中的元 素aij存在一一对应关系,在aij之前有i行,共有3*i-1 个非零元素,在第i行,有j-i+1个非零元素,这样, 非零元素aij的地址为:
第五章 数组
第 5 章数组一、选择题1.设有一个10阶的对称矩阵A,采用压缩存储方式,以行序为主存储,a11为第一元素,其存储地址为1,每个元素占一个地址空间,则a85的地址为()。
【燕山大学 2001 一、2 (2分)】A. 13B. 33C. 18D. 402. 有一个二维数组A[1:6,0:7] 每个数组元素用相邻的6个字节存储,存储器按字节编址,那么这个数组的体积是(①)个字节。
假设存储数组元素A[1,0]的第一个字节的地址是0,则存储数组A的最后一个元素的第一个字节的地址是(②)。
若按行存储,则A[2,4]的第一个字节的地址是(③)。
若按列存储,则A[5,7]的第一个字节的地址是(④)。
就一般情况而言,当(⑤)时,按行存储的A[I,J]地址与按列存储的A[J,I]地址相等。
供选择的答案:【上海海运学院 1998 二、2 (5分)】①-④: A.12 B. 66 C. 72 D. 96 E. 114 F. 120G. 156 H. 234 I. 276 J. 282 K. 283 L. 288⑤: A.行与列的上界相同 B. 行与列的下界相同C. 行与列的上、下界都相同D. 行的元素个数与列的元素个数相同3. 设有数组A[i,j],数组的每个元素长度为3字节,i的值为1 到8 ,j的值为1 到10,数组从内存首地址BA开始顺序存放,当用以列为主存放时,元素A[5,8]的存储首地址为( )。
A. BA+141B. BA+180C. BA+222D. BA+225【南京理工大学 1997 一、8 (2分)】4. 假设以行序为主序存储二维数组A=array[1..100,1..100],设每个数据元素占2个存储单元,基地址为10,则LOC[5,5]=()。
【福州大学 1998 一、10 (2分)】A. 808B. 818C. 1010D. 10205. 数组A[0..5,0..6]的每个元素占五个字节,将其按列优先次序存储在起始地址为1000的内存单元中,则元素A[5,5]的地址是( )。
第5章-数组ppt课件(全)
③执行粘贴命令(Ctrl+V),将显示一个对话框,询 问“已经有一个控件为’Shape1’,是否创建控 件数组?”
④选择“是”,窗体左上角将出现一个控件,它就 是控件数组的第二个元素。
⑤执行粘切命令(Ctrl+V),建立控件数组的其它元 素。将其放在合适的位置并可用菜单栏的“格式”
外,还用到列表框(Llistbox)控件,这个控件及其 相关的内容将在本章作详细的讲解。 (2)编写代码时出现的 Dim Name(n) as string属于 数组的定义,具体相关数组的使用及有关概念是本 章的主要内容之一。 (3)排序交换数据时,应让姓名和成绩同时交换,若 只交换成绩,则最终结果会张冠李戴。
对其进行设置。
(2)编写代码
在窗体中只放置控件数组,而要输入对应的 标号需通过print方法来实现,对于Shape1控件 数组中各元素的形状由Shape控件的Shape属性 来完成,形状的填充由Shape控件的FillStyle属 性实现,具体的过程如下:
Private Sub Form_Click()
(2)编写代码使用了控件数组Shape1,注意掌握 创建数组控件的方法的使用,对于建立控件数组 的另一方法将在后面介绍。
5.2 数组
VB中将具有相同名字、不同下标值的一组变量称为 数组。数组中的每个变量称为数组元素或下标变量。可用 数组名和下标唯一地标识一个数组元素,如Score(5)就表 示数组名为Score的数组中下标为5的数组元素。一个数 组如果只用一个下标就能确定一个数组元素在数组中的位 置,则称为一维数组,而由两个或多个下标所组成的数组 称为二维数组或多维数组。在其它语言中数组用来存储相 同类型的数据,但是在VB中数组可用来存放不同类型的 数据。
《C语言程序设计》课件 第五章 数组
a(5948)
a[2](5964) a[1](5956) a[0](5948) 图 5-10
a[2][1] (5968) a[2][0] (5964) a[1][1] (5960) a[1][0] (5956) a[0][1] (5952) a[0][0](5948)
return 0;
}
5.1.4一维数组程序举例
3.用选择法对输入的n个学生的单科成绩进行 从小到大排序。
编程思路: 直接选择排序的过程是:首先在所有数据中找出值 最小(最大)的数据,把它与第1个数据交换,然后 在其余的数据中找出值最小(最大)的数据,与第2 个数据交换......依次类推,这样,n个数据经过n-1轮 交换后可得到有序结果。
printf("%3d ",a[i]); printf("\n"); return 0; }
5.1.3 一维数组的初始化 5.1.3 一维数组的初始化
数组初始化常见的格式:
1.用大括号括起来的常量表达式列表,常量表达式 之间用逗号进行分隔: int a[10]={1,2,3,4,5,6,7,8,9,10};
注意:
不要将a[i][j]写成a[i,j],否则编译系统会将逗号分隔 符作为逗号运算符处理,即将a[i,j]视为a[j]。
5.2.2二维数组元素的引用
可以将二维数组看成是特殊的一维数组。
例如,二维数组a[3][2]可以看成是长度为3的一维数组, 所含的3个数组元素分别为:a[0]、a[1]、a[2]
for(i=0;i<3;i++) for(j=0;j<5;j++)
第五章 判断题-数组
第五章判断题1.下标用于指出数组中某个元素位置的数字。
()2.把数组中元素按某种顺序排列的过程叫做查找。
()3.确定数组中是否含有某个关键字的过程叫做排序。
()4.一个数组可以存放许多不同类型的数值。
()5.数组的下标通常是float型。
()6.数组的某个元素被传递给一个方法并被该方法修改,当被调用方法执行完毕时,这个元素中含有修改过的数值。
()7.数组可以声明为任何数据类型。
()8.数组由具有一名字和相同类型的一组连续内存单元构成。
()9.在数组声明中可以用等号及一个逗号分隔的初始值表初始化数组元素,该数组大小只能有用户来决定。
()10.将一个数组传递给一个方法,必须加在数组名后加方括号。
()第五章选择题1.线性表和表可以存储在▁▁中。
A.数组B.堆栈C.文件D.字符串2.数组元素之所以相关,是因为它们具有相同的▁▁。
A.名字B.类型C.下标D.地址3.二维数组使用几个下标。
A.1B.2C.3D.44.请看下面的程序段:public class Person{static int arr[] = new int[10];public static void main(String a[]) {System .out .println(arr[1]);}}下面说法正确的是:A.当编译时会发生错误B.编译不会发生错误但执行是会发生错误C.输出结果为0D.不会输出结果5.请看下面的程序段:public class Person{int arr[] = new int[10];public static void main(String a[]) {System .out .println(arr[1]);}}下面说法正确的是:A.当编译时会发生错误B.编译不会发生错误但执行是会发生错误C.输出结果为0D.不会输出结果6.下面哪个选项正确的声明一个字符型数组:A.char str[]B.char str[][]C.String str[]D.String str[10]7.下面那一个选项正确创建一个空的含有6个元素的字符数组:A.String s[6];B.String [6]s;C.String s[ ]={“”,””,””,””,””,””};D.String s[ ]=new String[6];For(int m=0;m<6;m++) { s[m]=””;}E. String s[ ]=new String[6];For(int m=0;m<6;m++) { s[m]=null;}8.请看下面的程序段:public class MyClass {public static void main(String arg[ ]) {int arr[ ]= new int[3];System .out .println(“it is “+ arr[1]);}}当编译和执行这段代码时会出现:A.有一个编译错误为“possible reference before assignment”B.有一个编译错误为“illegal array declaration syntax”C.有异常出现为“NullPointerException”D.正确执行并且输出09.请看下面的程序段public class Person{String name;int age;public Person(String n,int a){ name=n;age=a;}public static void main(String arg[ ]){//point x}}下面选项可以添加到//point x处:A.Person p[ ]=new Person[3];P[1]=new Person(“user1”;24);B.Person p[ ];P=new Person[3];P=new Person(“user2”;56);C.Person p[ ]={ new Person(“user1’,34),(“user2”,34)}D.Person p[ ]=new Person{(“user1’,34),(“user2”,34)}10.请看下面的程序段public class Test{String s;int m;public Test(String t ,int n){s=t;m=n;}public static void main(String arg[ ]){Test t[ ]={ new Test(“abc”,3);new Test(“ddf”,23) };//point x}}下面选项可以添加到//point x处:A.System .out .println(“the value is”+t[3].s);B.System .out .println(“the value is”+t[2].m);C.System .out .println(“the value is”+t[1].s);D.System .out .println(“the value is”+t[1].m);第五章程序设计题1.编写程序,接受用户输入的若干字符串,并按字典排序输出。
数据结构讲义第5章-数组和广义表
5.4 广义表
5)若广义表不空,则可分成表头和表尾,反之,一对表头和表尾 可唯一确定广义表 对非空广义表:称第一个元素为L的表头,其余元素组成的表称 为LS的表尾; B = (a,(b,c,d)) 表头:a 表尾 ((b,c,d)) 即 HEAD(B)=a, C = (e) D = (A,B,C,f ) 表头:e 表尾 ( ) TAIL(B)=((b,c,d)),
5.4 广义表
4)下面是一些广义表的例子; A = ( ) 空表,表长为0; B = (a,(b,c,d)) B的表长为2,两个元素分别为 a 和子表(b,c,d); C = (e) C中只有一个元素e,表长为1; D = (A,B,C,f ) D 的表长为4,它的前三个元素 A B C 广义表, 4 A,B,C , 第四个是单元素; E=( a ,E ) 递归表.
以二维数组为例:二维数组中的每个元素都受两个线性关 系的约束即行关系和列关系,在每个关系中,每个元素aij 都有且仅有一个直接前趋,都有且仅有一个直接后继. 在行关系中 aij直接前趋是 aij直接后继是 在列关系中 aij直接前趋是 aij直接后继是
a00 a01 a10 a11
a0 n-1 a1 n-1
a11 a21 ┇ a12 a22 ┇ ai2 ┇ … amj … amn … aij … ain … … a1j a2j … … a1n a2n β1 β2 ┇ βi ┇ βm
第5章数组、集合和矩阵
123 456 789
(a) 二维数组的逻辑结构
下标
0
1
1
2
2
3
3
4
4
5
5
6
6
7
7
8
8
9
第1行 第2行 第3行
(b) 行优先顺序存储结构
下标
0
1
1
4
2
7
3
2
4
5
5
8
6
3
7
6
8
9
第1列 第2列 第3列
(c) 列优先顺序存储结构
二维数组的顺序存储结构
5.1.3 数组抽象数据类型
数据集合 数组的数据集合可以表示为a0, a1, a2, ..., an-1, 且限定数组元素必须存储在地址连续的内存单元中。
5.3.3 集合类 集合的特点是数据元素无序且不重复。集合类既可以基
于向量类来实现,也可以用其他方法实现。常用的另一种实 现方法是基于哈希表来实现。
基于向量类的集合类实现方法: 1 MyVector类增加的成员函数 2 集合类MySet 3 集合类MySet的测试
5.4 矩阵类
矩阵是工程设计中经常使用的数学工具。 矩阵用两维数组处理最为方便。 二维数组存储结构
5.6.2 数组结构的稀疏矩阵类 1 三元组类
三元组的数组结构存储,就是把所有三元组存储在一 个数组中。
2 稀疏矩阵类 对于稀疏矩阵来说,矩阵的行数、列数和非零
元个数是矩阵操作的基本数据,因此,这些成分要 设计为成员变量。另外,要用数组保存所有三元组, 因此,要把MyVector类的对象设计为成员变量。
纵向头指针
41
∧ 19 ∧
vb6.0高清教程系列 第05章 数组(共九章)
5.1 概 述
数组的概念:数组并不是一种数据类型,而 是一组相同类型数据的集合。用一个统一的名字 ( 数组名) 代表逻辑上相关的一批数据,每个元 素用下标变量来区分;下标变量代表元素在数组 中的位置。
其表示形式: A(1),A(10) X(1,1), Y(0,0,0), X1(1,10), Y(1,2,5) X(2,10)
例5.1
5.2.4 一维数组的应用
一、分类统计
例5.2 在 例 5.1中 如 果 还 要 统 计 0~9, 10~19, 20~20, …. 80~89,90~99分数段及100分的学生人。 则可另用数组bn来存各分数段的人数,并用bn(0)存 0~9分的人数,bn(1)存10~19分的人数,…bn(9)存90~99 分的人数,bn(10)存100分的人数。
5.2.3 一维数组的基本操作
1. 可通过循环给数组元素的初值 For i = 1 To 10 A(i)=1 Next i 'A数组的每个元素值为1
2. 数组的输入 For i = 1 To 4 For j = 1 To 5 sc(i, j) = InputBox("输入sc(" &i & "," & j & ") 的值") Next j Next I
1.选择法排序
算法思想: 1)对有n个数的序列(存 放在数组a(n)中),从中选 出最小(升序)或最大(降 序) 的数, 与第1个数交换 位置; 2) 除第1 个数外, 其余 n-1个 数 中 选 最 小 或 最 大的 数,与第2个数交换位置; 3)依次类推,选择了n-1 次后,这个数列已按升序排 列。
3.Split函数 使用格式: Split(<字符串表达式> [,<分隔符>]) 说明: 使用Split函数可从一个字符串中,以某个指定符号为分隔 符,分离若干个子字符串,建立一个下标从零开始的一维数 组。 补充例: 使用文件框,通过编程实现大量数据的输入 输入一系列的数据,存放在数组中。对输入的数据允许 修改和自动识别非数字数据。 分析: 利用文本框实现大量数字串的输入和编辑的功能; 通过编程将输入的数字串以逗号为分界符分离出各项数据; 对非数字: 数组名(下标1,下标2)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
小结
31
稀疏矩阵
定义
设矩阵A中有t个非零元素,若t远远小于矩阵 元素的总数(即t<<m×n),则称为稀疏矩阵 精确地说,设矩阵A中,有t个非零元素。令 e=t/(m*n),称e为矩阵的稀疏因子。通常认为 e≦0.05时称之为稀疏矩阵。 为了节省存储单元,很自然地想到使用压缩存 储方法。但由于非零元素的分布一般是没有规 律的,因此在存储非零元素的同时,还必须同 时记下它所在的行和列的位置(i,j)。
21
(a)上三角矩阵
三角矩阵(续)
上三角矩阵的下三角(不包括主对角线) 中的元素均为常数。 下三角矩阵正好相反,它的主对角线上方 均为常数。 在大多数情况下,三角矩阵常数为零。 三角矩阵中的重复元素c可共享一个存储空 间,其余元素正好有n(n+1)/2个
三角矩阵可压缩存储到向量sa[0..n(n+1)/2] 中,其中c存放在向量的最后一个分量中。
7
二维数组C语言定义
同理,一个n维数组类型(设想n=3)可以定义 为其数据元素为n-1维数组类型的一维数组 类型。例如: typedef array2 array3[t]; 数组一旦被定义,它的维数和维界就不再 改变。因此,除了结构的初始化和销毁之 外,数组只有存取元素和修改元素值的操 作。
8
18
对称矩阵(续)
在这个下三角矩阵中,第i行恰有i+1个元素,元 素总数为:n(n+1)/2 因此,我们可以按从上到下、从左到右的顺序 将这些元素存放在一个向量sa[0..n(n+1)/2-1]中 。 为了便于访问对称矩阵A中的元素,我们必须 在aij和sa[k]之间找一个对应关系。
19
对称矩阵(续)
26
对角矩阵(续)
一个k对角矩阵(k为奇数) 满足下述条件:
若∣i-j∣>(k-1)/2 ,则元素 aij=0。
对角矩阵可按行优先顺序或对角线的顺序 ,将其压缩存储到一个向量中 在三对角矩阵里除满足条件
i=0,j=0、1, 或 i=n-1, j=n-2、n-1 或 0<i<n-1, j=i-1、i、i+1的元素aij外,其余元素 都是零。
10
数组的顺序存储结构
计算机的内存空间是一个一维结构,而二 维以上的数组是多维结构。用连续的存储 单元存放数组,就有次序约定的问题。
二维数组有两种存储方式:一种是以行序为 主序的方式,另一种是以列序为主序的方式 行为主序方式是先存储数组的第一行元素, 再存储第二行元素…; 列序为主序方式是先存储数组的第一列元素 ,再存储第二列元素…;
29
特殊矩阵小结
上述的各种特殊矩阵,其非零元素的分布 都是有规律的 总能找到一种方法将它们压缩存储到一个 向量中 能找到矩阵中的元素与该向量的对应关系 ,通过这个关系,仍能对矩阵的元素进行 随机存取。
30
提纲
数组的定义 数组的顺序表示和实现 矩阵的压缩存储
特殊矩阵 稀疏矩阵
数组
信电学院计算机系:周树森
shusen.zhou@
/share/link?shareid=360996&uk=2351093777
1
提纲
数组的定义 数组的顺序表示和实现 矩阵的压缩存储
特殊矩阵 稀疏矩阵
小结
2
提纲
32
稀疏矩阵存储
稀疏矩阵存储方式
三元组表示法
非零元个数和位置在操作过程中变化不大 一个三元组(i, j, aij)唯一确定了矩阵的一个非零 元。由此,稀疏矩阵可由表示非零元的三元组 及其行列数唯一确定 非零元个数和位置在操作过程中变化较大
十字链表
33
三元组顺序表
如矩阵M采用三元组表示如下:
4
二维数组的定义
数据对象: D = {aij | 0≤i≤b1-1, 0 ≤j≤b2-1} 数据关系:
R = { ROW, COL } ROW = {<ai,j,ai+1,j>| 0≤i≤b1-2, 0≤j≤b2-1} COL = {<ai,j,ai,j+1>| 0≤i≤b1-1, 0≤ j≤b2-2}
27
对角矩阵行优先存储
除第0行和第n-1行是2个元素外,每行的非 零元素都要是3个,因此,需存储的元素个 数为3*(n-2)+4=3n-2 。
a00 K=0 a01 1 a10 2 a11 3 a12 4 a21 …… a n-1 n-2 5 a n-1 n-1 3n-3
… … 3n-4
28
对角矩阵行优先存储(续)
5
二维数组举例
二维数组可以看成是一个线性表
Am×n = (α 0 , α1 ,...α p )
其中p=m-1或n-1。当p=m-1,它的每个数据元素 是一个行向量形式的线性表;当p=n-1,它的每个 数据元素是一个列向量形式的线性表:
) ) ) ( )
( a00 ( a10 = ( ... ( am −1, 0 a01 a11 ... am −1,1 a0,n −1 ) ... ... a1,n −1 ) ... ... ... ) ... ... am −1,n −1) ... ...
20
若i<j,则aij是在上三角矩阵中:
三角矩阵
以主对角线划分,三角矩阵有上三角 和下三角两种。
a00 a01 … a 0 n-1 c a11 … a 1 n-1 c … a n-1 n-1 ………………….. c a00 c … c a10 a11 … c …………….. an-1 0 an-1 1 … an-1 n-1 (b)下三角矩阵
数组sa中的元素sa[k]与三对角带状矩阵中 的元素aij存在一一对应关系。
在aij之前有i行,共有3*i-1个非零元素; 在第i行,有j-i+1个非零元素; 这样,非零元素aij的在一维向量中的下标k为: k=3*i-1+(j-i+1)=(2i+j) 上例中,a34对应着sa[10]: k=2*i+j=2*3+4=10 a21对应着sa[5]: k=2*2+1=5
a00 a01 a10 a11 a12 a21 a22 a23 …. ….. …. an-2 n-3 an-2 n-2 an-2 n-1 an-1 n-2 an-1 n-1
25
对角矩阵(续)
非零元素仅出现在 (1)主对角线上(aii, 0≦i≦n-1), (2)紧邻主对角线上面的那条对角线上 (aii+1,0≦i≦n-2); (3)紧邻主对角线下面的那条对角线上 (ai+1 i,0≦i≦n-2)。 显然,当∣i-j∣>1时,元素aij=0。
i 1 1 3 3 4 5 6 6
j 2 3 1 6 3 2 1 4
v 12 9 -3 14 24 18 15 -7
三元组顺序表存储表示
#define MAXSIZE 12500 //非零元个数的最大值 typedef struct{ int i, j; //非零元素的行下标和列下标 ElemType e; }Triple; typedef struct{ Triple data[MAXSIZE+1]; //data[0]未用 int mu, nu, tu; //行数,列数和非零元个数 } TSMatrix;
23
下三角矩阵存储方式
下三角矩阵的存储和对称矩阵类似,sa[k] 和aij对应关系是: k= i(i+1)/2+j i≧j k= n(n+1)/2 i<j
24
对角矩阵
对角矩阵中,所有的非零元素集中在以主 对角线为中心的带状区域中
除了主对角线和主对角线相邻两侧的若干条对 角线上的元素之外,其余元素皆为零。
11
提纲
数组的定义 数组的顺序表示和实现 矩阵的压缩存储
特殊矩阵 稀疏矩阵
小结
12
矩阵的压缩存储
矩阵是一种常用的数学对象,在编制程序 时,将一个矩阵描述为一个二维数组。 矩阵在这种存储表示之下,可以对其元素 进行随机存取,各种矩阵运算也非常简单 ,并且存储的密度为1。 在矩阵中非零元素呈某种规律分布或者矩 阵中出现大量的零元素的情况下,占用了 许多单元去存储重复的非零元素或零元素 ,这对高阶矩阵会造成极大的浪费。
0 0 12 9 0 0 0 0 − 3 0 0 0 M = 0 0 24 0 0 18 0 0 15 0 0 − 7 0 0 0 0 0 0 0 14 0 0 0 0 0 0 0 0 0 0 6×7
用三元组(右图)加上(6, 7)这 一对行、列值便可作为矩阵M 的另一种描述。
13
矩阵的压缩存储
为了节省存储空间, 我们可以对这类矩阵 进行压缩存储:即为多个相同的非零元素 只分配一个存储空间;对零元素不分配空 间。 压缩技术的应用领域:图像、音频、视频 、文件压缩,…
14
提纲
数组的定义 数组的顺序表示和实现 矩阵的压缩存储
特殊矩阵 稀疏矩阵
小结
15
特殊矩阵
定义
特殊矩阵是指非零元素或零元素的分布有一定 规律的矩阵
下面我们讨论几种特殊矩阵的压缩存储。 对称矩阵