第二章数组习题解答

合集下载

数据结构第二章课后答案

数据结构第二章课后答案

数据结构第二章课后答案数据结构第二章课后答案1. 线性表1.1 数组实现线性表Q1. 请说明线性表的定义,并结合数组实现线性表的特点进行解释。

线性表是由n(n≥0)个数据元素构成的有序序列,其中n表示线性表的长度。

数组实现线性表的特点是使用一组具有相同数据类型的连续存储空间存储线性表中的元素,通过下标访问和操作元素。

A1. 线性表的定义指出,线性表是由若干个数据元素组成的有序序列。

具体地,在数组实现线性表中,我们将元素存储在一组连续的内存空间中,通过下标访问和操作元素。

由于数组的存储空间具有连续性,这样的实现方式可以在O(1)的时间复杂度下进行元素的访问和修改操作。

1.2 链表实现线性表Q2. 请说明链表实现线性表的特点,并与数组实现进行比较。

链表实现线性表的特点是通过指针将线性表中的元素按照节点的形式连接起来,每个节点包含了存储的元素和指向下一个节点的指针。

与数组实现相比,链表的插入和删除操作更为高效,但是访问某个位置的元素需要从头开始遍历,时间复杂度较大。

A2. 链表实现线性表的特点是通过使用节点和指针将线性表中的元素连接起来。

每个节点中包含了一个存储的元素和指向下一个节点的指针。

链表的插入和删除操作的时间复杂度为O(1),因为只需要改变指针的指向即可。

但是,访问某个位置的元素需要从头开始遍历链表,所以时间复杂度为O(n)。

2. 栈和队列2.1 栈的定义和基本操作Q3. 请给出栈的定义和基本操作。

栈是一种特殊的线性表,它只能在表的一端进行插入和删除操作,该端称为栈顶。

栈的基本操作包括入栈(push)和出栈(pop),分别用于将元素压入栈和将栈顶元素弹出。

A3. 栈是一种特殊的线性表,它只能在表的一端进行插入和删除操作。

这个特定的一端称为栈顶,而另一端称为栈底。

栈的基本操作包括入栈(push)和出栈(pop)。

入栈操作将一个元素压入栈顶,出栈操作将栈顶元素弹出。

2.2 队列的定义和基本操作Q4. 请给出队列的定义和基本操作。

数据结构课程第二章部分习题解答

数据结构课程第二章部分习题解答

数据结构课程第二章部分习题解答第二章数组2-1 设n个人围坐在一个圆桌周围,现在从第s个人开始报数,数到第m个人,让他出局;然后从出局的下一个人重新开始报数,数到第m个人,再让他出局,……,如此反复直到所有的人全部出局为止。

下面要解决的Josephus问题是:对于任意给定的n, s和m,求出这n个人的出局序列。

请以n = 9, s= 1, m= 5为例,人工模拟Josephus的求解过程以求得问题的解。

【解答】出局人的顺序为5, 1, 7, 4, 3, 6, 9, 2, 8。

2-2 试编写一个求解Josephus问题的函数。

用整数序列1, 2, 3, ……, n表示顺序围坐在圆桌周围的人,并采用数组表示作为求解过程中使用的数据结构。

然后使用n = 9, s = 1, m = 5,以及n = 9, s = 1, m = 0,或者n = 9, s = 1, m = 10作为输入数据,检查你的程序的正确性和健壮性。

最后分析所完成算法的时间复杂度。

【解答】函数源程序清单如下:void Josephus( int A[ ], int n, s, m ) {int i, j, k, tmp;if ( m== 0 ) {cout<< "m= 0是无效的参数!" << endl;return;}for ( i = 0;i < n;i++ ) A[i] =i + 1;/*初始化,执行n次*/ i = s- 1;/*报名起始位置*/for ( k = n;k > 1;i-- ) {/*逐个出局,执行n-1次*/if ( i ==k ) i = 0;i = ( i + m- 1 ) % k;/*寻找出局位置*/if ( i != k-1 ) {tmp = A[i]; /*出局者交换到第k-1位置*/for ( j = i;j < k-1;j++ )A[j] = A[j+1];A[k-1] = tmp;}}for ( k = 0;k < n / 2;k++ ) {/*全部逆置, 得到出局序列*/tmp= A[k];A[k] = A[n-k+1];A[n-k+1] = tmp;}}例:n = 9, s = 1, m = 50 1 2 3 4 5 6 7 8第4局, i= 2 k第3人出局, i= 1 k第6人出局, i= 1 k第9人出= 2 k第2人出局, i= 0第8人出局, i= 0最终出局顺序例:n = 9, s = 1, m = 0报错信息m= 0是无效的参数!例:n = 9, s = 1, m = 100 1 2 3 4 5 6 7 8第1人出局, i= 0第3人出局, i= 1第6人出局, i = 3 第2人出局, i = 0 第9人出局, i = 4k第5人出局, i = 1 第7人出局, i = 1k第4人出局, i= 0第8人出局, i= 0最终出局顺序当m= 1时,时间代价最大。

《数字信号处理》(2-7章)习题解答

《数字信号处理》(2-7章)习题解答

第二章习题解答1、求下列序列的z 变换()X z ,并标明收敛域,绘出()X z 的零极点图。

(1) 1()()2nu n (2) 1()()4nu n - (3) (0.5)(1)nu n --- (4) (1)n δ+(5) 1()[()(10)]2nu n u n -- (6) ,01na a <<解:(1) 00.5()0.50.5nn n n zZ u n z z ∞-=⎡⎤==⎣⎦-∑,收敛域为0.5z >,零极点图如题1解图(1)。

(2) ()()014()1414n nn n z Z u n z z ∞-=⎡⎤-=-=⎣⎦+∑,收敛域为14z >,零极点图如题1解图(2)。

(3) ()1(0.5)(1)0.50.5nnn n zZ u n z z --=-∞-⎡⎤---=-=⎣⎦+∑,收敛域为0.5z <,零极点图如题1解图(3)。

(4) [](1Z n z δ+=,收敛域为z <∞,零极点图如题1解图(4)。

(5) 由题可知,101010910109(0.5)[()(10)](0.5)()(0.5)(10)0.50.50.50.50.50.5(0.5)n n nZ u n u n Z u n Z u n z z z z z z z z z z z --⎡⎤⎡⎤⎡⎤--=--⎣⎦⎣⎦⎣⎦⋅=-----==--收敛域为0z >,零极点图如题1解图(5)。

(6) 由于()(1)nn n a a u n a u n -=+--那么,111()(1)()()()nn n Z a Z a u n Z a u n z z z a z a z a a z a z a ----⎡⎤⎡⎤⎡⎤=---⎣⎦⎣⎦⎣⎦=----=-- 收敛域为1a z a <<,零极点图如题1解图(6)。

(1) (2) (3)(4) (5) (6)题1解图2、求下列)(z X 的反变换。

习题2参考答案及数组广义表习题

习题2参考答案及数组广义表习题

习题2参考答案一、单项选择题1.A 2.A 3.D 4.C 5.D 6.A 7.B 8.B 9.C 10.A 11.D 12.B 13.C 14.B 15.C 16.C 17.B 18.D 19.C 20.A二、填空题1.线性2.n-i+13.相邻4.前移,前,后5.物理存储位置,链域的指针值6.前趋,后继7.顺序,链接8.一定,不一定9.线性,任何,栈顶,队尾,队头10.单链表,双链表,非循环链表,循环链表11.使空表和非空表统一;算法处理一致12.O(1),O(n)13.栈满,栈空,m,栈底,两个栈的栈顶在栈空间的某一位置相遇14.2、315.O(1)三、简答题1.头指针是指向链表中第一个结点(即表头结点)的指针;在表头结点之前附设的结点称为头结点;表头结点为链表中存储线性表中第一个数据元素的结点。

若链表中附设头结点,则不管线性表是否为空表,头指针均不为空,否则表示空表的链表的头指针为空。

2.线性表具有两种存储结构即顺序存储结构和链接存储结构。

线性表的顺序存储结构可以直接存取数据元素,方便灵活、效率高,但插入、删除操作时将会引起元素的大量移动,因而降低效率:而在链接存储结构中内存采用动态分配,利用率高,但需增设指示结点之间关系的指针域,存取数据元素不如顺序存储方便,但结点的插入、删除操作较简单。

3.应选用链接存储结构,因为链式存储结构是用一组任意的存储单元依次存储线性表中的各元素,这里存储单元可以是连续的,也可以是不连续的:这种存储结构对于元素的删除或插入运算是不需要移动元素的,只需修改指针即可,所以很容易实现表的容量的扩充。

4.应选用顺序存储结构,因为每个数据元素的存储位置和线性表的起始位置相差一个和数据元素在线性表中的序号成正比的常数。

因此,只要确定了其起始位置,线性表中的任一个数据元素都可随机存取,因此,线性表的顺序存储结构是一种随机存取的存储结构,而链表则是一种顺序存取的存储结构。

5.设尾指针比设头指针好。

C程序设计(数组)习题与答案

C程序设计(数组)习题与答案

一、单选题1、若有定义 char s[10];则在下面表达式中不表示s[1]的地址的是()。

A.s++B.&s[0]+1C.&s[1]D.s+1正确答案:A2、若有定义int a[5],*p=a;则对a数组元素的正确引用是()。

A.a+2B.*(a+2)C.*&a[5]D.*(p+5)正确答案:B3、若有定义int a[5],*p=a;则对a数组元素地址的正确引用是()。

A.p+5B.&a+1C.*a+1D.&a[0]正确答案:D4、若要对a进行合法的自减运算,则之前应有下面()的说明。

A.int b[10];int *a=b+1;B.int k;int *a=&k;C.int p[3];int *a=p;D.char *a[3];正确答案:A5、若有定义int x[10]={0,1,2,3,4,5,6,7,8,9},*p1;则数值不为3的表达式是()。

A.p1=x+3,*p1++B.x[3]C.p1=x+2,*++p1D.p1=x+2,*(p1++)正确答案:D6、设int x[]={1, 2, 3, 4, 5, 6, 7, 8, 9, 0},*p=x,k;且0≤k<10, 则对数组元素x[k]的错误引用是()。

A.x[p-x+k]B.p+kC.*(&x[k])D.*(x+k)正确答案:B7、设double *p[6];则()。

A.p是指针数组,其元素是指向double型变量的指针B.p是指向double型变量的指针C.p是double型数组D.p是数组指针,指向double型数组正确答案:A8、若有定义int x[6]={2,4,6,8,5,7},*p=x,i;要求依次输出x数组6个元素中的值,不能完成此操作的语句是()。

A.for(i=0;i<6;i++) printf("%2d",*p++);B.for(i=0;i<6;i++) printf("%2d",*(p+i));C.for(i=0;i<6;i++) printf("%2d",*(p++));D.for(i=0;i<6;i++) printf("%2d",(*p)++);正确答案:D9、下面程序执行后的输出结果是()。

数据结构第二章习题答案

数据结构第二章习题答案

数据结构第二章习题答案数据结构第二章习题答案第一题:给定一个数组arr,其中包含n个元素,要求编写一个函数,将数组中的所有元素按照奇偶性重新排列。

奇数元素排在偶数元素之前。

请给出实现代码。

解答:```pythondef rearrange(arr):n = len(arr)left = 0right = n - 1while left < right:while arr[left] % 2 != 0 and left < right:left += 1while arr[right] % 2 == 0 and left < right:right -= 1if left < right:arr[left], arr[right] = arr[right], arr[left]left += 1right -= 1return arr```第二题:给定一个字符串,判断其是否为回文串。

回文串是指正读和反读都相同的字符串。

要求不考虑大小写和非字母字符,只考虑字母字符。

解答:```pythondef is_palindrome(s):s = ''.join(filter(str.isalpha, s)).lower()return s == s[::-1]```第三题:给定一个链表,判断链表中是否存在环。

如果链表中存在环,则返回True,否则返回False。

解答:```pythonclass ListNode:def __init__(self, val=0, next=None):self.val = valself.next = nextdef has_cycle(head):slow = fast = headwhile fast and fast.next:slow = slow.nextfast = fast.next.nextif slow == fast:return Truereturn False```第四题:给定一个二叉树,判断其是否为平衡二叉树。

数据结构(数组和广义表)习题与答案

数据结构(数组和广义表)习题与答案

1、以行序优先顺序存储数组A[5][5];假定A[0][0]的地址为1000, 每个元素占4个字节,下标变量A[4][3]的地址是____。

A.1069B.1092C.1023D.1046正确答案:B2、数组a[1..6][1..5] (无0行0列)以列序优先顺序存储,第一个元素a[1][1]的地址为1000,每个元素占2个存储单元,则a[3][4]的地址是____。

A.1040B.1026C.1046D.1038正确答案:A3、设有一个5行4列的矩阵A,采用行序优先存储方式,A[0][0]为第一个元素,其存储地址为1000,A[2][2]的地址为1040,则A[3][0]的地址为_________。

A.1048B.1024C.1096D.1060正确答案:A4、设有一个10行10列的矩阵A,采用行序优先存储方式,存储全部数据需要400个字节的空间。

如果A[0][0]为第一个元素,其存储地址为1000,则A[3][6]的地址为_________。

A.1036B.1144C.1014D.10565、设有一个10行10列的矩阵A,采用行序优先存储方式。

如果A[0][0]为第一个元素,其存储地址为1000,A[2][3]的存储地址为1069,则存储一个元素需要的单元数是_________。

A.4B.1C.2D.3正确答案:D6、不能够对数据元素进行随机访问的物理结构是_________。

A.三元组顺序表B.对称矩阵的压缩存储C.三对角矩阵的压缩存储D.数组的顺序存储正确答案:A7、对特殊矩阵采用压缩存储的目的主要是_________。

A.表达变得简单B.去掉矩阵中的多余元素C.对矩阵元素的存储变得简单D.减少不必要的存储空间正确答案:D8、对n*n的对称矩阵进行压缩存储,需要保存的数据元素的个数是_________。

A.nB.n(n+1)/2C.n2D.n(n+1)9、设10*10的对称矩阵下三角保存SA[1..55]中,其中A[1][1]保存在SA[1]中,A[5][3] 保存在SA[k]中,这里k等于_________。

数据结构课后习题与解析第二章

数据结构课后习题与解析第二章

第二章习题1. 描述以下三个概念的区别:头指针,头结点,首元素结点。

2. 填空:(1)在顺序表中插入或删除一个元素,需要平均移动元素,具体移动的元素个数与有关。

(2)在顺序表中,逻辑上相邻的元素,其物理位置相邻。

在单链表中,逻辑上相邻的元素,其物理位置相邻。

(3)在带头结点的非空单链表中,头结点的存储位置由指示,首元素结点的存储位置由指示,除首元素结点外,其它任一元素结点的存储位置由指示。

3.已知L是无表头结点的单链表,且P结点既不是首元素结点,也不是尾元素结点。

按要求从下列语句中选择合适的语句序列。

a. 在P结点后插入S结点的语句序列是:。

b. 在P结点前插入S结点的语句序列是:。

c. 在表首插入S结点的语句序列是:。

d. 在表尾插入S结点的语句序列是:。

供选择的语句有:(1)P->next=S;(2)P->next= P->next->next;(3)P->next= S->next;(4)S->next= P->next;(5)S->next= L;(6)S->next= NULL;(7)Q= P;(8)while(P->next!=Q) P=P->next;(9)while(P->next!=NULL) P=P->next;(10)P= Q;(11)P= L;(12)L= S;(13)L= P;4. 设线性表存于a(1:arrsize)的前elenum个分量中且递增有序。

试写一算法,将X插入到线性表的适当位置上,以保持线性表的有序性。

5. 写一算法,从顺序表中删除自第i个元素开始的k个元素。

6. 已知线性表中的元素(整数)以值递增有序排列,并以单链表作存储结构。

试写一高效算法,删除表中所有大于mink且小于maxk的元素(若表中存在这样的元素),分析你的算法的时间复杂度(注意:mink和maxk是给定的两个参变量,它们的值为任意的整数)。

C语言(数组)习题与答案

C语言(数组)习题与答案

一、单选题1、下列描述中不正确的是()A.字符串的结束符是'\0'。

B.可以对字符型数组进行整体输入、输出。

C.字符型数组中能存放字符串。

D.字符串函数声明在ctype.h中。

正确答案:D2、下面是有关C语言字符数组的描述,其中错误的是()A.不可以用赋值语句给字符数组名赋字符串B.可以用输入语句把字符串整体输入给字符数组C.字符数组只能存放字符串D.字符数组中的内容不一定是字符串正确答案:C3、下面是对数组s的初始化操作,其中不正确的是()A.char s[5]= " ";B.char s[5]={'a'};C.char s[5]={"a"};D.char s[5]= "abcdef";正确答案:D4、下面叙述正确的是()A.字符串"123 "与"123"相等。

B.字符串"123"小于字符串"2"。

C.两个字符串所包含的字符个数不相同时,才能进行大小比较。

D.字符个数多的字符串比字符个数少的字符串大。

正确答案:B5、下面程序段的输出结果是()char a[7]=“123456”;char b[4]=”ABC”;strcpy(a,b);printf(“%c”,a[5]);A.\0B.C.5D.6正确答案:D6、以下对二维数组a的正确说明是__。

A.double a[1][4];B.float a(3)(4);C. floatf a(3,4);D. int a[3][];正确答案:A7、以下能对二维数组a进行正确初始化的语句是__。

A. int a[][3]={{1,2,3},{4,5,6}};B.int a[2][]={{1,0,1},{5,2,3}};C.int a [2][4]={{1,2,3},{4,5},{6}};D. int a[][3={{1,0,1},{},{1,1}};正确答案:A8、若有说明: int a[3][4]={0};则下面正确的叙述是__。

习题2-数值数组及向量化运算

习题2-数值数组及向量化运算

习题21.请读者先运行以下指令a=0;b=pi;t1=a:pi/9:pi;t2=linspace(a,b,10);T=t1*t2';F=find(T<0);然后,请回答变量a、t1、T、F的维度、规模、长度分别是多少t1完全等于t2吗为什么1)产生数据a=0;b=pi;t1=a:pi/9:pi;t2=linspace(a,b,10);T=t1*t2';F=find(T<0);2)罗列各变量的特征Na=ndims(a);Nt1=ndims(t1);NT=ndims(T);NF=ndims(F);Sa=size(a);St1=size(t1);ST=size(T);SF=size(F);La=length(a);Lt1=length(t1);LT=length(T);LF=length(F);fprintf('数组%7s%8s%8s%8s\n','a','t1','T','F')fprintf('维度数%5d%8d%8d%8d\n',Na,Nt1,NT,NF)fprintf('规模%5d%3d%5d%3d%5d%3d%5d%3d\n',Sa,St1,ST,SF)fprintf('长度%7d%8d%8d%8d\n',La,Lt1,LT,LF)数组 a t1 T F维度数 2 2 2 2规模 1 1 1 10 1 1 0 0长度 1 10 1 03)判断数组相等P=t1==t2 %对不同浮点计算方法获得的数进行比较的本指令,不推荐使用E=max(abs(t1-t2))P =1 1 1 1 1 1 0 1 11E =可见2个数组中的元素不完全相等。

应记住:这种现象在数值计算中常常会遇到;并且,若想检验同一个量的不同方法、途径算得的结果,应尽量不用“==”符判断,而应借助“两个量间的(相对)误差水平是否小于某个容差”进行判断。

黄文胜版数组练习册习题及讲解

黄文胜版数组练习册习题及讲解
6.若有定义int a,b[5];则以下输入函数格式正确的是()。
A.scanf(“%d”,a); B.scanf(“%d”,b[10]);
C.scanf(“%d”,&a); D.scanf(“%d”,&b);
7.下列对数组的定义正确的是()。
A.float sc(10); B.float sc[];
4.数组是一组同名变量的集合,通过下标访问其中的变量元素。()
5.数组的元素被称为下标变量,格式为数组名[下标]。()
6.定义数组时,初始化列表的数据个数不能超过数组长度。()
7.下标变量有同基本变量相同的操作特性。()
8.字符数组就是字符串。()
9.gets函数可用于输入中间有空格的字符串。()
10.puts函数可以输出整个字符数组的值。()
三、选择题
1.以下数组定义正确的是()
A.int aa[-1]; B.char 2cc[36];
C.char bb[0xFF]; D.float ff(5);
2.以下数组初始化犯错误的是()
A.int wl[5]={1,2,3,4,5}; B.char w2[]={‘a’,’b’,’c’};
C.float w3[10]={1,2,3,4,5}; D.flaot w4[3]={1,2,3,4,5};
构造数据对象——数组
(黄文胜 主编)
一、填空题
1、数组是一级有序的、连续存储的的变量的集合。
2.一维数组是指个数为一的数组。
3.在C语言中,数组元素的下标从开始。
4.定义一个名为pers,能存放10个整型数据的一维数组。
5.有数组定义:double gp [8];该数组长度为,最后一个元素的下标为。

(完整版)数据结构课后习题及解析第二章

(完整版)数据结构课后习题及解析第二章

第二章习题1.描述以下三个概念的区别:头指针,头结点,首元素结点。

2.填空:(1)在顺序表中插入或删除一个元素,需要平均移动元素,具体移动的元素个数与有关。

(2)在顺序表中,逻辑上相邻的元素,其物理位置相邻。

在单链表中,逻辑上相邻的元素,其物理位置相邻。

(3)在带头结点的非空单链表中,头结点的存储位置由指示,首元素结点的存储位置由指示,除首元素结点外,其它任一元素结点的存储位置由指示。

3.已知L是无表头结点的单链表,且P结点既不是首元素结点,也不是尾元素结点。

按要求从下列语句中选择合适的语句序列。

a. 在P结点后插入S结点的语句序列是:。

b. 在P结点前插入S结点的语句序列是:。

c. 在表首插入S结点的语句序列是:。

d. 在表尾插入S结点的语句序列是:。

供选择的语句有:(1)P->next=S;(2)P->next= P->next->next;(3)P->next= S->next;(4)S->next= P->next;(5)S->next= L;(6)S->next= NULL;(7)Q= P;(8)while(P->next!=Q) P=P->next;(9)while(P->next!=NULL) P=P->next;(10)P= Q;(11)P= L;(12)L= S;(13)L= P;4.设线性表存于a(1:arrsize)的前elenum个分量中且递增有序。

试写一算法,将X插入到线性表的适当位置上,以保持线性表的有序性。

5.写一算法,从顺序表中删除自第i个元素开始的k个元素。

6.已知线性表中的元素(整数)以值递增有序排列,并以单链表作存储结构。

试写一高效算法,删除表中所有大于mink且小于maxk的元素(若表中存在这样的元素),分析你的算法的时间复杂度(注意:mink和maxk是给定的两个参变量,它们的值为任意的整数)。

数组练习题及答案

数组练习题及答案

数组练习题及答案问题1:数组的基本操作题目:编写一个程序,实现以下功能:1. 初始化一个整型数组,大小为10,所有元素初始化为0。

2. 将数组中的元素依次设置为1到10。

3. 输出数组中的所有元素。

答案:```c#include <stdio.h>int main() {int arr[10] = {0};for (int i = 0; i < 10; i++) {arr[i] = i + 1;}for (int i = 0; i < 10; i++) {printf("%d ", arr[i]);}return 0;}```问题2:数组的反转题目:编写一个函数,实现对整数数组的反转。

答案:```cvoid reverseArray(int arr[], int size) {int start = 0;int end = size - 1;while (start < end) {int temp = arr[start];arr[start] = arr[end];arr[end] = temp;start++;end--;}}```问题3:数组的查找题目:编写一个函数,实现在数组中查找特定元素的索引,如果找到返回该元素的索引,如果未找到返回-1。

答案:```cint findElement(int arr[], int size, int element) {for (int i = 0; i < size; i++) {if (arr[i] == element) {return i;}return -1;}```问题4:数组的排序题目:使用冒泡排序算法对整数数组进行排序。

答案:```cvoid bubbleSort(int arr[], int size) {for (int i = 0; i < size - 1; i++) {for (int j = 0; j < size - i - 1; j++) {if (arr[j] > arr[j + 1]) {int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}}```问题5:数组的动态扩展题目:编写一个函数,实现对数组的动态扩展,使其能够存储更多的答案:```cvoid dynamicArrayExpansion(int *arr, int *size, int capacity, int newElement) {if (*size >= capacity) {int newCapacity = capacity * 2;int *newArr = (int *)malloc(newCapacity *sizeof(int));for (int i = 0; i < *size; i++) {newArr[i] = arr[i];}free(arr);arr = newArr;capacity = newCapacity;}arr[(*size)++] = newElement;}```结束语:这些练习题涵盖了数组的基本操作、查找、排序和动态扩展等常见问题,希望能够帮助您更好地理解和掌握数组的使用。

高中信息技术浙教版(2019)选修1 第二章 课时1 数组 学案(含答案)

高中信息技术浙教版(2019)选修1  第二章 课时1 数组   学案(含答案)

课时1数组课时目标1.通过案例分析,理解数组的概念和特性。

2.掌握数组的基本操作,并能编程解决实际问题。

1.数组的概念(1)数组在内存中的存储方式为____________。

(2)数组是由____________的变量构成的一个序列。

(3)数组名和下标组成数组的各个变量称为数组的分量,也称为____________。

(4)创建数组时,系统会在内存中分配一块__________的存储空间,每个数组元素按照________顺序存储。

(5)一维数组:只有一个下标,下标用来表示数据元素在该序列中的位置。

(6)二维数组:有两个下标,表示数据元素在该序列中的行、列位置,二维数组有行优先存储和列优先存储两种方式。

2.数组的特性(1)数组元素的数据类型相同。

(2)通过数组名和下标对数组元素的值进行访问。

(3)存储空间固定不变。

数组创建时就分配好存储空间,即其占用空间就已固定,因此删除数组中的元素后,其占用的空间不变。

3.数组的基本操作(1)数组的创建数组的创建实质是在系统内存中划分一块连续区域,用来保存数组所含的所有数据元素。

(2)数组元素的访问①数组元素的访问指的是寻址到特定的数据元素,并根据存储地址对该数据元素进行读取、修改等操作。

②数组元素可以通过数组名和下标直接进行访问。

(3)数组元素的插入与删除①当数组中某个位置要插入一个新数据时,必须先将该位置及后面的所有数据向后移动一个位置,然后将新数据插入。

例如,在数组a的1位置插入一个新数据datax,操作后的数组a如下所示。

②删除数组元素时,需要将被删除元素位置后的所有元素前移一个位置。

例如,删除数组元素a[1]后的数组如下图所示。

4.Python列表常用函数和方法在Python中,常用列表来模拟实现数组的操作。

Python列表常用函数和方法函数和方法功能实例len(list1)统计列表list1中元素的个数list1=[1,2,3,4]print(len(list1)),输出为4list1.append(x)在列表list1末尾添加元素xlist1=[1,2,3,4]list1.append(5)列表中的内容为:[1,2,3,4,5]list1.insert(i,x)在列表list1中下标为i位置处插入元素xlist1=[1,2,3,4]list1.insert(2,5)列表中的内容为:[1,2,5 3,4]list1.pop(i)将列表list1中下标为i的元素删除;若i不指定,默认list1=[1,2,3,4]list1.pop()为-1,即删除最后一个元列表中的内容为:[1,2,3]素例1下列有关数组的描述正确的是()A.数组是由多种不同类型的变量构成的一个序列B.数组是由相同类型的变量构成的一个序列C.一个数组在内存中的存储空间不一定是连续的D.数组在内存中的存储方式为非顺序结构听课笔记:变式训练有如下的Python程序段:a=[3,5,7,9,11,13,15]p=2for i in range(p+1,len(a)):a[i-1]=a[i]del a[i] #从列表中删除元素a[i]则与方框中程序段功能相同的语句是(注:pop()删除列表最后一个元素,del()删除列表指定范围元素)()A.a=a[:p]+a[p+1:]B.a=a[:p]+a[p:]C.a.pop()D.del a[p:]例2数组元素a[0]至a[n-1]依次存放着n个数据,现需要将元素a[n-1]插入在下标为x(0≤x<n-1)的位置,例如:n为5,数组a为[0,3,4,6,7],x为2,插入操作后a为[0,3,7,4,6]。

数组习题及答案

数组习题及答案

构造数据对象——数组一、填空题1.数组是一组相同的集合。

2.数组名代表数组的。

3.数组元素在数组中的位置序号称为它是从开始整数。

4.有int a[ ]={4,6,2,12,435,-9,76,0,0};该数组元素值最大的下标为。

5.定义数组tw,其能存储23个长整形数的语句为。

6.有说明语句int a[10]={1,2,3,4,5,6};则元素a[9]的值为。

7.数组char c[ ]=”abcd”中有个元素,最后一个元素是。

8.”a”在内存中占个存储单元。

9.定义一个能存放下字符串Vocation的字符数组enm的语句为。

10.定义一个可保存100个整型数的数组pn,并把每个元素初值设为0的语句是。

11.与puts(ss)等价的printf函数调用是。

二、选择题1.下面关于数组的说法,不正确的是()A.数组总为一个整体,可以参加算术运算B.数组中的数组元素相当于一个简单变量C.数组可以用来保存字符串D.数组是一组连续的,类型相同的数据集合2.下列说法不是数组特性的是()A.数组元素类型相同B.数组长度固定C.数组占用连续的内存空间D.数组可作为一个整体参与运算3.定义一个具有8个元素的整形数组,应使用语句()A.int a[8]; B.int a[2,4];C.int a[ ]; D.int *a[8];4. 以下能正确定义一维数组的选项是()A.int num[ ];B.#define N 100 int num[N];C.int num[0..100];D.int N=100;5.下面对s的初始化,不正确的是()A.char s[5]={“abcd”};B.char s[5]={‘a’,’b’,’c’};C.char s[5]=””;D.char s[5]=”abcd”;6.对以下说明语句正确的理解是()int a[10]={6,7,8,9,10,12};A.将6个初值依次赋值给a[1]至a[5];B.将6个初值依次赋值给a[0]至a[5];C.将6个初值依次赋值给a[5]至a[10];D.因数组长度和初值的个数不同,所以此语句不正确7.用scanf语句为数组a中的第二个数组元素输入数据,格式正确的是()A.scanf(“%d”,a[2]);B.scanf(“%d”,&a[2]);C.scanf(“%d”,&a[1]);D.scanf(“%d”,a(1));三、判断题1.数组在内存中占用的空间是不连续的。

第二章习题答案(作业)

第二章习题答案(作业)

第⼆章习题答案(作业)第⼆章习题答案2(1)为什么计算机内部采⽤⼆进制表⽰信息?既然计算机内部所有信息都⽤⼆进制表⽰,为什么还要⽤到⼗六进制和⼋进制数?参考答案:(略)2(7)为什么计算机处理汉字时会涉及到不同的编码(如,输⼊码、内码、字模码)?说明这些编码中哪些是⽤⼆进制编码,哪些不是⽤⼆进制编码,为什么?参考答案:(略)3.实现下列各数的转换。

(1)(25.8125)10= (?)2= (?) 8= (?) 16(2)(101101.011)2 = (?)10= (?) 8= (?) 16= (?) 8421(3)(0101 1001 0110.0011)8421 = (?)10= (?) 2= (?) 16(4)(4E.C)16 = (?)10= (?) 2参考答案:(1)(25.8125)10 = (1 1001.1101)2 = (31.64) 8 = (19.D) 16(2)(101101.011)2 = (45.375)10 = (55.3) 8 = (2D.6) 16 = (0100 0101.0011 0111 0101) 8421(3)(0101 1001 0110.0011)8421 = (596.3)10 = (1001010100.01001100110011…) 2 = (254.4CCC…) 16 (4)(4E.C)16 = (78.75)10 = (0100 1110.11) 24.假定机器数为8位(1位符号,7位数值),写出下列各⼆进制数的原码和补码表⽰。

+0.1001,–0.1001,+1.0,–1.0,+0.010100,–0.010100,+0,–0参考答案:(后⾯添0)原码补码+0.1001:0.1001000 0.1001000–0.1001: 1.1001000 1.0111000+1.0:溢出溢出–1.0:溢出 1.0000000+0.010100:0.0101000 0.0101000–0.010100: 1.0101000 1.1011000+0:0.0000000 0.0000000–0: 1.0000000 0.00000005.假定机器数为8位(1位符号,7位数值),写出下列各⼆进制数的补码和移码表⽰。

数据结构课后习题答案-完整版

数据结构课后习题答案-完整版

数据结构课后习题答案-完整版下面是《数据结构课后习题答案-完整版》的内容:---第一章:数组1. 题目:给定一个整数数组,判断是否存在两个元素之和等于目标值。

答案:使用双指针法,首先将数组排序,然后设置左指针指向数组头部,右指针指向数组尾部。

如果左指针和右指针指向的元素之和小于目标值,则左指针右移;如果大于目标值,则右指针左移;如果等于目标值,则找到了两个元素之和等于目标值的情况。

2. 题目:给定一个整数数组和一个目标值,找出数组中和为目标值的两个数的下标。

答案:使用哈希表,在遍历数组的过程中,将每个元素的值和下标存储在哈希表中。

遍历到当前元素时,检查目标值与当前元素的差值是否在哈希表中,如果存在,则找到了两个数的下标。

---第二章:链表1. 题目:给定一个链表,判断链表中是否存在环。

答案:使用快慢指针法,定义两个指针,一个指针每次向前移动一个节点,另一个指针每次向前移动两个节点。

如果存在环,则两个指针必定会相遇。

2. 题目:给定一个链表,删除链表的倒数第N个节点。

答案:使用双指针法,定义两个指针,一个指针先移动N个节点,然后两个指针同时向前移动,直到第一个指针到达链表尾部。

此时第二个指针指向的节点即为要删除的节点。

---第三章:栈和队列1. 题目:设计一个栈,使得可以在常数时间内获取栈中的最小元素。

答案:使用辅助栈来保存当前栈中的最小元素。

每次压栈操作时,将当前元素与辅助栈的栈顶元素比较,只有当前元素较小才将其压入辅助栈。

2. 题目:设计一个队列,使得可以在常数时间内获取队列中的最大元素。

答案:使用双端队列来保存当前队列中的最大值。

每次入队操作时,将当前元素与双端队列的末尾元素比较,只有当前元素较大才将其压入双端队列。

---第四章:树和二叉树1. 题目:给定一个二叉树,判断它是否是平衡二叉树。

答案:通过递归遍历二叉树的每个节点,计算每个节点的左子树高度和右子树高度的差值。

如果任意节点的差值大于1,则该二叉树不是平衡二叉树。

《C语言程序设计》课后习题答案第四版

《C语言程序设计》课后习题答案第四版

《C语言程序设计》课后习题答案第四版C语言程序设计课后习题答案第四版第一章基本概念和语法1.以下是一些基本概念和语法的习题答案:1.1 基本概念1.1.1 C语言是一种高级程序设计语言,最初由贝尔实验室的丹尼斯·里奇(Dennis Ritchie)于1972年开发。

1.1.2 C语言具有跨平台性,能够在多个操作系统上运行。

1.1.3 C语言程序是由函数构成的,每个程序都至少包含一个main函数。

1.2 数据类型和变量1.2.1 C语言中的基本数据类型包括整型(int)、浮点型(float)、字符型(char)和布尔型(bool)等。

1.2.2 变量是用来存储数据的内存位置,它们需要在使用前进行声明。

1.3 运算符和表达式1.3.1 运算符用来执行各种运算操作,例如加减乘除和逻辑运算等。

1.3.2 表达式由变量、常量和运算符组成,用来进行数据计算和逻辑判断。

1.4 控制语句1.4.1 if语句用于条件判断,根据条件的真假来选择执行不同的代码块。

1.4.2 for循环语句用于重复执行某段代码,可以设定循环次数或者循环条件。

1.4.3 switch语句用于多条件选择,根据不同的条件执行相应的代码块。

第二章数组和字符串2.以下是关于数组和字符串的习题答案:2.1 数组2.1.1 数组是一种用来存储多个相同类型数据的数据结构。

2.1.2 数组可以通过索引访问和修改其中的元素,索引从0开始。

2.1.3 数组的长度是固定的,声明时需指定数组的大小。

2.2 字符串2.2.1 字符串是由字符组成的数组,以空字符'\0'结尾。

2.2.2 字符串可以通过数组或者指针方式进行操作。

2.2.3 C语言提供了许多用于处理字符串的函数,例如strcpy、strcmp和strlen等。

第三章函数和指针3.以下是有关函数和指针的习题答案:3.1 函数3.1.1 函数是一段可重复调用的代码块,用于执行特定的任务。

数据结构实用教 程第二章课后习题答案

数据结构实用教 程第二章课后习题答案

数据结构实用教程(C语言版)DJ友情提醒:兔崽子们别老是抄答案,抄了也多想想为什么这么做2 线性表2.1 回答下列概念:线性结构,线性表,顺序表,单链表,静态链表线性结构:设Data_Structure =(D,S),r∈S,相对r,D中有且仅有一个开始结点和一个终端结点,其余的内部结点都有且仅有一个前趋和一个后继,则称Data_Structure是相对r的线性结构。

线性表:是具有相同属性的n(n≥0)个数据元素的有限序列。

顺序表:顺序表(Sequential List)是采用顺序存储结构的线性表。

单链表:每个结点只附加一个指向后继的指针域,这样的链表称为单链表(Single Linked List)静态链表:用数组实现的链表,指针就变换为数组的下标,结点即为数组中的下标变量,由于需要预先分配一个较大的数组空间,因此这种链表称之为静态链表。

2.2 比较顺序表和链表这两种线性表不同存储结构的特点。

1.逻辑关系的表示:顺序表隐含表示关系,链表显示表示关系。

2.存储密度:顺序表的存储密度大,而链表的存储密度小。

3.存储分配方式:顺序表的存储空间是预先静态分配的一块连续存储空间,在程序执行之前必须明确规定它的存储规模。

链表不用事先估计存储规模,动态分配和释放存储空间,存储空间可连续也可不连续。

4.存取方法:顺序表可以随机存取,链表必须顺序存取。

5.插入、删除操作:在顺序表中做插入、删除时平均移动表中一半的元素;在链表中作插入、删除时,只要修改指针域,而不需要移动元素。

所以顺序表的插入、删除效率低,链表的插入、删除效率高。

6.实现语言:顺序表容易实现,任何高级语言中都有数组类型。

而链表的操作是基于指针的,对于没有提供指针类型的高级语言,必须采用静态链表。

总之,两种存储结构各有长短,选择那一种由实际问题中的主要因素决定。

通常“较稳定”的线性表选择顺序存储,而频繁做插入、删除的线性表,即动态性较强的线性表宜选择链接存储。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第二章数组部分习题解答2-1 设n个人围坐在一个圆桌周围,现在从第s个人开始报数,数到第m个人,让他出局;然后从出局的下一个人重新开始报数,数到第m个人,再让他出局,……,如此反复直到所有的人全部出局为止。

下面要解决的Josephus问题是:对于任意给定的n, s和m,求出这n个人的出局序列。

请以n = 9, s = 1, m = 5为例,人工模拟Josephus的求解过程以求得问题的解。

【解答】出局人的顺序为5, 1, 7, 4, 3, 6, 9, 2, 8。

2-2 试编写一个求解Josephus问题的函数。

用整数序列1, 2, 3, ……, n表示顺序围坐在圆桌周围的人,并采用数组表示作为求解过程中使用的数据结构。

然后使用n = 9, s = 1, m = 5,以及n = 9, s = 1, m = 0,或者n = 9, s = 1, m = 10作为输入数据,检查你的程序的正确性和健壮性。

最后分析所完成算法的时间复杂度。

【解答】函数源程序清单如下:void Josephus( int A[ ], int n, s, m ) {int i, j, k, tmp;if ( m== 0 ) {cout << "m = 0是无效的参数!" << endl;return;}for ( i = 0;i < n;i++ ) A[i] = i + 1;/*初始化,执行n次*/i = s- 1;/*报名起始位置*/for ( k = n;k > 1;i-- ) {/*逐个出局,执行n-1次*/if ( i ==k ) i = 0;i = ( i + m- 1 ) % k;/*寻找出局位置*/if ( i != k-1 ) {tmp = A[i]; /*出局者交换到第k-1位置*/for ( j = i;j < k-1;j++ ) A[j] = A[j+1];A[k-1] = tmp;}}for ( k = 0;k < n / 2;k++ ) {/*全部逆置, 得到出局序列*/tmp = A[k];A[k] = A[n-k+1];A[n-k+1] = tmp;}}例:n = 9, s = 1, m = 5第5人出局, i = 4第1人出局, i = 0k = 7 第7人出局, i = 4k = 6 第4人出局, i = 2k = 5 第3人出局, i = 1k = 4 第6人出局, i = 1k = 3 第9人出局, i = 2k = 2 第2人出局, i = 0第8人出局, i = 0 逆置最终出局顺序例:n = 9, s = 1, m = 0报错信息m = 0是无效的参数!例:n = 9, s = 1, m = 10第1人出局, i = 0第3人出局, i = 1第6人出局, i = 3第2人出局, i = 0第9人出局, i = 4第5人出局, i = 1第7人出局, i = 1第4人出局, i = 0第8人出局, i = 0最终出局顺序当m = 1时,时间代价最大。

达到( n-1 ) + ( n-2 ) + ∙∙∙∙∙∙ + 1 = n(n-1)/2 O(n2)。

2-3 设有一个线性表(e0, e1, …, e n-2, e n-1) 存放在一个一维数组A[arraySize]中的前n个数组元素位置。

请编写一个函数将这个线性表原地逆置,即将数组的前n个原址内容置换为(e n-1, e n-2, …, e1, e0)。

【解答】template<class Type> void inverse ( Type A[ ], int n ) {Type tmp;for ( int i = 0;i <= ( n-1 ) / 2;i++ ) {tmp = A[i]; A[i] = A[n-i-1];A[n-i-1] = tmp;}}2-7 设有一个二维数组A[m][n],假设A[0][0]存放位置在644(10),A[2][2]存放位置在676(10),每个元素占一个空间,问A[3][3](10)存放在什么位置?脚注(10)表示用10进制表示。

【解答】设数组元素A[i][j]存放在起始地址为Loc ( i, j ) 的存储单元中。

∵Loc ( 2, 2 ) = Loc ( 0, 0 ) + 2 * n + 2 = 644 + 2 * n + 2 = 676.∴n = ( 676 - 2 - 644 ) / 2 = 15∴Loc ( 3, 3 ) = Loc ( 0, 0 ) + 3 * 15 + 3 = 644 + 45 + 3 = 692.2-9 设有一个n⨯n的对称矩阵A,如图(a)所示。

为了节约存储,可以只存对角线及对角线以上的元素,或者只存对角线或对角线以下的元素。

前者称为上三角矩阵,后者称为下三角矩阵。

我们把它们按行存放于一个一维数组B中,如图(b)和图(c)所示。

并称之为对称矩阵A的压缩存储方式。

试问:(1) 存放对称矩阵A上三角部分或下三角部分的一维数组B有多少元素?(2) 若在一维数组B中从0号位置开始存放,则如图(a)所示的对称矩阵中的任一元素a ij在只存上三角部分的情形下(图(b))应存于一维数组的什么下标位置?给出计算公式。

(3) 若在一维数组B中从0号位置开始存放,则如图(a)所示的对称矩阵中的任一元素a ij在只存下三角部分的情形下(图(c))应存于一维数组的什么下标位置?给出计算公式。

【解答】(1) 数组B共有n + ( n-1 ) +∙∙∙∙∙∙ + 1= n * ( n+1 ) / 2个元素。

(2) 只存上三角部分时,若i ≤ j,则数组元素A[i][j]前面有i-1行(1~i-1,第0行第0列不算),第1行有n个元素,第2行有n-1个元素,∙∙∙∙∙∙,第i-1行有n-i+2个元素。

在第i行中,从对角线算起,第j号元素排在第j-i+1个元素位置(从1开始),因此,数组元素A[i][j]在数组B中的存放位置为n + (n-1) + (n-2) + ∙∙∙∙∙∙ + (n-i+2) + j-i+1= (2n-i+2) * (i-1) / 2 + j-i+1= (2n-i) * (i-1) / 2 + j若i > j,数组元素A[i][j]在数组B中没有存放,可以找它的对称元素A[j][i]。

在数组B的第(2n-j) * (j-1) / 2 + i位置中找到。

如果第0行第0列也计入,数组B从0号位置开始存放,则数组元素A[i][j]在数组B中的存放位置可以改为当i ≤ j时,= (2n-i+1) * i / 2 + j - i = ( 2n - i - 1 ) * i / 2 + j当i > j时,= (2n - j - 1) * j / 2 + i(3) 只存下三角部分时,若i ≥ j,则数组元素A[i][j]前面有i-1行(1~i-1,第0行第0列不算),第1行有1个元素,第2行有2个元素,∙∙∙∙∙∙,第i-1行有i-1个元素。

在第i行中,第j号元素排在第j 个元素位置,因此,数组元素A[i][j]在数组B 中的存放位置为1 +2 + + (i -1) + j = ( i -1)*i / 2 + j若i < j ,数组元素A[i][j]在数组B 中没有存放,可以找它的对称元素A[j][i]。

在数组B 的第 (j -1)*j / 2 + i 位置中找到。

如果第0行第0列也计入,数组B 从0号位置开始存放,则数组元素A[i][j]在数组B 中的存放位置可以改为 当i ≥ j 时,= i*(i+1) / 2 + j 当i < j 时,= j*(j+1) / 2 + i2-10 设A 和B 均为下三角矩阵,每一个都有n 行。

因此在下三角区域中各有n (n +1)/2个元素。

另设有一个二维数组C ,它有n 行n +1列。

试设计一个方案,将两个矩阵A 和B 中的下三角区域元素存放于同一个C 中。

要求将A 的下三角区域中的元素存放于C 的下三角区域中,B 的下三角区域中的元素转置后存放于C 的上三角区域中。

并给出计算A 的矩阵元素a ij 和B 的矩阵元素b ij 在C 中的存放位置下标的公式。

【解答】计算公式2-14 字符串的替换操作replace (String &s , String &t , String &v )是指:若t 是s 的子串,则用串v 替换串t 在串s 中的所有出现;若t 不是s 的子串,则串s 不变。

例如,若串s 为“aabbabcbaabaaacbab”,串t 为“bab”,串v 为“abdc”,则执行replace 操作后,串s 中的结果为“aababdccbaabaaacabdc”。

试利用字符串的基本运算实现这个替换操作。

【解答】String & String :: Replace ( String & t , String &v ) {if ( ( int id = Find ( t ) ) == -1 )//没有找到,当前字符串不改,返回{ cout << "The (replace) operation failed." << endl; return *this; }⎪⎪⎪⎪⎪⎭⎫ ⎝⎛=----111110111000n n n n a a a a a a A ⎪⎪⎪⎪⎪⎭⎫ ⎝⎛=----111110111000n n n n b b b b b b B⎪⎪⎪⎪⎪⎪⎭⎫⎝⎛=-------------1111121110122222212011211111101020100000n n n n n n n n n n n n n b a a a a b b a a a b b b a a b b b b a C⎩⎨⎧<≥=时当时当],][[],][[]][[j i i j C j i j i C j i A ⎩⎨⎧<+≥+=时当时当],1][[],1][[]][[j i j i C j i i j C j i BString temp( ch );//用当前串建立一个空的临时字符串ch[0] = '\0';curLen = 0; //当前串作为结果串,初始为空int j, k = 0, l; //存放结果串的指针while ( id != -1 ) {for (j = 0;j < id;j++) ch[k++] = temp.ch[j];//摘取temp.ch中匹配位置id前面的元素到结果串ch。

相关文档
最新文档