第4章 数组
- 格式:docx
- 大小:38.06 KB
- 文档页数:7
数据结构(C语言版)(第2版)课后习题答案李冬梅2015.3目录第1章绪论 (1)第2章线性表 (5)第3章栈和队列 (13)第4章串、数组和广义表 (26)第5章树和二叉树 (33)第6章图 (43)第7章查找 (54)第8章排序 (65)第1章绪论1.简述下列概念:数据、数据元素、数据项、数据对象、数据结构、逻辑结构、存储结构、抽象数据类型。
答案:数据:是客观事物的符号表示,指所有能输入到计算机中并被计算机程序处理的符号的总称。
如数学计算中用到的整数和实数,文本编辑所用到的字符串,多媒体程序处理的图形、图像、声音、动画等通过特殊编码定义后的数据。
数据元素:是数据的基本单位,在计算机中通常作为一个整体进行考虑和处理。
在有些情况下,数据元素也称为元素、结点、记录等。
数据元素用于完整地描述一个对象,如一个学生记录,树中棋盘的一个格局(状态)、图中的一个顶点等。
数据项:是组成数据元素的、有独立含义的、不可分割的最小单位。
例如,学生基本信息表中的学号、姓名、性别等都是数据项。
数据对象:是性质相同的数据元素的集合,是数据的一个子集。
例如:整数数据对象是集合N={0,±1,±2,…},字母字符数据对象是集合C={‘A’,‘B’,…,‘Z’,‘a’,‘b’,…,‘z’},学生基本信息表也可是一个数据对象。
数据结构:是相互之间存在一种或多种特定关系的数据元素的集合。
换句话说,数据结构是带“结构”的数据元素的集合,“结构”就是指数据元素之间存在的关系。
逻辑结构:从逻辑关系上描述数据,它与数据的存储无关,是独立于计算机的。
因此,数据的逻辑结构可以看作是从具体问题抽象出来的数学模型。
存储结构:数据对象在计算机中的存储表示,也称为物理结构。
抽象数据类型:由用户定义的,表示应用问题的数学模型,以及定义在这个模型上的一组操作的总称。
具体包括三部分:数据对象、数据对象上关系的集合和对数据对象的基本操作的集合。
第四、五章串、数组和广义表练习题答案一.填空题1. 不包含任何字符(长度为0)的串称为空串;由一个或多个空格(仅由空格符)组成的串称为空白串。
2. 设S=“A;/document/Mary.doc”,则strlen(s)= 20 , “/”的字符定位的位置为3。
3. 子串的定位运算称为串的模式匹配;被匹配的主串称为目标串,子串称为模式。
4. 设目标T=”abccdcdccbaa”,模式P=“cdcc”,则第 6 次匹配成功。
5. 若n为主串长,m为子串长,则串的古典(朴素)匹配算法最坏的情况下需要比较字符的总次数为(n-m+1)*m。
6. 假设有二维数组A6×8,每个元素用相邻的6个字节存储,存储器按字节编址。
已知A的起始存储位置(基地址)为1000,则数组A的体积(存储量)为288 B ;末尾元素A57的第一个字节地址为1282 ;若按行存储时,元素A14的第一个字节地址为(8+4)×6+1000=1072 ;若按列存储时,元素A47的第一个字节地址为(6×7+4)×6+1000)=1276 。
(注:数组是从0行0列还是从1行1列计算起呢?由末单元为A57可知,是从0行0列开始!)7. 〖00年计算机系考研题〗设数组a[1…60, 1…70]的基地址为2048,每个元素占2个存储单元,若以列序为主序顺序存储,则元素a[32,58]的存储地址为8950 。
答:不考虑0行0列,利用列优先公式:LOC(a ij)=LOC(a c1,c2)+[(j-c2)*(d1-c1+1)+i-c1)]*L 得:LOC(a32,58)=2048+[(58-1)*(60-1+1)+32-1]]*2=89508. 三元素组表中的每个结点对应于稀疏矩阵的一个非零元素,它包含有三个数据项,分别表示该元素的行下标、列下标和元素值。
9.求下列广义表操作的结果:(1)GetHead【((a,b),(c,d))】=== (a, b) ; //头元素不必加括号(2)GetHead【GetTail【((a,b),(c,d))】】=== (c,d) ;(3)GetHead【GetTail【GetHead【((a,b),(c,d))】】】=== b ;(4)GetTail【GetHead【GetTail【((a,b),(c,d))】】】=== (d);10.C语言规定,字符串常量按_字符数组_____处理,它的值在程序的执行过程中是不能改变的。
数据结构(第二版)习题答案第4章第4章字符串、数组和特殊矩阵4.1稀疏矩阵常用的压缩存储方法有(三元组顺序存储)和(十字链表)两种。
4.2设有一个10 × 10的对称矩阵 A采用压缩方式进行存储,存储时以按行优先的顺序存储其下三角阵,假设其起始元素 a00的地址为 1,每个数据元素占 2个字节,则 a65的地址为( 53 )。
4.3若串S =“software”,其子串的数目为( 36 )。
4.4常对数组进行的两种基本操作为(访问数据元素)和(修改数组元素)。
4.5 要计算一个数组所占空间的大小,必须已知(数组各维数)和(每个元素占用的空间)。
4.6对于半带宽为 b的带状矩阵,它的特点是:对于矩阵元素 aij,若它满足(|i-j|>b),则 aij = 0。
4.7字符串是一种特殊的线性表,其特殊性体现在(该线性表的元素类型为字符)。
4.8试编写一个函数,实现在顺序存储方式下字符串的 strcompare (S1,S2)运算。
【答】:#include <stdio.h>#include <string.h>#define MAXSIZE 100typedef struct{char str[MAXSIZE];int length;}seqstring;/* 函数 strcompare()的功能是:当 s1>s2时返回 1,当 s1==s2时返回 0,当 s1<s2时返回-1*/int strcompare(seqstring s1,seqstring s2){ int i,m=0,len;len=s1.length<s2.length ?s1.length:s2.length;for(i=0;i<=len;i++)if(s1.str[i]>s2.str[i]){m=1;break;}else if(s1.str[i]<s2.str[i]){m=-1;break;}return m;}int main(){ seqstring s1,s2;int i,m;printf("input char to s1:\n");gets(s1.str);s1.length=strlen(s1.str);printf("input char to s2:\n");gets(s2.str);s2.length=strlen(s2.str);m=strcompare(s1,s2);if(m==1) printf("s1>s2\n");else if(m==-1) printf("s2>s1\n");else if(m==0) printf("s1=s2\n");}4.9试编写一个函数,实现在顺序存储方式下字符串的replace(S,T1,T2)运算。
第四章串和数组一.选择题1.串是一种特殊的线性表,其特殊性体现在()A.可以顺序存储B.数据元素是一个字符C.可以链式存储D.数据元素可以是多个字符2.串的长度是()A.串中不同字母的个数B.串中不同字符的个数C.串中所含字符的个数,且大于0 D.串中所含字符个数3.若串S=”software”,其子串数目是()A.8 B.37 C.36 D.94.数组A[0..5,0..6]的每个元素占5个单元,将其按列优先次序存储在起始地址为1000的连续内存单元中,则元素A[5][5]的地址为()A.1175 B.1180 C.1205 D.12105.对矩阵压缩存储是为了()A.方便运算B.节省存储空间C.方便存储D.提高运算速度6.一个n 阶对称矩阵,如果采用压缩存储方式,则容量为()A.n2B.n2/2 C.n(n+1)/2 D.(n+1)2/27.对稀疏矩阵采用压缩存储,其缺点之一是()A.无法判断矩阵有多少行多少列B.无法根据行列号查找某个矩阵元素C.无法根据行列号计算矩阵元素的存储地址D.使矩阵元素之间的逻辑关系更加复杂二.填空1.设串s1=”I am a student”,则串长为()2.设有两个串p和q,其中q是p的子串,求子串q 在p中首次出现位置的算法称为()3.一维数组的逻辑结构是(),存储结构是();对于二维或多维数组,分为按()和()两种不同的存储结构。
4.数组A[1..10,-2..6,2..8]以行优先顺序存储,设第一个元素的首地址为100,每个元素占3个单元的存储空间,则元素A[5][0][7]的存储地址为()5.三维数组R[C1..D1,C2..D2,C3..D3]共含有()个元素。
三、算法设计1.编写下列算法(假定下面所用的串均采用顺序存储方式,参数c、c1和c2均为字符型):(1)将串S中所有其值为c1的字符换成c2的字符。
(2)将串S中所有字符逆序(3)从串S中删除其值等于c的所有字符(4)从串S中第index个字符起求出首次与字符串S1相同的子串的起始位置(5)从串S中删除重第i个字符起的j 个字符(6)从串S中删除所有与串S1相同的子串(允许调用第(4)题和第(5)题的算法)2.设计程序,计算串str中每一个字符出现的次数。
第四章 数 组 本模块将描述Java编程语言中如何定义、初始化和使用数组。
第一节 相关问题 讨论──下列问题与本模块阐述的论题相关: 一个数组的用途是什么? 目 标
完成本模块的学习后,你应该能够: 声明并创建原始数组、类数组或数组类型 解释为什么数组的元素需初始化 给出数组定义并初始化数组元素 确定一个数组中元素的数量 创建多维数组 编写从一个数组类型到另一个数组类型数组值的拷贝代码 第三节 数组的声明
典型的数组是用来集合相同类型的对象并通过一个名称来引用这个集合。 你可以声明任何类型的数组──原始类型或类类型:
声明数组 相同类型的成组数据对象 原始类型或类类型数组声明 为一个引用创建空间 数组是一个对象,而不是为原始类型储备的存储器 char s[ ]; Point p ; // where point is a class 在Java编程语言中,即使数组是由原始类型构成,甚或带有其它类类型,数组也是一个对象。声明不能创建对象本身,而创建的是一个引用,该引用可被用来引用数组。数组元素使用的实际存储器可由new语句或数组初始化软件动态分配。 在以下部分,你将看到如何创建和初始化实际数组。 上述这种将方括号置于变量名之后的声明数组的格式,是用于C、C++和Java编程语言的标准格式。这种格式会使声明的格式复杂难懂,因而,Java编程语言允许一种替代的格式,该格式中的方括号位于变量名的左边: char[ ]s; Point[ ]p; 这样的结果是,你可以认为类型部分在左,而变量名在右。上述两种格式并存,你可选择一种你习惯的方式。声明不指出数组的实际大小。
注意----当数组声明的方括号在左边时,该方括号可应用于所有位于其右的变量
第四节 创建数组
你可以象创建对象一样,使用关键字new 创建一个数组。 s = new char 20; p = new Point 100; 第一行创建了一个20个char值的数组,第二行创建了一个100个类型Point的变量。r然而,它并不创建100个Point对象;创建100个对象的工作必须分别完成如下: p0 = new Point(); p1 = new Point(); · · · 用来指示单个数组元素的下标必须总是从0开始,并保持在合法范围之内--大于0或等于0并小于数组长度。任何访问在上述界限之外的数组元素的企图都会引起运行时出错。下面还要谈到一些更好的数组初始化方法。
第五节 初始化数组 初始化数组 初始化一个数组元素 用初始化值创建一个数组
创建数组 使用关键字new 创建一个数组对象 s = new char 20; p = new Point 100; p0 = new Point(); p1 = new Point(); · · · String names = “Georgianna”, “Jen”, “Simon”, ;
当创建一个数组时,每个元素都被初始化。在上述char数组s的例子中,每个值都被初始化为0 (\u0000-null)字符;在数组p的例子中, 每个值都被初始化为null,表明它还未引用一个Point对象。在经过赋值 p0 = new Point()之后,数组的第一个元素引用为实际Point对象。
注意--所有变量的初始化(包括数组元素)是保证系统安全的基础,变量绝不能在未初始化状态使用。
Java编程语言允许使用下列形式快速创建数组: String names = “Georgianna”, “Jen”, “Simon”, ; 其结果与下列代码等同: String names ; names = new String 3; names 0 = “Georgianna”; names 1 = “Jen”; names 2 = “Simon”; 这种”速记”法可用在任何元素类型。例如: Myclass array = new Myclass (), new Myclass (), new Myclass () ; 适当的类类型的常数值也可被使用: Color palette = color.blue, color.red, color.white ; 第六节 多维数组 多维数组 数组的数组 int twoDim [][] = new int [4][]; twoDim[0] = new int[5]; twoDim[1] = new int[5];
int twoDim [][] = new int [][4]; 非法 每个数组有5个整数类型的4个数组的数组 int twoDim [][] = new int [4][5]; twoDim[0] = new int[5]; twoDim[1] = new int[5];
Java编程语言没有象其它语言那样提供多维数组。因为一个数组可被声明为具有任何基础类型,所以你可以创建数组的数组(和数组的数组的数组,等等)。一个二维数组如下例所示: int twoDim [][] = new int [4][]; twoDim[0] = new int[5]; twoDim[1] = new int[5]; 首次调用new而创建的对象是一个数组,它包含4个元素,每个元素对类型array of int的元素都是一个null引用并且必须将数组的每个点分别初始化。
注意-尽管声明的格式允许方括号在变量名左边或者右边,但此种灵活性不适用于数组句法的其它方面。例如: new int 4是非法的。
多维数组 因为这种对每个元素的分别初始化,所以有可能创建非矩形数组的数组。也就是说,twoDim的元素可按如下方式初始化: twoDim0 = new int 2 twoDim1 = new int 4; twoDim2 = new int 6; twoDim3 = new int 8; 由于此种初始化的方法烦琐乏味,而且矩形数组的数组是最通用的形式,因而产生了一种”速记”方法来创建二维数组。例如: int twoDim = new int 45; 可被用来创建一个每个数组有5个整数类型的4个数组的数组。
第七节 数组界限 数组界限 所有数组的下标都从0开始 int list = new int 10; for (int i= 0; i< list.length; i++) System.out.println(listi); 在Java编程语言中,所有数组的下标都从0开始。 一个数组中元素的数量被作为具有length属性的部分数组对象而存储; 这个值被用来检查所有运行时访问的界限。如果发生了一个越出界限的访问,那么运行时的报错也就出现了。
多维数组 非矩形数组的数组 twoDim0 = new int 2; twoDim1 = new int 4; twoDim2 = new int 6; twoDim3 = new int 8;
每个数组有5个整数类型的4个数组的数组 int twoDim = new int 45; 使用length属性的例子如下: int list = new int 10; for (int i= 0; i< list.length; i++) System.out.println(listi); 使用length属性使得程序的维护变得更简单。
第八节 拷贝数组
数组一旦创建后,其大小不可调整。然而,你可使用相同的引用变量来引用一个全新的数组: int myArray = new int 6; myArray = new int 10; 在这种情况下,第一个数组被有效地丢失,除非对它的其它引用保留在其它地方。
拷贝数组
Java编程语言在System类中提供了一种特殊方法拷贝数组,该方法被称作arraycopy()。例如,araycopy可作如下使用: // original array 1.int myArray[] = { 1, 2, 3, 4, 5, 6 }; 2. 3.// new larger array 4.int hold[] = { 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 }; 5.// copy all of the myArray array to the hold 6.// array, starting with the 0th index 7.System.arraycopy(myArray, 0, hold, 0, 8.myArray.length);
在这一点,数组hold有如下内容:1,2,3,4,5,6,4,3,2,1。
拷贝数组 System.arraycopy()方法 // original array 1.int myArray[] = { 1, 2, 3, 4, 5, 6 }; 2. 3.// new larger array 4.int hold[] = { 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 }; 5.// copy all of the myArray array to the hold 6.// array, starting with the 0th index 7.System.arraycopy(myArray, 0, hold, 0, 8.myArray.length);
拷贝数组 不能调整数组的大小 可使用相同的引用变量来引用一个全新的数组 int elements = new int 6; elements = new int 10;