数据结构第4章作业参考答案
数据结构1-4章习题答案

第1章概论习题参考解答一、填空题1、数据的逻辑结构是数据元素之间的逻辑关系,通常有下列4类:()、()、()、()。
【答】集合、线性结构、树型结构和图状结构。
2、数据的存储结构是数据在计算机存储器里的表示,主要有4种基本存储方法:()、()、()、()。
【答】顺序存储方法、链接存储方法、索引存储方法和散列存储方法。
二、选择题1、一个算法必须在执行有穷步之后结束,这是算法的()。
(A)正确性(B)有穷性(C)确定性(D)可行性【答】B。
2、算法的每一步,必须有确切的定义。
也就是说,对于每步需要执行的动作必须严格、清楚地给出规定。
这是算法的()。
(A)正确性(B)有穷性(C)确定性(D)可行性【答】C。
3、算法原则上都是能够由机器或人完成的。
整个算法好像是一个解决问题的“工作序列”,其中的每一步都是我们力所能及的一个动作。
这是算法的()。
(A)正确性(B)有穷性(C)确定性(D)可行性【答】D。
三、简答题1、算法与程序有何异同?【答】尽管算法的含义与程序非常相似,但两者还是有区别的。
首先,一个程序不一定满足有穷性,因此它不一定是算法。
例如,系统程序中的操作系统,只要整个系统不遭受破坏,它就永远不会停止,即使没有作业要处理,它仍处于等待循环中,以待一个新作业的进入。
因此操作系统就不是一个算法。
其次,程序中的指令必须是计算机可以执行的,而算法中的指令却无此限止。
如果一个算法采用机器可执行的语言来书写,那么它就是一个程序。
2、什么是数据结构?试举一个简单的例子说明。
【答】数据结构是指数据对象以及该数据对象集合中的数据元素之间的相互关系(即数据元素的组织形式)。
例如,队列的逻辑结构是线性表(先进先出);队列在计算机中既可以采用顺序存储也可以采用链式存储;对队列可进行删除、插入数据元素以及判断是否为空队列、将队列置空等操作。
3、什么是数据的逻辑结构?什么是数据的存储结构?【答】数据元素之间的逻辑关系,也称为数据的逻辑结构。
数据结构答案第4章

第 4 章广义线性表——多维数组和广义表2005-07-14第 4 章广义线性表——多维数组和广义表课后习题讲解1. 填空⑴数组通常只有两种运算:()和(),这决定了数组通常采用()结构来实现存储。
【解答】存取,修改,顺序存储【分析】数组是一个具有固定格式和数量的数据集合,在数组上一般不能做插入、删除元素的操作。
除了初始化和销毁之外,在数组中通常只有存取和修改两种操作。
⑵二维数组A中行下标从10到20,列下标从5到10,按行优先存储,每个元素占4个存储单元,A[10][5]的存储地址是1000,则元素A[15][10]的存储地址是()。
【解答】1140【分析】数组A中每行共有6个元素,元素A[15][10]的前面共存储了(15-10)×6+5个元素,每个元素占4个存储单元,所以,其存储地址是1000+140=1140。
⑶设有一个10阶的对称矩阵A采用压缩存储,A[0][0]为第一个元素,其存储地址为d,每个元素占1个存储单元,则元素A[8][5]的存储地址为()。
【解答】d+41【分析】元素A[8][5]的前面共存储了(1+2+…+8)+5=41个元素。
⑷稀疏矩阵一般压缩存储方法有两种,分别是()和()。
【解答】三元组顺序表,十字链表⑸广义表((a), (((b),c)),(d))的长度是(),深度是(),表头是(),表尾是()。
【解答】3,4,(a),((((b),c)),(d))⑹已知广义表LS=(a,(b,c,d),e),用Head和Tail函数取出LS中原子b的运算是()。
【解答】Head(Head(Tail(LS)))2. 选择题⑴二维数组A的每个元素是由6个字符组成的串,行下标的范围从0~8,列下标的范围是从0~9,则存放A至少需要()个字节,A的第8列和第5行共占()个字节,若A按行优先方式存储,元素A[8][5]的起始地址与当A按列优先方式存储时的()元素的起始地址一致。
数据结构第四五六七章作业答案

数据结构第四五六七章作业答案数据结构第四、五、六、七章作业答案第四章和第五章一、填空题1.不包含任何字符(长度为0)的字符串称为空字符串;由一个或多个空格(仅空格字符)组成的字符串称为空白字符串。
2.设s=“a;/document/mary.doc”,则strlen(s)=20,“/”的位置为3。
3.子串的定位操作称为串模式匹配;匹配的主字符串称为目标字符串,子字符串称为模式。
4、串的存储方式有顺序存储、堆分配存储和块链存储5.有一个二维数组a[0:8,1:5],每个数组元素用四个相邻字节存储,内存用字节寻址。
假设存储阵列元素a[0,1]的地址为100,如果以主行顺序存储,则a[3,5]的地址为176,[5,3]的地址为208。
如果按列存储,[7,1]的地址为128,[2,4]的地址为216。
6、设数组a[1…60,1…70]的基地址为2048,每个元素占2个存储单元,若以列序为主序顺序存储,则元素a[32,58]的存储地址为8950。
7、三元素组表中的每个结点对应于稀疏矩阵的一个非零元素,它包含有三个数据项,分别表示该元素的行下标、列下标和元素值。
8、二维数组a[10][20]采用列序为主方式存储,每个元素占10个存储单元,且a[0][0]的存储地址是2000,则a[6][12]的地址是32609.已知二维数组a[20][10]按行顺序存储,每个元素占2个存储单元,a[10][5]的存储地址为1000,则a[18][9]的存储地址为116810。
已知二维数组a[10][20]按行顺序存储,每个元素占2个存储单元,a[0][0]的存储地址为1024,则a[6][18]的地址为130011,两个字符串相等。
充要条件是长度相等,相应位置的字符相同。
12、二维数组a[10][20]采用列序为主方式存储,每个元素占一个存储单元,并且a[0][0]的存储地址是200,则a[6][12]的地址是200+(12*10+6)=326。
数据结构课后习题答案第四章

第四章一、简述下列每对术语的区别:空串和空白串;串常量和串变量;主串和子串;静态分配的顺序串和动态分配的顺序串;目标串和模式串;有效位移和无效位移。
答:●空串是指不包含任何字符的串,它的长度为零。
空白串是指包含一个或多个空格的串,空格也是字符。
●串常量是指在程序中只可引用但不可改变其值的串。
串变量是可以在运行中改变其值的。
●主串和子串是相对的,一个串中任意个连续字符组成的串就是这个串的子串,而包含子串的串就称为主串。
●静态分配的顺序串是指串的存储空间是确定的,即串值空间的大小是静态的,在编译时刻就被确定。
动态分配的顺序串是在编译时不分配串值空间,在运行过程中用malloc和free等函数根据需要动态地分配和释放字符数组的空间(这个空间长度由分配时确定,也是顺序存储空间)。
●目标串和模式串:在串匹配运算过程中,将主串称为目标串,而将需要匹配的子串称为模式串,两者是相对的。
●有效位移和无效位移:在串定位运算中,模式串从目标的首位开始向右位移,每一次合法位移后如果模式串与目标中相应的字符相同,则这次位移就是有效位移(也就是从此位置开始的匹配成功),反之,若有不相同的字符存在,则此次位移就是无效位移(也就是从此位置开始的匹配失败)。
二、假设有如下的串说明:char s1[30]="Stocktom,CA", s2[30]="March 5 1999", s3[30], *p;(1)在执行如下的每个语句后p的值是什么?p=stchr(s1,'t'); p=strchr(s2,'9'); p=strchr(s2,'6');(2)在执行下列语句后,s3的值是什么?strcpy(s3,s1); strcat(s3,","); strcat(s3,s2);(3)调用函数strcmp(s1,s2)的返回值是什么?(4)调用函数strcmp(&s1[5],"ton")的返回值是什么?(5)调用函数stlen(strcat(s1,s2))的返回值是什么?解:(1) stchr(*s,c)函数的功能是查找字符c在串s中的位置,若找到,则返回该位置,否则返回NULL。
数据结构(第二版)习题答案第4章

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");
free(S);
free(T1);
free(T2);
}
【参考程序
2】:
#include<stdio.h>
#define MAXSIZE 100
typedef struct{
char str[MAXSIZE];
int length;
}seqstring;
for(k=0;k<t2.length;k++)
s->str[c+k]=t2.str[k];
else if(t1.length<t2.length)
{ for(m=s->length-1;m>i-1;m--)
s->str[t2.length-t1.length+m]=s->str[m]; //后移留空
while (i<t->length && j<p->length)
{
if(j==-1||t->str[i]==p->str[j])
{i++; j++;}
else j=next[j];
}
if (j==p->length) return (i-p->length);
数据结构第四章串习题及答案

习题四串一、单项选择题1.下面关于串的的叙述中,哪一个是不正确的?()A.串是字符的有限序列 B.空串是由空格构成的串C.模式匹配是串的一种重要运算 D.串既可以采用顺序存储,也可以采用链式存储2.串是一种特殊的线性表,其特殊性体现在()。
A.可以顺序存储 B.数据元素是一个字符C.可以链接存储 D.数据元素可以是多个字符3.串的长度是指()A.串中所含不同字母的个数 B.串中所含字符的个数C.串中所含不同字符的个数 D.串中所含非空格字符的个数4.设有两个串p和q,其中q是p的子串,求q在p中首次出现的位置的算法称为()A.求子串 B.联接 C.匹配 D.求串长5.若串S=“softwa re”,其子串的个数是()。
A.8 B.37 C.36 D.9二、填空题1.含零个字符的串称为______串。
任何串中所含______的个数称为该串的长度。
2.空格串是指__ __,其长度等于__ __。
3.当且仅当两个串的______相等并且各个对应位置上的字符都______时,这两个串相等。
一个串中任意个连续字符组成的序列称为该串的______串,该串称为它所有子串的______串。
4.INDEX(‘DATAST RUCTU RE’,‘STR’)=________。
5.模式串P=‘abaabc ac’的next函数值序列为________。
6.下列程序判断字符串s是否对称,对称则返回1,否则返回0;如 f("abba")返回1,f("abab")返回0;int f((1)__ ______){int i=0,j=0;while(s[j])(2)___ _____;for(j--; i<j && s[i]==s[j]; i++,j--);return((3)___ ____)}7.下列算法实现求采用顺序结构存储的串s和串t的一个最长公共子串。
数据结构与算法课程第4章的习题答案

case0: bonus=i*0.1;break;
case1: bonus=bonus1+(i-100000)*0.075;break;
case2:
case3:bonus=bonus2+(i-200000)*0.05;break;
case4:
case5:bonus=bonus4+(i-400000)*0.03;break;
第4章
4.1程序阅读题。以下程序运行结果是什么?
#includestdio.h
void main() {
int i1;
while (i15)
if (i3!2)continue;
else printf(d,i);
printf(\n);
}
结果为:2 5 8 11 14
4.2程序填空题。输出右边所示图案(共N行,N为奇数,此时N=7)。
}
注意:s、t不能定义为int,long型,因为这两种数据类型的范围都不超过21亿,无法容纳最后求的结果。
(6)求s=a+aa+aaa+…+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加由键盘输入控制。
程序流程图:
程序代码:
#include<stdio.h>
bonus2=bonus1+100000*0.075;
bonus4=bonus2+200000*0.05;
bonus6=bonus4+200000*0.03;
bonus10=bonus6+400000*0.015;
数据结构第四章的习题答案

数据结构第四章的习题答案数据结构第四章的习题答案在学习数据结构的过程中,习题是非常重要的一环。
通过解答习题,我们可以更好地理解和应用所学的知识。
在第四章中,我们学习了树和二叉树的相关概念和操作。
下面我将为大家提供一些第四章习题的答案,希望能帮助大家更好地掌握这一章节的内容。
1. 请给出树和二叉树的定义。
树是由n(n>=0)个结点构成的有限集合,其中有且仅有一个特定的结点称为根结点,其余的结点可以分为若干个互不相交的有限集合,每个集合本身又是一个树,称为根的子树。
二叉树是一种特殊的树结构,其中每个结点最多有两个子结点,分别称为左子结点和右子结点。
二叉树具有递归的定义,即每个结点的左子树和右子树都是二叉树。
2. 请给出树和二叉树的遍历方式。
树的遍历方式包括前序遍历、中序遍历和后序遍历。
前序遍历是先访问根结点,然后依次遍历左子树和右子树。
中序遍历是先遍历左子树,然后访问根结点,最后遍历右子树。
后序遍历是先遍历左子树和右子树,最后访问根结点。
二叉树的遍历方式包括前序遍历、中序遍历和后序遍历。
前序遍历是先访问根结点,然后依次遍历左子树和右子树。
中序遍历是先遍历左子树,然后访问根结点,最后遍历右子树。
后序遍历是先遍历左子树和右子树,最后访问根结点。
3. 给定一个二叉树的前序遍历序列和中序遍历序列,请构建该二叉树。
这个问题可以通过递归的方式解决。
首先,根据前序遍历序列的第一个结点确定根结点。
然后,在中序遍历序列中找到根结点的位置,该位置左边的结点为左子树的中序遍历序列,右边的结点为右子树的中序遍历序列。
接下来,分别对左子树和右子树进行递归构建。
4. 给定一个二叉树的中序遍历序列和后序遍历序列,请构建该二叉树。
和前面的问题类似,这个问题也可以通过递归的方式解决。
首先,根据后序遍历序列的最后一个结点确定根结点。
然后,在中序遍历序列中找到根结点的位置,该位置左边的结点为左子树的中序遍历序列,右边的结点为右子树的中序遍历序列。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第4章(数组和广义表)作业参考答案一、单项选择题1.将一个A[1..100,1..100]的三对角矩阵,按行优先压缩存储到一维数组B[1‥298]中,A 中元素A[66][65]在B数组中的位置K为(C )。
A. 198B. 197C. 195D. 1962.广义表(a,(b,c),d,e)的表头为( A )。
A. aB. a,(b,c)C. (a,(b,c))D. (a)3.在三对角矩阵中,非零元素的行标i和列标j的关系是( A )。
A. |i-j|≤1B. i>jC. i==jD. i<j4.广义表L=(a,(b,c)),进行Tail(L)操作后的结果为( D )。
A. cB. b,cC.(b,c)D.((b,c))5.设二维数组A[1..m,1..n](即m行n列)按行存储在数组B[1..m*n]中,则二维数组元素A[i,j]在一维数组B中的下标为( D )。
A. j*m+i-1B. (i-1)*n+j-1C. i*(j-1)D. (i-1)*n+j6.广义表(( ),( ),( ))的深度为( C )。
A. 0B. 1C. 2D. 37.假设以行序为主序存储二维数组A[0..99,0..99],设每个数据元素占2个存储单元,基地址为10,则LOC(A[4][4])=( C )。
A. 1020B. 1010C. 818D. 8088.已知广义表A=((a,b),(c,d)),则head(A)等于( A )。
A. (a,b)B. ((a,b))C. a,bD. a9.已知一个稀疏矩阵的三元组表如下:(1,2,3),(1,6,1),(3,1,5),(3,2,-1),(4,5,4),(5,1,-3)则其转置矩阵的三元组表中第3个三元组为( C )。
A. (2,3,-1)B. (3,1,5)C. (2,1,3)D. (3,2,-1)10.广义表((b,c),d,e)的表尾为( C )。
A. eB. (e)C. (d,e)D. d,e11.设有一个10阶对称矩阵A,采用压缩存储方式,以行序为主序存储,a[1][1]为第一个元素,其存储地址为1,每个元素占一个字节,则a[8][5]的地址为( B )。
A. 13B. 33C. 18D. 4012.已知广义表:A=(a,b), B=(A,A), C=(a,(b,A),B), 求下列运算的结果:tail(head(tail(C))) =( B )。
A. (a)B. (A)C. aD. A13.将一个100阶的三对角矩阵A按行优先存入一维数组B中,下标的下界都从0开始,则A中的元素A[65][64]在数组B中的位置为( B )。
A. 195B. 194C. 196D. 19714.已知广义表的表头为a,表尾为(b,c),则此广义表为( A )。
A. (a,b,c)B. (a,(b,c))C. ((a),b,c)D. ((a,b,c))15.将n阶对称矩阵A的下三角部分以行序为主序压缩存储到一维数组B中,A的下标下界为0,B的下标下界为1。
那么,A中的任一下三角元素a ij在矩阵B中的位置为( D )。
A. i(i+1)/2+j B. i(i+1)/2+j-1 C. j(j+1)/2+i D. i(i+1)/2+j+116.广义表(a,(b,c),d,e)的表尾是( C )。
A. (a,(b,c))B. a,(b,c)C. ((b,c),d,e)D. (a)17.设有一个二维数组A[m][n],假设A[0][0]存放位置在644,A[2][2]存放位置在676,每个元素占一个空间,则A[3][3]存放的位置是( D )。
A. 688B. 678C. 696D. 69218.广义表G=(a,(a,(a)))的长度为( B )。
A. 1B. 2C. 3D. 419.设有一个10阶的下三角矩阵A(包括对角线),按照从上到下、从左到右的顺序存储到连续的55个存储单元中,每个数组元素占1个字节的存储空间,则A[5][4]地址与A[0][0]的地址之差为( C )。
A. 10B. 28C. 19D. 5520.下面说法不正确的是( B )。
A. 广义表的表尾总是一个广义表B. 广义表的表头总是一个广义表C. 广义表难以用顺序存储结构来存储表示D. 广义表可以是一个多层次的结构21.广义表(a,(b,c),d,e)的表头为( A )。
A. aB. a,(b,c)C. (a,(b,c))D. (a)二、判断题1.对称矩阵压缩存储后不会失去随机存取功能。
(√)2.数组可以看成线性结构的一种推广,可以对它进行插入、删除等操作。
(×)3.二维以上的数组其实是一种特殊的广义表。
(√)4.广义表的取表尾运算,其结果通常是个表,但有时也可以是个单元素值。
(×)5.若一个广义表的表头为空表,则此广义表也为空表。
(×)6.若一个广义表的表头为空,则此广义表为空表。
(√)7.广义表中的元素或者是一个不可分的原子,或者是一个非空的广义表。
(×)8.一个广义表不能是其自身的一个元素。
(×)9.广义表的同级元素具有线性关系。
(√)10.一个广义表可以为其它广义表所共享。
(√)三、应用题1.已知广义表A=(((a)),(b),c,((d),e,f)),请回答下面问题:(1)画出该广义表的孩子兄弟存储结构图(即扩展的线性链表存储结构);(2)计算表的长度;(3)用求头部、尾部的方式求出e,写出算式。
设head(L)为求表头操作,tail(L)为求表尾操作。
答案:(1)广义表A=(((a)),(b),c,((d),e,f))的孩子兄弟存储结构如下图所示。
(2)表的长度为4(3)head(tail(head(tail(tail(tail(A))))))。
2.二维数组A[-1..9,1..11],下标范围分别是-1..9和1..11,每个元素的长度为32个二进位,从首地址S开始连续存放主存储器中,主存储器字长为16位。
求:(1)存放该数组需要多少单元?(2)存放数组第4列所有元素至少需要多少单元?(3)数组按行存放时,元素A[7][4]的起始地址是多少?(4)数组按列存放时,元素A[4][7]的起始地址是多少?答案:(1)242(2)22(3)s+182(4)s+1423.已知广义表L=(a,(b,(c,d)),(e,f))(1)画出头尾链表存储结构图;(2)计算表的长度;(3)用求头部,尾部的方式求出元素c,写出计算公式。
设Head(L)为求表头操作,Tail(L)为求表尾操作。
答案:(1)头尾链表存贮结构图:(2)表的长度是3。
(3)求元素c的计算公式为:Head(Head(Tail((Head(Tail(L))))))4.已知A为n*n稀疏矩阵,试从空间和时间角度,比较采用两种不同的存储结构(二维数组和三元组表)完成主对角线元素求和运算的优缺点。
答案:空间角度:稀疏矩阵A采用二维数组存储时,需要n*n个存储单元。
但采用三元组表时,设非零元素个数为t,需3(t+1)个存储单元(第一个分量中存稀疏矩阵A的行数,列数和非零元素个数,以后t个分量存各非零元素的行值、列值、元素值)。
采用三元组表存稀疏矩阵时比二维数组节省存储单元。
时间角度:完成求Σa ii(1<=i<=n)时,由于二维数组存储时可以随机存取a[i][i],速度快,需要O(n)的时间。
但采用三元组表时,要扫描整个三元组表才能找到所有i=j的元素,求和的时间性能为O(t)。
一般情况下t>n, 所以计算Σa ii(1<=i<=n)时,采用二维数组比用三元组表快。
5.三维数组A[1..10,-2..6,2..8]的每个元素的长度为4个字节,(1)试问该数组要占多少个字节的存储空间?(2)如果数组元素以行优先的顺序存放,设第一个元素的首地址是100,试求元素A[5,0,7] 的存贮首地址。
答案:(1)数组占的存储字节数=10*9*7*4=2520;(2)A[5,0,7]的存储地址=100+[4*9*7+2*7+5]*4=11846.已知广义表( a,((),b),(((e)))),(1)画出该广义表的头尾链表存储结构图。
(2)求广义表的长度。
(3)利用取表头head和取表尾tail操作分离出原子e。
答案:(1)广义表的头尾链表存储结构图:(2)表长是3。
(3)求元素e的计算公式为:head(head(head(head(tail(tail(L))))))7对称矩阵,回答下面问题:(1)若将A中包括主对角线的下三角元素按列的顺序压缩存储到数组S中,设A中元素的行列标从1开始,S的下标从1开始。
请画出S的存储结构图,并求出A中任一元素的行列下标[i,j](1<=i,j<=4)与S中元素的下标k(k≥1)之间的关系。
(2)若将A视为稀疏矩阵,将其压缩存储到三元组表,画出此三元组表的结构图。
答案:(1)S的存储结构图如下:k=(2n-j+2)(j-1)/2+i-j+1(i≥j时)k=(2n-i+2)(i-1)/2+j-i+1(i<j时)此处n=4.行标i 列表j 元素e1 1 11 4 22 2 33 4 54 1 24 3 58. 已知广义表( a,((b),c),(((d)))),(1)画出该广义表的头尾链表存储结构图。
(2)求广义表的长度。
(3)利用取表头head和取表尾tail操作分离出原子b。
答案:(1)广义表的头尾链表存储结构图:(2)表长是3。
(3)求元素b的计算公式为: head(head(head(tail(L))))四、程序设计题1.已知稀疏矩阵的三元组顺序表定义如下,写出从一个二维矩阵创建一个三元组表的算法。
/* 定义三元顺序表的最大长度 */#define MAXSIZE 100typedef int ElemType;/* 三元组的数据类型 */typedef struct{ int i; /* 行标 */int j; /* 列标 */ElemType e; /* 非0元素值 */}tupletype;typedef struct{ int rownum;int colnum;int nznum;tupletype data[MAXSIZE];}table;答案:#define M 16#define N 17void creat(table *T, ElemType A[M][N]){ int i,j;T->rownum=M;T->colnum=N;T->nznum=0;for(i=0;i<M;i++)for(j=0;j<N;j++)if(A[i][j]!=0){ T->data[T->nznum].i=i;T->data[T->nznum].j=j;T->data[T->nznum].e=A[i][j];T->nznum++;}}。