软件基础第4章_第1页
软件基础第4章_第2页
软件基础第4章_第3页
软件基础第4章_第4页
软件基础第4章_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、16.07.2020,第四章 数组与字符串,一、基本内容 数组的类型定义和表示方法;特殊矩阵和稀疏矩阵的压缩存储方法及运算的实现;串的数据类型定义;串的存储表示及串的各种基本操作的实现算法。 二、学习要点 1.了解数组的两种类型表示方法,并掌握数组在以行为主序的存储结构中的地址计算方法。 2.掌握对特殊矩阵进行压缩存储时的下标变换公式。 3.了解稀疏矩阵的压缩存储方法的特点和适用范围,领会以三元组表示稀疏矩阵时进行矩阵运算采用的处理方法。 4.熟悉串的基本操作的定义,并能利用这些基本操作实现串的其他各种操作的方法。,16.07.2020,在愚人节的时候一定要捉弄一下哪的好朋友哦!下面是小编为大

2、家整理的:“2018愚人节整人恶搞祝福语短信大全”欢迎阅读 1. 4.1日是愚人节,为了防止大家上当受骗本公司决定放假一天,不扣工资,不扣奖金。特别提醒:这一天请不要出门乱跑。请大家互相转发告知! 2. 稀奇稀奇真稀奇,七只乌龟在蹦迪,六只狮子下象棋,五只猴子在吃梨,四只驴子追舒琪,三只老鼠拍三级,两只螃蟹打太极,一只小猪看信息!愚人节快乐! 3. 由于移动公司进行网络升级改造,会造成您的手机由于信号不好无法接通,遇到这种情况,请将手机放入开水中泡五到六分钟。祝愚人节快乐! 4. 4.1日所有超市为答谢新老客户的厚爱,特搞一天大型活动。活动内容:购物满一百元即送贰仟元现金。转发此消息可凭发票领

3、数码相机一台,大家记得相互通知! 5. 4.1日医药广场搞活动:购买一百元的感冒药,可获赠幸福一包。购买五百元的养胃药,可获赠快乐一箱。购买千元以上的任何药品,可获赠健康一生! 6. 工作虽累有薪水,下班潇洒喝小酒,老婆孩子热炕头,周末四处旅旅游,发个短信问个好,只扣话费一个角。小猪,,第四章 数组与字符串,4.1 数组 4.1.1 数组的定义和特点 定义:一维数组记为a=(a1,a2,an-1,an), 每个数组 元素由一个值和一个下标来确定,数组元素的下标顺序可 作为一个线性表中的序号。 在c语言中,一维数组am的下标为:0,1,2, , m-1;,数组 (array)是大家都非常熟悉的数

4、据类型。在许多高级程序设计语言中都有这种数据类型。前面我们讨论的各种线性表的顺序存储结构时,都是借用一维数组来描述的。一维数组是一种顺序表结构。由于多维数组的逻辑特征是一个数组元素可能有多个直接前趋和直接后继,因此是一种非线性结构。但是多维数组可以理解成数据元素本身就是一种数据结构的线性表,它是一种特殊的线性结构,从这个意义上,数组可以看成是线性表的扩展。,16.07.2020,数组特点 数组的结构是固定的 数据元素的结构相同 数组的基本操 给定一组下标,找到与之相应的数据元素。 给定一组下标,存取和修改与其相应的数据元素中某个 数据项的值。,从逻辑结构上看,二维数组也是一种线性表。我们把二维

5、数组的每一行看成是一个元素,即: a=((a11,a12,a1n),(a21,a22,a2n),(am1,am2,amn)) 显然,它的每个元素又都是一个线性表。,当然,也可以把二维数组的每一列看成是一个元素。即: a=((a11,a21,am1),(a12,a22,am2),(a1n,a2n,amn)),二维数组,在c语言中表示为amn,又称矩阵(matrix), 其表示形式为:,16.07.2020,4.1.2 数组的顺序存储结构 一维数组 假定每个数据元素占s个单元, 用loc(a1)表示存放a1的地址。 数据元素ai的地址计算公式: loc(ai)=loc(a1)+(i-1)*s 1i

6、n,16.07.2020,二维数组 假定每个数据元素占s个单元,用loc(a11) 表示存放a11的地址。数组元素可以以行序为主序或以列序为主序存放。,16.07.2020,16.07.2020,从上述二维数组的两种顺序存储方式不难推广到三维数组almn。对于按行优先的顺序存放,则以左下标为主序,即先排右下标,最后排左下标;而按列优先的顺序存放,则以右下标为主序,即先排左下标,最后排右下标。;对于三维数组almn的每一个元素,存储地址的计算公式为: 按行优先的顺序存放 loc(aijk)=loc(a111)+(i-1)*m*n+(j-1)*n+(k-1)*s 按列优先的顺序存放 loc(aij

7、k)=loc(a111)+(k-1)*l*m+(j-1)*l+(i-1)*s,16.07.2020,采用顺序存储方式的优点是可方便地随机存取数组的数据元素。因为只要知道数组元素的一组下标值,就可以计算出该元素的位置。但是,顺序存储要求地址空间连续。如果矩阵的阶数很高,同时在矩阵中有许多具有相同值的元素或零元素。此时,顺序存储方式就不太合适了,会造成大量的存储空间浪费。因此,需要考虑一种更有效的存储结构,这种存储结构就是压缩存储结构。,4.1.3 矩阵的压缩存储 矩阵压缩存储结构的实质是尽量不为零元素分配存储空间,并使多个值相同的元素只占用一个存储空间。 对称矩阵的压缩存储,16.07.2020

8、,对称矩阵是一个n阶方阵。若一个 n阶矩阵a的元素满足aij=aji(1in, 1jn)的性质,则称为 n阶对称矩阵。由于在n阶对称矩阵中,以对角线 a11, a22, ., ann为轴线的对称位置上的矩阵元素值相等。因此,可以对每一对对称的矩阵元素分配一个存储空间,那么n阶矩阵中的n*n个元素就可以被压缩到 n(n+1)/2 个元素的存储空间中去。,当ij 时, 元素aij 在下三角矩阵中。若以行为主序去存储对称矩阵的下三角矩阵,则它所对应在计算机系统中的存储位置为:,16.07.2020,loc(aij)= loc(a11)+(i*(i-1)/2)+(j-1)*s 设一维数组sn(n+1)

9、/2作为n阶对称矩阵a的存储结构,一维数组sk与下三角矩阵元素aij之间存在一一对应关系的公式如下:,k=i*(i-1)/2+j-1 ( ij ),当 ij 时, 元素 aij 在上三角矩阵中。若以行为主序去存储对称矩阵的上三角矩阵,则它所对应在计算机系统中的存储位置为: loc(aij)= loc(a11)+(j*(j-1)/2)+(i-1)*s 设一维数组sn(n+1)/2作为n阶对称矩阵a的存储结构,一维数组sk与上三角矩阵元素aij之间存在一一对应关系的公式如下:,16.07.2020,k=j*(j-1)/2+i-1 ( ij ),例:设有一个10阶方阵的对称矩阵a,采用压缩存储方式,

10、以行为主序存储,a11为第一个元素,其地址为1,每个元素占1个地址空间,则a85的地址为多少? 解: 方法1:因为: i=8,j=5,log(a11)=1,s=1。 所以: loc(a85)= loc(a11)+(i*(i-1)/2)+(j-1)*s = 1+(8*(8-1)/2+(j-1)*1=33。 故a85的地址为33。 方法2:因为: i=8,j=5,得知 i j。又log(a11)=1。 所以: k=i*(i-1)/2+j-1+1=8(8-1)/2+5-1+1=33。 故a85的地址为33。,若一维数组下标从0开始,则确定一维数组下标的公式为:,16.07.2020,三角矩阵的压缩存

11、储 三角矩阵也是一个n阶方阵,有上三角和下三角矩阵,下(上)三角矩阵是主对角线以上(下)元素均为零的n阶矩阵。,下:loc(aij)= loc(a11)+(i*(i-1)/2)+(j-1)*s,上:loc(aij)= loc(a11)+(j*(j-1)/2)+(i-1)*s,16.07.2020,三对角矩阵的压缩存储 在三对角矩阵中,所有的非零元素都集中在以对角线为中心的带状区域中。即除了主对角线和主对角线邻近的上下元素外,所有其他的元素均为零。对于n阶三对角矩阵ann,16.07.2020,loc(aij)=loc(a11)+(2*(i-1)+(j-1))*s,共有3n-2个非零元素,若按行

12、为主序,将三对角矩阵压缩到一个一维数组中,则存储次序为: a11,a12, a21,a22,a23,ann-1,ann 设三对角矩阵上的非零元素为aij,这里下标i和j满足i=j(主对角线上的元素),或 i=j-1 (主对角线上方的元素) 或 i=j+1 (主对角线下方的元素) ,按行为主序顺序压缩存储在计算机系统中的位置为:,矩阵a中元素的下标(i,j)与一维数组的下标k之间的关系为: k=2*(i-1)+j-1。,16.07.2020,m可由(1,2,12), (1,3,9), (3,1,-3), (3,6,14), (4,3,24), (5,2,18), (6,1,15), (6,4,-

13、7) 和矩阵维数及非零元素的个数(6,7,8)来 唯一确定。,稀疏矩阵的压缩存储 定义:非零元素比零元素少,且分布没有一定规律的矩阵。 压缩存储原则:只存矩阵的行/列维数、矩阵的非零元素的 个数和每个非零元素的行列下标及其值。,16.07.2020,三元组表所需存储单元个数为3(t+1) 其中t为非零元个数,6 7 8,1 2 12,1 3 9,3 1 -3,3 6 14,4 3 24,5 2 18,6 1 15,6 4 -7,mat0.i,mat0.j,mat0.v 分别存放矩阵行列维数和非零元个数,(1,2,12), (1,3,9), (3,1,-3), (3,6,14), (4,3,24

14、), (5,2,18), (6,1,15), (6,4,-7) 和(6,7,8)确定了稀疏矩阵。,1.稀疏矩阵的三元组存储方法: 结点定义: #define m 20 typedef struct node int i,j,v;jd; jd matm;,16.07.2020,6 7 8,1 2 12,1 3 9,3 1 -3,3 6 14,4 3 24,5 2 18,6 1 15,6 4 -7,0,0,0,7,0,0,15,0,0,0,0,0,18,0,0,0,0,0,24,0,0,0,14,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,9,12,0,-,-,=,m6x7,1

15、6.07.2020,2.稀疏矩阵的链式存储方法:(带行指针向量的单链表表示法) 把每行的非零元都存放在一个单链表中; 设置一个行指针数组,指向本行单链表的第一个非零元结点;若本行无非零元,则指针为空。 单链表结点类型定义:,16.07.2020, 4.2 字符串 1、字符串的定义 字符串(string)是字符的一个有限序列,它本质上就是数据元素类型为字符的线性表。字符串简称为串,一般记为: s=a1a2a3an 其中,s为串名,单引号为定界符;ai(1in)表示字符串中的第i个字符,n表示字符串中字符的个数,称为字符串的长度。 子串:一个串中任意多个连续的字符组成的子序列称为该串的子串。 主串

16、:包含该子串的串称为主串。 字符位置:一个字符在串中的序号,称为该字符在串中的位置。当一个字符在串中多次出现时,该字符在串中的位置,是指该字符在串中第一次出现的位置。子串在主串中的位置是指该子串的的第一个字符在主串中的位置。,16.07.2020,s4=student ;s5=student ,s1是s3和s4的主串;子串s3在主串s1中的位置为3;子串s4在主串s1中的位置为8;s4的长度为7;s5的长度为8。,2、字符串的基本操作:,(1) assign(s,t) 赋值:将串t的值赋给串s。 (2) equal(s,t) 判相等:s,t为串名或串值,若二者相等,则函数返回true,否则函数

17、返回false。 (3)length(s) 求串长:求串s的长度,返回值为串s的字符个数。,串相等:指两个串中的字符序列一一对应相等。 空 串:不含有任何字符(n=0),s=。 空格串:含有若干个真实的空格字符。,例:s1=i am a student;s2=teacher; s3=a;,16.07.2020,(4)substr(s,start,len) 取子串: 从串s中的第 startg个字符开始,抽取出len个字符构成一个新串。其中,参数应满足: 1startlength(s)且1lenlength(s)-start+1。 (5)concat(s1,s2) 连接:将s2的串值紧接着放在s

18、1串值 的末尾,组成一个新的串,新的串名为s1.。 (6)index(s1,s2) 定位: 若在主串 s1中存在与 s2相等的子串,则函数返回s1中第一个与s2相等的子串在主串s1中的位置,否则,函数返回 0。 (7)replace(s1,s2,s3) 替换 :该函数完成一个置换操作,操作结果是用串s3替换串s1中所有与串s2相等且不重叠的子串。,16.07.2020,3、字符串的存储结构,16.07.2020,假设s=student,c语言用字符数组存放字符串,其存储示意图如下:,串的基本运算: #define true 1 #define false 0 #define maxnum 1000 char smaxnum,tmaxnum; 1.求串长度的算法: int len(char s) int i; for (i=0;si!=0;i+); return(i); ,16.07.2020,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论