result*=x;
returnresult;
}
14.试确定下面递归算法的时间复杂度:
Intfunc(intn)
{
if(n==0)
return(0);
return(n+func(n-1));
}
15.对于求最大子序列之和问题的平方算法而言,精确的确定语句最内部循环被执行多少次?
16.试计算在算法2.1中,精确的确定语句最内部循环被执行多少次?
17.一个算法在输入规模为100时,花费0.5ms的时间,在下列情况下,输入规模为500时,它将花费多少时间(低次项不考虑)?
①线性算法
②O(NlogN)
③平方算法
④立方算法
18.一个算法在输入规模为10时,花费0.05ms的时间,在下列情况下,输入规模为1000时,它将花费多少时间(低次项不考虑)?
①线性算法
②O(NlogN)
③平方算法
④立方算法
19.一个算法在输入规模为100时,花费0.5ms的时间,在下列情况下,一分钟可以解决一个多大的问题(低次项不考虑)?
①线性算法
②平方算法
③立方算法
20.一个算法在输入规模为10时,花费0.05ms的时间,在下列情况下,0.5分钟可以解决一个多大的问题(低次项不考虑)?
①线性算法
②平方算法
③立方算法
习题三
1.填空题
(1)线性表(a1,a2,…an)有两种存贮结构:
顺序存贮结构和链接存贮结构,请就这两种存贮结构完成下列填充:
____________存贮密度较大;_______________存贮利用率较高;___________可以随机存取;________________不可以随机存取;_______________插入和删除操作比较方便。
(2)在单链表中,删除指针P所指结点的后继结点的语句是__________。
(1)带头结点的单循环链表Head的判空条件是__________;不带头结点的单循环链表的判空条件是__________。
(2)删除带头结点的单循环链表Head的第一个结点的操作是__________;删除不带头结点的单循环链表的第一个结点的操作是__________。
(3)如果线性表中最常用的操作是存取第I个元素及其前驱的值,则采用_________存储方式节省时间。
A.单链表B.双链表C.单循环链表D.顺序表
2.动态与静态数据结构在计算机内存中的存储方式有何不同?
各有何优缺点?
3.描述以下三个概念的区别:
头指针、头结点、第一个结点。
4.试写出一个计算线性链表P中结点个数的算法,其中指针P指向该表中第一个结点,尾结点的指针域为空。
5.何时选用顺序表、何时选用链表作为线性表的存储结构为宜?
6.在顺序表中插入和删除一个结点需平均移动多少个结点?
具体的移动次数取决于哪两个因素?
7.在单链表、双链表和单循环链表中,若仅知道指针p指向某结点,不知道头指针,能否将结点*p从相应的链表中删去?
若可以,其时间复杂度各为多少?
8.假设LA、LB为两个递增有序的线性链表,试写出将这两个线性链表归并成一个线性链表LC的操作算法。
9.将学生成绩按成绩高低排列建立了一个有序单链表,每个结点包括:
学号、姓名和课程成绩。
(1)输入一个学号,如果与链表中的结点的学号相同,则将此结点删除;
(2)在链表中插入一个学生的记录,使得插入后链表仍然按成绩有序排列。
10.某仓库中有一批零件,按其价格从低到高的顺序构成一个单链表存于计算机内,链表的每一个结点说明同样价格的若干个零件。
现在又新有m个价格为s的零件需要进入仓库,试写出仓库零件链表增加零件的算法。
链表结点结构如下:
11.设指针P指向单链表的首结点,指针X指向单链表中的任意一个结点,写出在X前插入一个结点i的算法。
12.设多项式A和B采用线性链表的存储方式存放,试写出两个多项式相加的算法,要求把相加结果存放在A中。
13.设指针a和b分别为两个带头结点的单链表的头指针,编写实现从单连表La中删除自第i个数据元素起,共length个数据元素、并把它们插入到单链表Lb中第j个元素之前的算法。
14.设La和Lb是两个有序的循环链表,Pa和Pb分别指向两个表的表头结点,是写一个算法将这两个表归并为一个有序的循环链表。
15.已知有一个单向循环链表,其每个结点中含三个域:
pre、data和next,其中data为数据域,next为指向后继结点的指针域,pre也为一个指针域,但是他的值为空(null),试编写一个算法将此单链表改为双向循环链表,即使pre成为指向前驱结点的指针域。
16.画出执行下列各行语句后各指针及链表的示意图。
L=(linklist)malloc(sizeof(lnode));P=l;
for(i=1;i<4;i++)
{
p->next=(linklist)malloc(sizeof(lnode));
p=p->next;
p->data=i*2-1;
}
p->next=null;
for(i=4;i>=1;i--;)insert_linklist(l;i+1;i*2);
for(i=1;i<3;i++)del_linklist(l,i);
17.设顺序表L是一个递增有序表,试写一算法,将x插入L中,并使L仍是一个有序表。
习题四
1.填空题
(1)设栈S和队列Q的初始状态皆为空,元素a1,a2,a3,a4,a5和a6依次通
过一个栈,一个元素出栈后即进入队列Q,若6个元素出队列的顺序是a3,a5,a4,a6,a2,a1则栈S至少应该容纳____________个元素。
(2)一个栈的输入序列为1,2,3,4,5则下列序列中不可能是栈的输出序列的
是__________。
A.2,3,4,1,5B.5,4,1,3,2C.2,3,1,4,5D.1,5,4,3,2
2.对于下面的每一步画出栈中元素及栈顶指针的示意图:
(1)空栈;
(2)元素A入栈;
(3)元素B入栈;
(4)删除栈顶元素;
(5)元素C入栈;
(6)元素D入栈;
3.比较栈和队列的相同点和不同点,举例说明。
4.对于算术表达式3*(5-2)+7,用栈存储式子中的运算对象和运算符,试说明该算术表达式的运算过程。
5.若依次输入数据元素序列{a,b,c,d,e,f,g}进栈,出栈操作可以和入栈操作间隔进行,则下列那些元素序列可以由出栈序列得到?
{d,e,c,f,b,g,a};
{f,e,g,d,a,c,b};
{e,f,d,g,b,c,a};
{c,d,b,e,f,a,g}
6.编写一个算法,用来判别表达式中开、闭括号是否配对出现。
7.设将整数以万计1、2、3、4依次进栈,但只要出栈时栈非空,则可将出栈操作按任何次序夹入其中,请回答下有问题:
(1)若入栈次序为push
(1),pop(),push
(2),push(3),pop(),pop(),push(4),
pop(),则出栈的数字序列为什么?
(2)请分析1、2、3、4的24种排列中,哪些序列可以通过相应的入出栈得到。
8.链栈中为何不设头指针?
10.循环队列的优点是什么?
如何判断它的空和满?
11.试述队列的链式存储结构和顺序存储结构的优缺点。
12.假设以一维数组s[n]存储循环队列的元素,若要使这n个存储空间都得到利用,需另设一个标志flag,以flag为0或1来区分队头指针和队尾指针相同时队列是空还是满。
编写与此结构相对应的初始化、入队列和出队列的算法。
13.试编写下面定义的递归函数的递归算法,并根据算法画出求G(5,2)时栈的变化过程。
14.分别在栈和队列(至少含有3个结点)中实现删除紧邻栈顶或队头的结点,并用
P返回其值。
15.设将整数1,2,3,4依次进栈,但只要出栈时栈非空,则可将出栈操作按任何次序夹入其中,请回答下述问题:
(1)若入、出栈次序为Push
(1),Pop(),Push
(2),Push(3),Pop(),Pop(),Push(4),Pop(),则出栈的数字序列为何(这里Push(i)表示i进栈,Pop()表示出栈)?
(2)能否得到出栈序列1423和1432?
并说明为什么不能得到或者如何得到。
(3)请分析1,2,3,4的24种排列中,哪些序列是可以通过相应的入出栈操作得到的。
16.回文是指正读反读均相同的字符序列,如"abba"和"abdba"均是回文,但"good"不是回文。
试写一个算法判定给定的字符向量是否为回文。
(提示:
将一半字符入栈)。
习题五
1.判断题(判断下列各题是否正确,若正确在()内打“√”,否则打“╳”)
(1)()如果两个串含有相同的字符,则说明它们相等。
(2)()如果一个串中的所有字符均在另一串中出现,那么则说明前者是后者的子串。
(3)()串的模式匹配BF算法的时间复杂度在最坏情况下为O(n×m),因此此算法没有实际使用价值。
(4)()设有两个串p和q,其中q是p的子串,把q在p中首次出现的位置作为子串q在p中的位置的算法称为匹配。
(5)()KMP算法的最大特点是指示主串的指针不需回溯。
2.选择题(请在选项A,B,C,D,E选择正确答案)
(1)串是()
A.少于一个字母的序列B.任意个字母的序列
C.不少于一个字符的序列D.有限个字符的序列
(2)设字符串s1=‘ABCDEFG’,s2=‘PQRST’,T,sub1,sub2为空串。
则运算s=Concation(T,SubString(sub1,s1,2,SubLength(s2)),SubString(sub2,s1,SubLength(s2),2))后的串T的值为()
A.‘BCDEF’B.‘BCDEFG’C.‘BCPQRST’D.‘BCDEFEF’E.‘BCQR‘
(3)串的长度是()
A.串中不同字母的个数B.串中不同字符的个数
C.串中所含字符的个数,且大于0D.串中所含字符的个数
(4)若某串的长度小于一个常数,则采用()存储方式最为节省空间。
A.链式B.堆结构C.顺序
(5)设有两个串p和q,求q在p中首次出现的位置的运算()
A.连接B.模式匹配C.求子串D.求串长
(6)串的联结运算不满足()
A.分配律B.交换律C.结合律
3.空白串与空串有何区别?
字符串中的空白符号有何意义?
4.假定串采用块链接表示,试写出删除一个子串的算法。
5.比较串的三种存储方式的优点和缺点。
6.已知:
s=‘xyz*’,t=‘(x+y)*z’。
试利用联接、求子串和置换等基本运算,将s转换为t。
7.试分别写出算法insert(a,i,b)和算法delete(a,b)。
其中,insert(a,i,b)将串b插入在串a中位置i之后;delete(a,b)将串a中的子串b删掉。
习题六
判断题(判断下列各题是否正确,若正确在()内打“√”,否则打“╳”)
(1)()数组是同类型值的集合。
(2)()数组是一组相继的内存单元。
(3)()数组是一种复杂的数据结构,数组元素之间的关系,既不是线性的,也不是树型的。
(4)()插入和删除操作是数据结构中最基本的两种操作,所以这两种操作在数组中也经常使用。
(5)()使用三元组表表示稀疏矩阵的元素,有时并不能节省存储空间。
(6)()广义表是由零或多个单元素或子表所组成的有序列,所以广义表可能为空表。
(7)()线性表可以看成是广义表的特例,如果广义表中的每个元素都是单元素,则广义表便成为线性表。
单选题(请从下列A、B、C、D、E、F选项中选择一项)
(1)设有一个10阶的对称矩阵A,采用压缩存储方式,以行序为主存储,a11为第一个元素,其存储地址为1,每个元素占1个地址空间,则a85的地址为()
A.13B.33C.18D.40
(2)一个n×n的对称矩阵,如果以行或列为主序存入内存,则其容量为()
A.n×nB.n×n/2C.n×(n+1)/2D.(n+1)×(n+1)/2
E.(n-1)×n/2F.n×(n-1)
(3)二维数组a的每个元素是由6个字符组成的串,行下标i的范围从0~8,列下标j的范围是从1~10。
从供选择的答案中选出正确答案填入下列关于数据存储叙述中的()内。
1 存放a至少需要( )个字节。
A.90B.180C.240D.270E.540
2 a的第8列和第5行共占( )字节。
A.108 B.114C.54D.60E.150
3 若a按行存放,元素a[8,5]的起始地址与当a按列存放的元素( )的起始地址一致。
A.a[8,5]B.a[3,10]C.a[5,8]D.a[0,9]
(4)已知广义表LS=(a,(b,c,d),e),运用HEAD和TAIL函数取出LS中单元素b的运算是()。
A.HEAD(HEAD(LS))
B.TAIL(HEAD(LS))
C.HEAD(HEAD(TAIL(LS)))
D.HEAD(TAIL(LS))
(5)已知广义表A=((a,b,c),(d,e,f)),从A中取出单元素e的运算是()。
A.TAIL(HEAD(A))
B.HEAD(TAIL(A))
C.HEAD(TAIL(TAIL(HEAD(A))))
D.HEAD(TAIL(HEAD(TAIL(A))))
3假设在树中,结点x是结点y的双亲时,用(x,y)来表示树边.已知一棵树边的集合为{(i,m),(i,n),(e,i),(b,e),(b,d),(a,b),(g,j),(g,k),(c,g),(c,f),(h,l),(c,h),(a,c)}用树形表示法出此树,并回答下列问题:
(1)哪个是根结点?
(2)哪些是叶结点?
(3)哪个是g的双亲?
(4)哪些是g的祖先?
(5)哪些是g的孩子?
(6)哪些是e的子孙?
(7)哪些是e的兄弟?
哪些是f的兄弟?
(8)结点b和n的层次各是多少?
(9)树的深度是多少?
(10)以结点c为根的子树的深度是多少?
(11)树的度数是多少?
4.一棵度为2的有序树与一棵二叉树有何区别?
5.一个深度为h的满k叉树有如下性质:
第h层上的结点都是叶子结点,其余各层上每个结点都有k棵非空子树。
如果按层次顺序(同层自左至右)从1开始对全部结点编号,问:
(1)各层的结点数目是多少?
(2)编号为i的结点的双亲结点(若存在)的编号是多少?
(3)编号为i的结点的第j个孩子结点(若存在)的编号是多少?
(1)编号为i的结点的有右兄弟的条件是什么?
其右兄弟的编号是多少?
6.试找出分别满足下面条件的所有二叉树:
(1)前序序列和中序序列相同;
(2)中序序列和后序序列相同;
(3)前序序列和后序序列相同;(4)前序、中序、后序序列均相同。
7.给定一奇数n,构造一个n阶魔阵。
n阶魔阵是一个n阶方阵,其元素由自然数1,2,3,…,n组成。
魔阵的每行元素之和,每列元素之和以及主、副对角线之和均相等。
即对于给定的奇数n以及i=1,2,…,n,魔阵a满足条件:
(1)设有一每行每列都有8个正方格的棋盘。
试用8个棋子布到格子上,要求满足以下条件:
1任意两个棋子不在同一行和同一列;
2 任意两个棋子不在同一斜线上。
问有多少种摆法。
(2)设B(n×m)是一个二维对称数组,为节省存储单元,只将上三角的元素存于内存中,试推导元素B{i,j}(0in,0jm)的位置的公式。
(3)求三维数组按行优先顺序存储的地址公式。
(4)求下列广义表运算的结果
1HEAD((p,h,w));
2TAIL((b,k,p,h));
3HEAD(TAIL(((a,b),(c,d)))).
(5)画出下列广义表的图形表示:
1D(A(),B(e),C(a,L(b,c,d)));
2M1(a,((b,c,d),e))
8.设有三对角矩阵
,将其三条对角线上的元素逐行地存储到向量B[0...3n-3]中,使得B[k]=
求:
(1)用i,j表示k的下标变换公式。
(2)用k表示i,j的下标变换公式。
(2)当三角矩阵采用题
(1)所述的压缩存储时,写一算法求三对角矩阵在这种压缩存储表示下的转置矩阵。
(3)当稀疏矩阵A和B均以三元组表作为存储结构时,试写出矩阵相加的算法,其结果存放在三元组表C中。
习题七
1.判断题(判断下列各题是否正确,若正确在()内打“√”,否则打“╳”)
(1)()二叉树是树的特殊形式。
(2)()由树转换成二叉树,其根结点的右子树总是空的。
(3)()前序遍历树和前序遍历与该树对应的二叉树,其结果不同。
(4)()后序遍历树和中序遍历与该树对应的二叉树,其结果不同。
(5)()前序遍历森林和前序遍历与该森林对应的二叉树,其结果不同。
(6)()后序遍历森林和中序遍历与该森林对应的二叉树,其结果不同。
(7)()在二叉树中插入结点后,该二叉树就不是二叉树。
(8)()哈夫曼树是带权路径长度最短的树,路径上权值较大的结点离根较近。
(9)()用一维数组存放二叉树时,总是以前序遍历存储结点。
2.单选题(请从下列A,B,C,D选项中选择一项)
(1)有一棵二叉树,如图7-28所示该二叉树是()
图7-28
A.二叉平衡树B.二叉排序树C.堆的形状
(2)线索化二叉树中某结点没有孩子的充要条件是()
A.D.Lchild=NULLB.D.Ltag=1C.D.Ltag=0
(3)如果结点A有3个兄弟,而且B是A的双亲,则B的度是()
A.4B.5C.1
(4)树B的层号表示1a,2b,3d,3e,2c对应于下面选择的()
A.1a[2b[3d,3e],2c]B.a[b[d],e],c]C.a[b,d[e,c]]D.a[b[d,e],c]
(5)某二叉树T有n个结点,设按某种顺序对T中的每个结点进行编号,编号值为1,2,...n。
且有如下性质:
T中任意结点v,其编号等于左子树上的最小编号减1,而v的右子树的结点中,其最小编号等于v左子树上结点的最大编号加1,这是按( )编号的。
A.中序遍历序列
B.前序遍历序列
C.后序遍历序列
(6)设F是一个森林;B是由F转换得到的二叉树,F中有n个非终端结点,B中右指针域为空的结点有( )个。
A.n-1B.nC.n+1D.n+2
(7)前序遍历的顺序是()
A.根结点,左子树,右子树
B.左子树,根结点,右子树
C.右子树,根结点,左子树
D.左子树,右子树,根结点
(