当前位置:文档之家› 数据结构 习题 第九章 查找 答案

数据结构 习题 第九章 查找 答案

数据结构 习题 第九章 查找 答案
数据结构 习题 第九章 查找 答案

第9章集合

部分答案解释如下。

4.不能说哪种哈希函数的选取方法最好,各种选取方法有自己的适用范围。

8.哈希表的结点中可以包括指针,指向其元素。

11.单链表不能使用折半查找方法。

20.按插入后中序遍历是递增序列的原则,若某结点只有右子树,而插入元素的关键字小于该结点的关键字,则会插入到该结点的左侧,成为其左孩子。这种插入就不是插入到叶子下面。

21.从平衡因子定义看,完全二叉树任一结点的平衡因子的绝对值确实是小于等于1。但是,平衡二叉树本质上是二叉排序树,完全二叉树不一定是排序树。故不能说完全二叉树是平衡二叉树。

23.某结点的左子树根结点不一定是它的中序前驱,其右子树根结点也不一定是它的中序后继。

24.在等概率下,查找成功时的平均查找长度相同,查找失败时的平均查找长度不相同。26.只有被删除结点是叶子结点时命题才正确。

三.填空题

1.n n+1 2.4 3.6,9,11,12 4.5

5.26(第4层是叶子结点,每个结点两个关键字) 6.1,3,6,8,11,13,16,19 7.5,96 8.m-1,「m/2?-1 9.2,4,3

10.(1)哈希函数(2)解决冲突的方法 (3)选择好的哈希函数 (4)处理冲突的方法 (5)均匀(6)简单

11.AVL树(高度平衡树,高度平衡的二叉排序树),或为空二叉树,或二叉树中任意结点左子树高度与右子树高度差的绝对值小于等于1。

12.小于等于表长的最大素数或不包含小于20的质因子的合数 13.16 14.?㏒n」+1

2

15.(1)45 (2)45 (3)46(块内顺序查找) 16.k(k+1)/2 17.30,31.5(块内顺序查找)

18.(1)顺序存储或链式存储 (2)顺序存储且有序 (3)块内顺序存储,块间有序 (4) 散列存储

19.(n+1)/2 20.(n+1)/n*log2(n+1)-1 21.结点的左子树的高度减去结点的右子树的高度

22.(1)顺序表(2)树表(3)哈希表(4)开放定址方法(5)链地址方法(6)再哈希(7)建立公共溢出区

23.直接定址法 24.log?m/2?)+1 25.O(N) 26.n(n+1)/2

27.54 28.31 29.37/12 30.主关键字 31.左子树右子树

32.插入删除 33.14 34.(1)126 (2)64 (3)33 (4)65 35.(1)low<=high (2) (low+hig) DIV 2 (3) binsrch:=mid (4)binsrch:=0 36.(1) k (2) Irear 38.(1)p!=null (2)pf=p (3)p!=*t (4)*t=null

四.应用题

1.概念是基本知识的主要部分,要牢固掌握。这里只列出一部分,目的是引起重视,解答略。

2.(1)散列表存储的基本思想是用关键字的值决定数据元素的存储地址

(2)散列表存储中解决碰撞的基本方法:

①开放定址法形成地址序列的公式是:H i=(H(key)+d i)% m,其中m是表长,

d i是增量。根据d i取法不同,又分为三种:

a.d i =1,2,…,m-1 称为线性探测再散列,其特点是逐个探测表空间,只要散列表中有空闲空间,就可解决碰撞,缺点是容易造成“聚集”,即不是同义词的关键字争夺同一散列地址。

b.d i =12,-12,22,-22,…,±k2(k≤m/2)称为二次探测再散列,它减少了聚集,但不容易探测到全部表空间,只有当表长为形如4j+3(j为整数)的素数时才有可能。

c.d i =伪随机数序列,称为随机探测再散列。

②再散列法 H i=RH i(key) i=1,2,…,k,是不同的散列函数,即在同义词产生碰撞时,用另一散列函数计算散列地址,直到解决碰撞。该方法不易产生“聚集”,但增加了计算时间。

③链地址法将关键字为同义词的记录存储在同一链表中,散列表地址区间用H[0..m-1]表示,分量初始值为空指针。凡散列地址为i(0≤i≤m-1)的记录均插在以H[i]为头指针的链表中。这种解决方法中数据元素个数不受表长限制,插入和删除操作方便,但增加了指针的空间开销。这种散列表常称为开散列表,而①中的散列表称闭散列表,含义是元素个数受表长限制。

④建立公共溢出区设H[0..m-1]为基本表,凡关键字为同义词的记录,都填入溢出区

O[0..m-1]。

(3)用分离的同义词表和结合的同义词表解决碰撞均属于链地址法。链地址向量空间中的每个元素不是简单的地址,而是关键字和指针两个域,散列地址为i(0≤i≤m-1)的第一

个关键字存储在地址空间向量第i个分量的“关键字”域。前者的指针域是动态指针,指向同义词的链表,具有上面③的优缺点;后者实际是静态链表,同义词存在同一地址向量空间(从最后向前找空闲单元),以指针相连。节省了空间,但易产生“堆积”,查找效率低。(4)要在被删除结点的散列地址处作标记,不能物理的删除。否则,中断了查找通路。(5)记录负载因子

3.评价哈希函数优劣的因素有:能否将关键字均匀影射到哈希空间上,有无好的解决冲突的方法,计算哈希函数是否简单高效。由于哈希函数是压缩映像,冲突难以避免。解决冲突的方法见上面2题。

4.哈希方法的平均查找路长主要取决于负载因子(表中实有元素数与表长之比),它反映了哈希表的装满程度,该值一般取0.65~0.9。解决冲突方法见上面2题。

5.不一定相邻。哈希地址为i(0≤i≤m-1)的关键字,和为解决冲突形成的探测序列i的同义词,都争夺哈希地址i。

6

平均查找长度:ASL succ=(1+1+1+2+3+4+1+2)/8=15/8

以关键字27为例:H(27)=27%7=6(冲突) H1=(6+1)%10=7(冲突)

H2=(6+22)%10=0(冲突) H3=(6+33)%10=5 所以比较了4次。

7.由于装填因子为0.8,关键字有8个,所以表长为8/0.8=10。

(1)用除留余数法,哈希函数为H(key)=key % 7

(2

(3i(0≤i≤m-1)时的查找次数。本例中m=10。故查找失败时的平均查找长度为:ASL unsucc=(9+8+7+6+5+4+3+2+1+1)/10=4.6 ASL succ =16/8=2

(4)int Delete(int h[n],int k)

// 从哈希表h[n]中删除元素k,若删除成功返回1,否则返回0

{i=k%7;// 哈希函数用上面(1),即H(key)=key % 7

if(h[i]== maxint)//maxint解释成空地址

printf(“无关键字%d\n”,k);return (0);}

if(h[i]==k){h[i]=-max int ;return (1);} //被删元素换成最大机器数的负数

else // 采用线性探测再散列解决冲突

{j=i;

for(d=1;d≤n-1;d++)

{i=(j+d)%n; // n为表长,此处为10

if(h[i]== maxint)return (0); //maxint解释成空地址

if(h[i]==k){ h[i]=-maxint;return (1);}

}//for

}

printf(“无关键字%d\n”,k);return (0)

}

8

succ

哈希表b: ASL succ =18/8

9.(1)

(2)装填因子=9/13=0.7 (3)ASL succ =11/9 (4)ASL unsucc =29/13

10. 11.ASL succ=19/12

12.常用构造哈希函数的方法有:

(1)数字分析法该法事先需知道关键字集合,且关键字位数比散列表地址位数多,应选数字分布均匀的位。

(2)平方取中法将关键字值的平方取中间几位作哈希地址。

(3)除留余数法 H(key)=key%p,通常p取小于等于表长的最大素数。

(4)折叠法将关键字分成长度相等(最后一段可不等)的几部分,进行移位叠加或间界叠加,其值作哈希地址。

(5)基数转换法两基数要互素,且后一基数要大于前一基数。

在哈希表中删除一个记录,在拉链法情况下可以物理地删除。在开放定址法下,不能物理地删除,只能作删除标记。该地址可能是该记录的同义词查找路径上的地址,物理的删除就中断了查找路径。因为查找时碰到空地址就认为是查找失败。

13

ASL succ =(1+1+1+2+1+2+1+2)/8=11/8

unsucc

(2)

13题图ASL succ =11/8 ASL unsucc=19/11 14题(2) ASLsucc=13/8 ASL unsucc=19/11 值得指出,对用拉链法求查找失败时的平均查找长度有两种观点。其一,认为比较到空指针算失败。以本题为例,哈希地址0、2、5、7、9和10均为比较1次失败,而哈希地址1和3比较2次失败,其余哈希地址均为比较3次失败,因此,查找失败时的平均查找长度为19/11,我们持这种观点。还有另一种理解,他们认为只有和关键字比较才计算比较次数,而和空指针比较不计算。照这种观点,本题的ASL unsucc=(1+1+2+2+2)/11=8/11

14.由hashf(x)=x mod 11 可知,散列地址空间是0到10,由于有8个数据,装载因子取0.7。

(1)

ASL succ=21/8 ASL unsucc=47/11

15.

(2)a:ASL succ=31/12 (2)b:ASL succ=18/12 (注:本题[x]取小于等于x的最大整数)

16.

17.查找时,对关键字49,22,38,32,13各比较一次,对21,18各比较两次

18.ASL succ =15/10

19.ASL suss =16/11

20.

succ

21.

22.

(1

(2)查找关键字63,H(k)=63 MOD 16=15,依次与31,46,47,32,17,63比较。(3)查找关键字60,H(k)=60 MOD 16=12,散列地址12内为空,查找失败。

(4)ASL succ=23/11

23.设用线性探测再散列解决冲突,根据公式Snl≈(1+1/(1-α)) /2 。可求出负载因子为α=0.67。再根据数据个数和装载因子,可求出表长m=15/0.67,取m=23。设哈希函数H(key)=(关键字首尾字母在字母表中序号之和)MOD 23。

从上表求出查找成功时的平均查找长度为ASL succ=19/15<2.0,满足要求。

24.(1)哈希函数H(key)=(关键字各字符编码之和)MOD 7

25.α=0.7,所以表长取m=7/0.7=10

ASL succ=18/7 ASL unsucc=32/10

26.(1)

(2)ASL suss =11/8

27.(1)

碰撞。

发生碰撞次数:100,126一次;200,400两次;0七次。其余关键字无碰撞。

28.由α=0.75,得表长m=11/0.75=15

(1)散列函数H(k)=k MOD 13(p取小于等于表长的最大素数)

(213。

(2)ASL succ=18/11 (3)ASL unsucc=24/13

29.在B-树中查找关键字从根结点开始,从根往下查找结点,然后在结点内查找关键字,得出查找成功与否的结论。B+树的非终端结点是索引部分,其查找从根开始,从根往下查到关键字后,要继续查到最下层结点,得到查找成功与否的结论。另外,B+树还可以在最下层从最小关键字开始,从左往右进行顺序查找,B-树则不能作顺序查找。

30.m阶的B+树和B-树主要区别有三:(1)有n棵子树的结点中含有n(B-树中n-1)个关键字;(2)B+树叶子结点包含了全部关键字信息,及指向含关键字记录的指针,且叶子结点本身依关键字大小自小到大顺序链接;(3)B+树的非终端结点可以看成是索引部分,结点中只含其子树(根结点)中最大(或最小)关键字。B+树的查找既可以顺序查找,也可以随机查找,B-只能顺序查找。

31.本题等价于“含有n个关键字的m阶B-树的最大高度是多少”?一次检索中最多走一条从根到叶子的路径,由于根结点至少有两棵子树,其余每个(除叶子)结点至少有?m/2?棵子树,则第三层至少有?m/2?*2个结点,第l+1层至少有2*?m/2?l-1个结点。设B-树深度为l+1,即第l+1层是叶子结点,叶子结点数是n+1(下面推导),故有n+1≥2*?m/2?l-1,

即l≤log?m/2?)+1。

附:推导B-树中叶子结点数s与关键字数n的关系式:s=n+1

设B-树某结点的子树数为C i,则该结点的关键字数N i=C i-1。对于有k个结点的B-树,有

∑N i=∑(C i-1)=∑C i-k(1≤i≤k) (1)

因为B树上的关键字数,即∑N i=n (1≤i≤k) (2)

而B-树上的子树数可这样计算:每个结点(除根结点)都是一棵子树,设叶子(子树)数为s;则

∑C i=(k-1)+s (1≤i≤k) (3)

综合(1)(2)(3)式,有s=n+1。证毕。

32.表长m=12/0.6=20 (1)H(key)=key MOD 19

(2)两次碰撞。开地址线性探测法解决冲突,即是用拉链法解决冲突。见本章四第2题(2)③

第32题用拉链法解决冲突

33。

succ

34.

35.

36.第一层有1个结点,第二层至少有2个结点,第三层有2*?m/2?个结点,第四层有2*?m/2?2个结点,……,第h层至少有2*?m/2?h-2个结点(h≥2)。结点总数是

1+2+2*?m/2?+2*?m/2?2+…+2*?m/2?h-2=2*?m/2?h-1-1

37.

38.

39.

40.(该题答案不唯一。如删P时,亦可将双亲结点中M下来与N一起并入左兄弟成为(K L M N)

41.满二叉检索树可以看作是三阶B-树(2—3树)。B-树的插入和删除算法不适合满二叉检索树。满二叉检索树插入和删除结点后均破坏了“多路平衡查找树”“叶子在同一层上”(查找失败结点)的定义。

42.

43.B+树的查找可从根结点开始随机查找,也可以从最小关键字起顺序查找。

44.含9个叶子结点的3阶B-树至少有4个非叶子结点,当每个非叶子结点均含3棵子树,第三层是叶子结点时就是这种情况。当4层3阶B-树有10个叶子结点时,非叶子结点达到最大值8个,其中第一层一个,第二层两个,第三层五个非叶子结点。

45.在二叉排序树上查找关键字K,走了一条从根结点至多到叶子的路径,时间复杂度是O(logn),而在中序遍历输出的序列中查找关键字K,时间复杂度是O(n)。按序输入建立的二叉排序树,蜕变为单枝树,其平均查找长度是(n+1)/2,时间复杂度也是O(n)。

46.按中序遍历序列将值1~9依次标上。

47.

ASL succ=(1*1+2*2+4*3+4*4)/11=33/11

48.

ASL succ=32/10

49. (2)10,12,15,20,24,28,30,35,46,50,55,68

(3)ASL succ=41/12

50.

51.

52.序列(2)不可能是二叉排序树中查到363的序列。查到501后,因363<501,后面应出现小于501的数,但序列中出现了623,故不可能。

53.(1)本题的本质是给定中序序列1、2、3、4,有几种不同的二叉排序树,也即该中序序列相当多少不同的前序序列,这是树的计数问题。设中序序列中元素数为n,则二叉数的数目为1/(n+1)C2n n,这里n=4,故有14种。图示如下:

(2)最优查找树有4种,上面中⑽⑾⑿⒀

(3)AVL树有,也是(2)中的那4种

(4)完全二叉树有1种,上图中⑽

54.设以N m表示深度为m的AVL树中含有的最少结点数。显然,N0=0,N1=1,N2=2,且N m= N m-1 + N m-2 +1(m≥2)。这个关系与斐波那契序列类似,用归纳法可以证明:当m≥0时,

N m = F m+2 -1,而F m约等于Φm/(其中Φ=(1+)/2),则N m约等于Φm+2-1(即深度为m的AVL树具有的最少结点数)

当m层的AVL树是满二叉树时,结点数为最大值2m-1。

55.树的高度一定增加。因为“查找路径上的任一结点的平衡系数皆为零”,从根结点开始查找,根结点的平衡系数为零,说明根的左右子树等高(不一定是满二叉树)。沿左(或右)子树向下查找时,查找路径上所有结点的平衡系数皆为零,说明任一结点的左右子树等高,查找失败是在叶子结点,插入也是在叶子结点,树的高度自然增加。

56.

四种破坏平衡的情况,a,b,c是结点指针,虚线部分是在失去平衡前的图中未画出部分,该部分若存在,则在调整后应按虚线指出的连接。其它,如LL型,a指针所指结点可能有右子树,c指针所指结点可能有左右子树,这些在调整后均不受影响,故没画出。

58.LR型旋转

59.

(1)ASL suss =(1*1+2*2+3*3+4*3+5*2+6*1)/12=42/12 (2)ASL suss =(1*1+2*2+4*3+5*4)/12=37/12

(3)ASL suss =(1*1+2*2+4*3+4*4+5*1)/12=38/12 60.

61.

说明:在(3)后,先删除结点CAN并未破坏平衡,在删AQU后破坏了平衡,根结点CAP 的平衡因子为-2。需作何种调整,要看CAP右子树PIS的平衡因子,若该平衡因子是1,则作RL型调整;若为-1,则作RR型调整;若为0,则RR和RL均可,为简单计,选RR型。当然,在PIS平衡因子为零后,还可继续往下分析。

62.

63.(1)

(2)最坏情况下,对该树的插入、删除和依次输出的时间复杂性分别是O(h),O(nlog2h)和O(n)。

64.按索引顺序查找分块组织数据。N个区间分块有序,区间(块)内无序,将块内最大关键字置于块内最后一个位置,即向量下标为ik-1,其中i=1,2,…,N-1,k为每区间的长度(最后一个区间的最大关键字置于向量最后一个位置)。查找时,若N较小,可用顺序查找,依次将x与r[ik-1]*key进行比较,找到合适块后在块内顺序查找;若N很大,也可用折半查找,以确定x所在块,在块内顺序查找。

65.37/12

66.线性表应顺序存储且数据有序。

67.监视哨的作用是免去查找过程中每次都要检测整个表是否查找完毕,提高了查找效率。68.表长为n,每块大小取n1/2时,平均查找长度取最小值n1/2+1。若n=255,则每块长度为16。

69.表长2000,分成45块,每块的理想长度为45(最后一块长20)。若每块长25,则平均查找长度为ASL=(80+1)/2+(25+1)/2=53.5(顺序查找确定块),或ASL=19(折半查找确定块)。

70.将n个元素对称比较,即第一个元素与最后一个元素比较,第二个元素与倒数第二个元素比较,……,比较中的小者放前半部,大者放后半部,用了?n/2?次比较。再在前后两部分中分别简单选择最小和最大元素,各用?n/2?-1次比较。总共用了3*?n/2?-2次比较。71.在有序表A[1..14]中,比较到A[4]时,已查找元素依次是A[7],A[3],A[5]。72.(1)图中结点中的数字为元素在有序表中的下标

(2)插入排序中,用折半查找确定待插入元素位置,比直接插入排序减少了比较次数,但数据移动次数没有改变,排序的时间复杂度也未改变。

(3)折半查找的平均查找长度是((n+1)/n)log2(n+1)-1≈log(n+1)-1。本例ASL=79/21。73.根据次优查找树的定义,首先取第i个记录(l≤i≤h)构造根结点,使

△P j=|-| 取最小值。

关键字 black blue green purple red white yellow

权值 0.10 0.08 0.12 0.05 0.20 0.25 0.20

j 1 2 3 4 5 6 7

SW j 0.1 0.18 0.30 0.35 0.55 0.80 1.00

△P j 0.9 0.72 0.52 0.35 0.10 0.35 0.80

(根)↑i

△P j 0.25 0.07 0.13 0.30 0.20 0.25

↑i ↑i

△P j 0.05 0.12

↑i

73题(1)次优查找树 73题(2)调整后的次优查找树

查找成功的平均查找长度是=1*0.25+2*(0.12+0.20)+3*(0.1+0.08+0.20)+4*0.05=2.23 由于在构造次优查找树的过程中,没有考查单个关键字的相应权值,可能出现根的关键字的权值比之相邻的关键字的权值小,这时要作调整:选邻近的权值较大的关键字作次优查

找树的根结点。调整后的次优查找树如图73(2)。

74.

75.这里失败结点是不存在的结点,在其双亲结点处查找失败,这时的比较次数为L

i-1。Array 76.

(1)顺序查找判定树

(2)ASL顺序成功 =(1p1 +2p2+3p3+4p4+5p5)=0.97

ASL折半成功 =(1p3+2(p1+p4)+3(p2+p5)=1.04

ASL折半失败 =(2q0+3q1+3q2+2q3+3q4+3q5)=1.30

ASL顺序失败 =(1q0+2q1+3q2+4q3+5q4+5q5)=1.07

(3)本题中顺序检索好。

77.时间复杂度是判断检索方法的一个重要指标,但不是唯一指标。使用什么检索方法要综合考虑。哈希检索时间O(1),查找速度最快,但需构建哈希函数,进行计算哈希地址,查找时要有解决冲突的方法;二分检索时间O(log2n),需要元素有序且顺序存储,排序操作的时间开销大;顺时检索时间最差为O(n),但对检索表无要求,数据有序无序均可,在数据量较小时使用方便。

五.算法设计题

1.根据二叉排序树中序遍历所得结点值为增序的性质,在遍历中将当前遍历结点与其前驱结点值比较,即可得出结论,为此设全局指针变量pre(初值为null)和全局变量flag,初值为true。若非二叉排序树,则置flag为false。

#define true 1

#define false 0

typedef struct node

{datatype data; struct node *llink,*rlink;} *BTree;

void JudgeBST(BTree t,int flag)

// 判断二叉树是否是二叉排序树,本算法结束后,在调用程序中由flag得出结论。

{ if(t!=null && flag)

{ J udgebst(t->llink,flag);// 中序遍历左子树

if(pre==null)pre=t;// 中序遍历的第一个结点不必判断

else if(pre->datadata)pre=t;//前驱指针指向当前结点

else{flag=flase;} //不是完全二叉树

J udgebst (t->rlink,flag);// 中序遍历右子树

}//JudgeBST算法结束

本题的另一算法是照定义,二叉排序树的左右子树都是二叉排序树,根结点的值大于左子树中所有值而小于右子树中所有值,即根结点大于左子树的最大值而小于右子树的最小值。算法如下:

int JudgeBST(BTree t)

//判断二叉树t是否是二叉排序树,若是,返回true,否则,返回false

{if(t==null)return true;

if(J udgebst(t->llink)&& J udgebst(t->rlink))//若左右子树均为二叉排序树

{m=max(t->llink);n=min(t->rlink);//左子树中最大值和右子树中最小值return (t->data>m && t->data

else return false;//不是二叉排序树

}//结束judgebst

int max(BTree p)//求二叉树左子树的最大值

{if(p==null)return -maxint;//返回机器最小整数

else{while(p->rlink!=null)p=p->rlink;

return p->data;}

}

int min(BTree p)//求二叉树右子树的最小值

{if(p==null)return maxint;//返回机器最大整数

else{while(p->llink!=null)p=p->llink;

return p->data;}

}

2.[题目分析]借助于分块查找思想,在建立数据顺序表的同时,建立一索引表。数据表中按k个集合分块(元素个数不一定相等),索引表中有两个域,一是各集合最后一个元素在数据表中的位置(一维数组中的下标),二是集合的个数(k)。实现数据运算时,根据给定的二元组(i,x),首先在索引表中找到集合i的位置,然后在数据表中查找x。如查到x ,则查找成功,返回x在数据表中的位置,否则查找失败。若要插入,则将数据表中的数据后移,插入x,同时修改索引表。

typedef struct {datatype data;}rectype;

typedef struct

{int a[];//a数组容量够大,存储各集合最后一个数据在数据表中的下标int k; //集合个数

}index;

int SetSearch_Insert(rectype R[],index id,datatype x,int i)

//数据表R,查找第i个集合的元素x,若查找成功,返回其位置,否则将其插入第i 个集合

{if(i<1 || i>id.k)printf(“无第%d个集合\n”,i);exit(0);} if(i==1)first=0;else first=id.a[i-1]+1; //first指向第i个集合在数据表的首址

last= id.a[i];//last是第i个集合在数据表中的末址

for(j=first;j≤last;j++)if(R[j]==x)return (j);//查找成功

for(j=id.a[id.k];j>id.a[i];j--) //查找失败,将x插入数据表

R[j+1]=R[j];//元素后移

R[j+1]=x; //将x插入到原第i个集合最后一个元素之后。

for(j=i;j≤k;j++)id.a[j]++;//修改索引表中各集合最后一个元素的下标}结束SetSearch_Insert

由于各集合元素个数不等,各块长度不等且块间无序,索引表中用数组表示,数组中元素值是各集合最后一个元素在数据表中的下标。按本算法插入(2,11.2)和(1,5.3),数据表前后状态如下:

3.(1)非递归建立二叉排序树,在二叉排序树上插入的结点都是叶子结点。

void Creat_BST(BiTree bst,datatype K[],int n)

// 以存储在数组K中的n个关键字,建立一棵初始为空的二叉排序树。

{for(i=1;i≤n;i++)

{p=bst;f=null;//在调用Creat_BST时,bst=null

while(p!=null)

数据结构第六章习题课

1、下图所示的4棵二叉树中,不是完全二叉树的是() 2、二叉树的前序遍历序列中,任意一个结点均处在其子女结点的前面,这种说法()。 A 、正确 B 、错误 C 、不一定 3、已知某二叉树的后序遍历序列是dabec ,中序遍历序列是debac ,它的前序遍历序列是()。 A 、acbed B 、decab C 、deabc D 、cedba 4、如果T2是由有序树T 转换而来的二叉树,那么T 中结点的后序就是T2中结点的()。 A 、前序 B 、中序 C 、后序 D 、层次序 5、深度为5的二叉树至多有()个结点。 A 、16 B 、32 C 、31 D 、10 6、在一个非空二叉树的中序遍历序列中,根结点的右边()。 A 、只有右子树上的所有结点 B 、只有右子树上的部分结点 C 、只有左子树上的部分结点 D 、只有左子树上的所有结点 7、树最适合用来表示()。 A 、有序数据元素 B 、无序数据元素 C 、元素之间具有分支层次关系的数据 D 、元素之间无联系的数据。 8、任何一棵二叉树的叶结点在先序、中序和后序遍历序列中的相对次序()。 A 、不发生改变 B 、发生改变 C 、不能确定 D 、以上都不对 9、实现任意二叉树的后序遍历的非递归算法而不使用栈结构,最佳方案是二叉树采用()存储结构。 A 、二叉链表 B 、广义表存储结构 C 、三叉链表 D 、顺序存储结构 10、对一个满二叉树,m 个树叶,n 个结点,深度为h ,则()。 A 、n=m+h B 、h+m=2n C 、m=h-1 D 、n=2h -1 11、设n ,m 为二叉树上的两个结点,在中序遍历时,n 在m 前的条件是()。 A 、n 在m 右方 B 、n 是m 祖先 C 、n 在m 左方 D 、n 是m 子孙 12.已知一算术表达式的中缀形式为 A+B*C-D/E ,后缀形式为ABC*+DE/- , A B C D

(完整版)数据结构实验报告全集

数据结构实验报告全集 实验一线性表基本操作和简单程序 1 .实验目的 (1 )掌握使用Visual C++ 6.0 上机调试程序的基本方法; (2 )掌握线性表的基本操作:初始化、插入、删除、取数据元素等运算在顺序存储结构和链表存储结构上的程序设计方法。 2 .实验要求 (1 )认真阅读和掌握和本实验相关的教材内容。 (2 )认真阅读和掌握本章相关内容的程序。 (3 )上机运行程序。 (4 )保存和打印出程序的运行结果,并结合程序进行分析。 (5 )按照你对线性表的操作需要,重新改写主程序并运行,打印出文件清单和运行结果 实验代码: 1)头文件模块 #include iostream.h>// 头文件 #include// 库头文件------ 动态分配内存空间 typedef int elemtype;// 定义数据域的类型 typedef struct linknode// 定义结点类型 { elemtype data;// 定义数据域 struct linknode *next;// 定义结点指针 }nodetype; 2)创建单链表

nodetype *create()// 建立单链表,由用户输入各结点data 域之值, // 以0 表示输入结束 { elemtype d;// 定义数据元素d nodetype *h=NULL,*s,*t;// 定义结点指针 int i=1; cout<<" 建立一个单链表"<> d; if(d==0) break;// 以0 表示输入结束 if(i==1)// 建立第一个结点 { h=(nodetype*)malloc(sizeof(nodetype));// 表示指针h h->data=d;h->next=NULL;t=h;//h 是头指针 } else// 建立其余结点 { s=(nodetype*) malloc(sizeof(nodetype)); s->data=d;s->next=NULL;t->next=s; t=s;//t 始终指向生成的单链表的最后一个节点

数据结构模拟试卷(一)

数据结构模拟试卷(一) 一、选择题(每题2分,20题,共40分) 1. 数组A[1..5,1..6]的每个元素占5个单元,将其按行优先顺序存储在起始地址为1000的连续的内存单元中,则元素A[5,5]的地址为()。 A.1140 B.1145 C.1120 D.1125 2. 下面的序列中,()是堆。 A.1,510,6,7,8,9,2 B.1,2,8,4,3,9,10,5 C.9,8,7,6,4,8,2,1 D.9,8,7,6,5,4,3,7 3. 二叉树上结点的左子树深度减去其右子树深度称为该结点的平衡因子。平衡二叉树中任意结点的平衡因子只能是()。 A.0 B.0,1 C.-1,0,1 D.1 4. 栈和队列的共同特点是: A.都是先进先出B.都是先进后出 C.只允许在端点处插入和删除元素D.没有共同点 5. 若进栈序列为a,b,c,则通过入出栈操作可能得到的a,b,c的出栈的不同排列个数为( ) A.4 B.5 C.6 D.7 6. 关键路径是AOE网中的______ 。 A.从源点到汇点的最长路径 B.从源点到汇点的最短路径 C.最短的回路 D.活动的最早开始时间与最迟发生时间相等 7. 已知数据元素为( 32 ,75 ,46 ,19 ,26,56 ,93 ,66 ),按照依次插入结点的方法生成一棵二叉排序树,则该树的深度为()。 A.4 B.5 C.7 D.6 8. 下列说法不正确的是______。 A.图的遍历是从给定的源点出发,每一个顶点仅被访问一次 B.遍历的基本算法有两种:深度遍历和广度遍历 C.图的深度遍历不适用于有向图 D.图的深度遍历是一个递归过程 9. 单循环链表的主要优点是()。 A.从表中任一结点出发都能扫描到整个链表 B.不再需要头指针了 C.在进行插入、删除操作时,能更好地保证链表不断开 D.已知某个结点的位置后,能够容易找到它的直接前趋 10. 已知一棵树的前序遍历是”GDAFEMHZ”,而中序遍历是”ADEFGHMZ”,求后序遍历?A.ADEFGHMZ B.DAEFHZMG C.AEFDHZMG D.AFEDHMZG 11. 一个包含n个节点的四叉树,每个节点都有四个指向孩子节点的指针,这4n个指针中有多少个空指针? A.2n+1 B.3n-1 C.3n D.3n+1 12. 和顺序栈相比,链栈有一个比较明显的优势是() A.通常不会出现栈满的情况

经典数据结构面试题(含答案)

栈和队列的共同特点是__________________________ .栈通常采用的两种存储结构是______________________ .用链表表示线性表的优点是_______________________ 8.在单链表中,增加头结点的目的是___________________ 9.循环链表的主要优点是________________________- 12.线性表的顺序存储结构和线性表的链式存储结构分别是 __________________________ 13.树是结点的集合,它的根结点数目是_____________________ 14.在深度为5的满二叉树中,叶子结点的个数为_______________ 15.具有3个结点的二叉树有(_____________________ 16.设一棵二叉树中有3个叶子结点,有8个度为1的结点,则该二叉树中总的结点数为____________________ 17.已知二叉树后序遍历序列是dabec,中序遍历序列是debac,它的前序遍历序列是 ____________________________ 18.已知一棵二叉树前序遍历和中序遍历分别为ABDEGCFH和DBGEACHF,则该二叉树的后序遍历为______________________ 19.若某二叉树的前序遍历访问顺序是abdgcefh,中序遍历访问顺序是dgbaechf,则其后序遍历的结点访问顺序是_______________________ 20.数据库保护分为:安全性控制、完整性控制、并发性控制和数据的恢复。 在计算机中,算法是指_______________________ 算法一般都可以用哪几种控制结构组合而成_____________________ .算法的时间复杂度是指______________________ 5. 算法的空间复杂度是指__________________________ 6. 算法分析的目的是__________________________

数据结构第十章习题课

1.下列排序算法中,其中()是稳定的。 A. 堆排序,冒泡排序 B. 快速排序,堆排序 C. 直接选择排序,归并排序 D. 归并排序,冒泡排序 2.若需在O(nlog2n)的时间内完成对数组的排序,且要求排序是稳定的,则可选择的排序方法是()。 A. 快速排序 B. 堆排序 C. 归并排序 D. 直接插入排序3.排序趟数与序列的原始状态有关的排序方法是( )排序法。 A.插入 B. 选择 C. 冒泡 D. 快速4.对一组数据(84,47,25,15,21)排序,数据的排列次序在排序的过程中 的变化为(1)84 47 25 15 21 (2)15 47 25 84 21 (3)15 21 25 84 47 (4) 15 21 25 47 84 则采用的排序是( )。 A. 选择 B. 冒泡 C. 快速 D. 插入5.对序列{15,9,7,8,20,-1,4}进行排序,进行一趟后数据的排列变为{4,9,-1,8,20,7,15};则采用的是()排序。 A. 选择 B. 快速 C. 希尔 D. 冒泡6.若上题的数据经一趟排序后的排列为{9,15,7,8,20,-1,4},则采用的 是()排序。 A.选择 B. 堆 C. 直接插入 D. 冒泡 7.在文件“局部有序”或文件长度较小的情况下,最佳内部排序的方法是()A.直接插入排序B.冒泡排序C.简单选择排序 8.下列排序算法中,()算法可能会出现下面情况:在最后一趟开始之前,所有元素都不在其最终的位置上。 A. 堆排序 B. 冒泡排序 C. 快速排序 D. 插入排序 9. 下列排序算法中,占用辅助空间最多的是:( ) A. 归并排序 B. 快速排序 C. 希尔排序 D. 堆排序10.用直接插入排序方法对下面四个序列进行排序(由小到大),元素比较次数 最少的是()。 A.94,32,40,90,80,46,21,69 B.32,40,21,46,69,94,90,80 C.21,32,46,40,80,69,90,94 D.90,69,80,46,21,32,94,40 11. 若用冒泡排序方法对序列{10,14,26,29,41,52}从大到小排序,需进行()次比较。 A. 3 B. 10 C. 15 D. 25 12.对n个记录的线性表进行快速排序为减少算法的递归深度,以下叙述正确

数据结构模拟试题及答案

数据结构模拟试题一 一、判断题(每小题1 分,共15分) 1.计算机程序处理的对象可分为数据和非数据两大类。 2.全体自然数按大小关系排成的序列是一个线性表。 3.在描述单向链表的结点类型时,必须首先描述数值字段,然后再描述指针字段。 4.顺序栈是一种规定了存储方法的栈。 5.树形结构中的每个结点都有一个前驱。 6.在任何一棵完全二叉树中,最多只有一个度为1的分支结点。 7.若某顶点是有向图的根,则该顶点的入度一定是零。 8.如果某图的邻接矩阵有全零的行,没有全零的列,则该图一定是有向图。 9.用一维数组表示矩阵可以节省存储空间。 10.广义表的长度与广义表中含有多少个原子元素有关。 11.分块查找的效率与线性表被分成多少块有关。 12.散列表的负载因子等于存入散列表中的结点个数。 13.在起泡排序过程中,某些元素可能会向相反的方向移动。 14.按某种逻辑关系组织起来的记录的集合称为逻辑记录。 15.索引非顺序文件的特点是索引表中的索引项不一定按关键字大小有序排列。 二、填空题(每空1分,共15分) 1.顺序表是一种_____________线性表。 2.若用Q[1]~Q[m]作为非循环顺序队列的存储空间,则对该队列最多只能执行___次插入操作。 3.栈和队列的区别在于________的不同。 4.在高度为h(h≥0)的二叉树中至少有___个结点,至多有___个结点。 5.若用二叉链表来存储具有m个叶子,n个分支结点的树,则二叉链表中有___个左指针域为空的结点,有___个右指针域 为空的结点。 6.n个顶点的有根有向图中至少有___条边,至多有___条边。 7.10行20列矩阵若用行优先顺序表来表示,则矩阵中第8行第7列元素是顺序表中第___个元素。 8.在各元素查找概率相等的情况下,用顺序查找方法从含有12个元素的有序表中查找一个元素,元素间的平均比较次数是 _____。 9.在归并两个长度为m的有序表时,排序码的比较次数至少是___次,至多是___次。 10.在高度为3的6阶B-树中,至少有___个关键字,至多有___个关键字。 三、选择题(每题2分,共30分) 1.计算机所处理的数据一般具有某种内在联系性,这是指________。 A.元素和元素之间存在某种关系B.数据和数据之间存在某种关系 C.元素内部具有某种结构D.数据项和数据项之间存在某种关系 2. 假设顺序表目前有4个元素,第i个元素放在R[i]中,1≤i≤4 。若把新插入元素存入R[6],则________。 A.会产生运行错误B.R[1]~R[6]不构成一个顺序表 C.顺序表的长度大于顺序表元素个数,会降低存储空间利用率 D.顺序表元素序号和数组元素下标不一致,会给使用带来麻烦 3. 设H是不带表头结点循环单向链表的表头指针,P是和H同类型的变量。当P指向链表最后一个结点时,_________。A.P所指结点指针字段的值为空B.P的值与H的值相等 C.P所指结点的地址与H的值相等D.P所指结点指针字段的值与H的值相等 4. 栈的定义不涉及数据的__________。 A.逻辑结构B.存储结构C.运算D.逻辑结构和存储结构 5. 设5个元素进栈的顺序是1,2,3,4,5,则出栈的顺序有可能是___________。 A.2,4,1,3,5 B.3,4,1,5,2 C.3,2,4,1,5 D.4,1,3,2,5 6. 若某棵二叉树结点的前序序列和中序序列相同,则该二叉树_________。 A.只有一个结点B.每个结点都没有左孩子C.每个结点都没有右孩子D.不存在 7.对于一棵具有n个结点,度为3的树来说,____________。 A.树的高度至多是n-3 B.树的高度至多是n-2 C.树的最低高度是┏log3(n+1)┓ D.至少在某一层上正好有3个结点 8.n个顶点的有向图如果可以进行拓扑排序,则可以断定该有向图__________。 A.含n个强连通分量B.有唯一的入度为0的顶点C.有多个出度为0的顶点 D.是一个有根有向图 9. 特殊矩阵用行优先顺序表表示,_____________ A.简化了矩阵元素之间的逻辑关系B.便于按行处理矩阵元素

数据结构模拟卷(含答案)经典习题培训讲学

数据结构模拟卷(含答案)经典习题

练习题 一、单项选择题 1. 若将数据结构形式定义为二元组(K,R),其中K是数据元素的有限集合,则R是K上( ) A. 操作的有限集合 B. 映象的有限集合 C. 类型的有限集合 D. 关系的有限集合 2. 在长度为n的顺序表中删除第i个元素(1≤i≤n)时,元素移动的次数为( ) A. n-i+1 B. i C. i+1 D. n-i 3. 若不带头结点的单链表的指针为head,则该链表为空的判定条件是( ) A. head==NULL B. head->next==NULL C. head!=NULL D. head->next==head 4. 引起循环队列队头位置发生变化的操作是( ) A. 出队 B. 入队 C. 取队头元素 D. 取队尾元素 5. 若进栈序列为1,2,3,4,5,6,且进栈和出栈可以穿插进行,则不.可能出现的出栈序列是( ) A. 2,4,3,1,5,6 B. 3,2,4,1,6,5 C. 4,3,2,1,5,6 D. 2,3,5,1,6,4

6. 字符串通常采用的两种存储方式是( ) A. 散列存储和索引存储 B. 索引存储和链式存储 C. 顺序存储和链式存储 D. 散列存储和顺序存储 7. 数据结构是() A.一种数据类型 B.数据的存储结构 C.一组性质相同的数据元素的集合 D.相互之间存在一种或多种特定关系的数据元素的集合 8. 算法分析的目的是() A.辨别数据结构的合理性 B.评价算法的效率 C.研究算法中输入与输出的关系 D.鉴别算法的可读性 9. 在线性表的下列运算中,不.改变数据元素之间结构关系的运算是 () A.插入B.删除 C.排序D.定位10. 下列图示的顺序存储结构表示的二叉树是( )

数据结构第九章排序习题与答案

习题九排序 一、单项选择题 1.下列内部排序算法中: A.快速排序 B.直接插入排序 C. 二路归并排序 D.简单选择排序 E. 起泡排序 F.堆排序 (1)其比较次数与序列初态无关的算法是() (2)不稳定的排序算法是() (3)在初始序列已基本有序(除去n 个元素中的某 k 个元素后即呈有序, k<

大工数据结构课程考试模拟试卷a

少年易学老难成,一寸光阴不可轻- 百度文库 《数据结构》 一、单项选择题(本大题共10小题,每小题3分,共30分) 1、若进栈的序列为1,2,3,4,则不可能得到的出栈序列是()。 A. 3,2,1,4 B. 3,2,4,1 C. 4,2,3,1 D. 2,3,4,1 2、深度为k的完全二叉树所含叶结点的个数最多为(),设根结点在第1层上。 A. 2k B. 2k-1 C. k D. 2k-1 3、衡量查找算法效率的主要标准是()。 A. 元素个数 B. 所需的存储量 C. 平均查找长度 D. 算法难易程度 4、与线性表的顺序存储不相符的特性是()。 A. 插入和删除操作灵活 B. 需要连续的存储空间 C. 便于随机访问 D. 存储密度大 5、若进队序列为1,2,3,则出队序列是()。 A. 3,2,1 B. 1,2,3 C. 1,3,2 D. 3,1,2 6、不带头结点的单链表L为空的判定条件是()。 A. L==NULL B. L->next==NULL C. L->next==L D. L!=NULL 7、union(A,B,C)表示求集合A和B的并集C。若A={a,b,c},B={c,d},则union(A,B,C)运算后C=()。 A.{a,b,c,d} B.{a,b,c} C.{a,b} D.{c,d} 8、数组A中,每个元素的长度为3个存储单元,行下标i从1到5,列下标j从1到6,从首地址SA开始连续存放在存储器内,存放该数组至少需要的存储单元数是()。 A. 90 B. 70 C. 50 D. 30 9、遍历一棵具有n个结点的二叉树,在先序序列、中序序列和后序序列中所有叶子结点的相对次序()。 A. 都不相同 B. 完全相同 C. 先序和中序相同 D. 中序和后序相同 10、用给定的哈夫曼编码来压缩数据文件,其压缩效率主要取决于()。 A. 文件长度 B. 平均码长 C. 被压缩文件的特征 D. 以上都不是 1、设有如下遗产继承规则:丈夫和妻子可以互相继承遗产,子女可以继承父亲或母亲的遗产,子女间不能相互继承,则表示该遗产继承关系的最合适的数据结构应该是()。 A. 树 B. 图 C. 数组 D. 二叉树 2、下列排序中,占用辅助空间最多的是()。 A. 堆排序 B. 冒泡排序 C. 直接选择排序 D. 二路归并 3、排序方法中,从未排序序列中依次取出元素与已排序序列(初始时为空)中的元素进行比较,将其放入已排序序列的正确位置上的方法,称为()。 A. 选择排序 B. 冒泡排序 C. 希尔排序 D. 插入排序 4、在待排序序列局部有序的情况下,最好的内部排序应该是()。 A. 直接选择排序 B. 堆排序 C. 直接插入排序 D. 快速排序 5、下列排序算法中不稳定的是()。 A. 直接选择排序 B. 直接插入排序 C. 起泡排序 D. 归并排序 6、当利用大小为N的数组顺序存储一个栈时,假定用top==N表示栈空,则向这个栈插入一个元素时,首先应执行()语句修改top指针。 A. top++ B. top-- C. top=0 D. top=N-1 7、在一个带头结点的双向循环链表中,若要在p所指向的结点之前插入一个新结点,则需要相继修改()个指针域的值。 A. 2 B. 3 C. 4 D. 5 8、利用3,6,8,12,5,7这六个值作为叶子结点的权,生成一棵哈夫曼树,该树的深度为()。 A. 3 B. 4

数据结构模拟卷(含答案)经典习题

练习题 一、单项选择题 1. 若将数据结构形式定义为二元组(K,R),其中K是数据元素的有限集合,则R是K上( ) A. 操作的有限集合 B. 映象的有限集合 C. 类型的有限集合 D. 关系的有限集合 2. 在长度为n的顺序表中删除第i个元素(1≤i≤n)时,元素移动的次数为( ) A. n-i+1 B. i C. i+1 D. n-i 3. 若不带头结点的单链表的指针为head,则该链表为空的判定条件是( ) A. head==NULL B. head->next==NULL C. head!=NULL D. head->next==head 4. 引起循环队列队头位置发生变化的操作是( ) A. 出队 B. 入队 C. 取队头元素 D. 取队尾元素 5. 若进栈序列为1,2,3,4,5,6,且进栈和出栈可以穿插进行,则不.可能出现的出栈序列是( ) A. 2,4,3,1,5,6 B. 3,2,4,1,6,5 C. 4,3,2,1,5,6 D. 2,3,5,1,6,4 1

6. 字符串通常采用的两种存储方式是( ) A. 散列存储和索引存储 B. 索引存储和链式存储 C. 顺序存储和链式存储 D. 散列存储和顺序存储 7. 数据结构是() A.一种数据类型 B.数据的存储结构 C.一组性质相同的数据元素的集合 D.相互之间存在一种或多种特定关系的数据元素的集合 8. 算法分析的目的是() A.辨别数据结构的合理性 B.评价算法的效率 C.研究算法中输入与输出的关系 D.鉴别算法的可读性 9. 在线性表的下列运算中,不.改变数据元素之间结构关系的运算是 () A.插入B.删除 C.排序D.定位 10. 下列图示的顺序存储结构表示的二叉树是( ) 2

《数据结构》实验报告

《数据结构》实验报告 实验序号:4 实验项目名称:栈的操作

附源程序清单: 1. #include #define MaxSize 100 using namespace std; typedef int ElemType; typedef struct { ElemType data[MaxSize]; int top; }SqStack; void InitStack(SqStack *st) //初始化栈 { st->top=-1; } int StackEmpty(SqStack *st) //判断栈为空{ return (st->top==-1); } bool Push(SqStack *st,ElemType x) //元素进栈{ if(st->top==MaxSize-1)

{ return false; } else { st->top++; //移动栈顶位置 st->data[st->top]=x; //元素进栈 } return true; } bool Pop(SqStack *st,ElemType &e) //出栈 { if(st->top==-1) { return false; } else { e=st->data[st->top]; //元素出栈 st->top--; //移动栈顶位置} return true; } //函数名:Pushs //功能:数组入栈 //参数:st栈名,a->数组名,i->数组个数 bool Pushs(SqStack *st,ElemType *a,int i) { int n=0; for(;n数组名,i->数组个数 bool Pops(SqStack *st,ElemType *a,int i) { int n=0; for(;n

数据结构模拟试题1

一、单项选择题(在每小题列出的四个选项中只有一个选项是符合题目要求的,请将正确选项前的字母填在题后的括号内。每小题2分,共40分) 1、串的长度是()。 A、串中不同字母的个数 B、串中不同字符的个数 C、串中所含字符的个数,且大于0 D、串中所含字符的个数 2、若用数组S[1..n]作为两个栈S1和S2的共同存储结构,对任何一个栈,只有当S全满时才不能作入栈操作。为这两个栈分配空间的最佳方案是()。 A、S1的栈底位置为0,S2的栈底位置为n+1 B、S1的栈底位置为0,S2的栈底位置为n/2 C、S1的栈底位置为1,S2的栈底位置为n D、S1的栈底位置为1,S2的栈底位置为n/2 3、队列操作的原则是()。 A、先进先出 B、后进先出 C、只能进行插入 D、只能进行删除 4、有64个结点的完全二叉树的深度为()(根的层次为1)。 A、8 B、7 C、6 D、5 5、在有n个结点的二叉链表中,值为非空的链域的个数为()。 A、n-1 B、2n-1

C、n+1 D、2n+1 6、带权有向图G用邻接矩阵A存储,则顶点i的人度等于A中()。 A、第i行非∞的元素之和 B、第i列非∞的元素之和 C、第i行非∞且非0的元素个数 D、第i列非∞且非0的元素个数 7、在有n个结点且为完全二叉树的二叉排序树中查找一个键值,其平均比较次数的数量级为()。 A、0(n) B、0(log2n) C、0(nolg2n) D、0(n2) 8、若表R在排序前已按键值递增顺序排列,则()算法的比较次数最少。 A、直接插入排序 B、快速排序 C、归并排序 D、选择排序 9、下列排序算法中,()排序在某趟结束后不一定选出一个元素放到其最终的位置上。 A、选择 B、冒泡 C、归并 D、堆

经典数据结构上机题_答案解析

数据结构上机实验题目 实验一线性表的顺序存储结构 实验学时 2学时 背景知识:顺序表的插入、删除及应用。 目的要求: 1.掌握顺序存储结构的特点。 2.掌握顺序存储结构的常见算法。 实验容 1.输入一组整型元素序列,建立顺序表。 2.实现该顺序表的遍历。 3.在该顺序表中进行顺序查找某一元素,查找成功返回1,否则返回0。4.判断该顺序表中元素是否对称,对称返回1,否则返回0。 5.实现把该表中所有奇数排在偶数之前,即表的前面为奇数,后面为偶数。 6.输入整型元素序列利用有序表插入算法建立一个有序表。 7.利用算法6建立两个非递减有序表并把它们合并成一个非递减有序表。 8. 利用该顺序结构实现循环队列的入队、出队操作。 8.编写一个主函数,调试上述算法。 #include #include

#define OVERFLOW 0 #define MAXSIZE 100 typedef int ElemType; typedef struct list {ElemType elem[MAXSIZE]; int length; }Sqlist; void Creatlist(Sqlist &L) {int i; printf("请输入顺序表的长度:"); //输入一组整型元素序列,建立一个顺序表。 scanf("%d",&L.length); for(i=0;i

数据结构课后习题答案第九章

第九章查找(参考答案) 9.1 int seqsearch( rectype r[], keytype k) // 监视哨设在n个元素的升序顺序表低下标端,顺序查找关键字为k的数据// 元素。若存在,则返回其在顺序表中的位置,否则,返回0 r[0].key=k; i=n; while (r[i].key>k) i--; if (i>0 && r[i].key==k) return(i); else return(0) } // 算法结束 查找过程的判定树是单支树。 查找成功的平均查找长度为 ASL=∑PICI =1/n*∑i = 1/2*(n+1) 查找不成功的平均查找长度为 ASL=1/(n+1)(∑i+(n+1))=(n+2)/2. 9.2 typedef struct lnode {int freq; // 访问频率域 keytype key; // 关键字 ElemType other; struct lnode *prior,*next; // 双向链表 }seqlist; typedef struct snode {int freq; // 访问频率域 keytype key; // 关键字 ElemType other; }snode; void locate(seqlist L,keytype X) // 在链表中查找给定值为X的结点,并保持访问频繁的结点在前 //调用本函数前,各结点的访问频率域(freq)值均为0。 {seqlist *p; // p是工作指针 p=L->next; // p指向第一元素 while (p!=null && p->key!=X) p=p->next; // 查找X结点 if (p==null) {printf(“no X”); return; } else {q=p->prior; // q是p的前驱 p->next->prior=p->prior; // 先将p结点从链表中摘下 q->next=p->next; while (q!=L && q->freqprior; // 找p结点位置 q->next->prior=p; // 将p结点插入链表 p->next=q->next; p->prior=q; q->next=p; } // 算法结束 void locate(snode L[],int n;keytype X)

数据结构课程实验报告(15)

课程实验报告课程名称:数据结构 专业班级:信安1302 学号: 姓名: 指导教师: 报告日期:2015. 5. 12 计算机科学与技术学院

目录 1 课程实验概述............ 错误!未定义书签。 2 实验一基于顺序结构的线性表实现 2.1 问题描述 ...................................................... 错误!未定义书签。 2.2 系统设计 ...................................................... 错误!未定义书签。 2.3 系统实现 ...................................................... 错误!未定义书签。 2.4 效率分析 ...................................................... 错误!未定义书签。 3 实验二基于链式结构的线性表实现 3.1 问题描述 ...................................................... 错误!未定义书签。 3.2 系统设计 ...................................................... 错误!未定义书签。 3.3 系统实现 ...................................................... 错误!未定义书签。 3.4 效率分析 ...................................................... 错误!未定义书签。 4 实验三基于二叉链表的二叉树实现 4.1 问题描述 ...................................................... 错误!未定义书签。 4.2 系统设计 ...................................................... 错误!未定义书签。 4.3 系统实现 ...................................................... 错误!未定义书签。 4.4 效率分析 ...................................................... 错误!未定义书签。 5 实验总结与评价 ........... 错误!未定义书签。 1 课程实验概述 这门课是为了让学生了解和熟练应用C语言进行编程和对数据结构进一步深入了解的延续。

数据结构经典题目c语言代码

《数据结构》课程设计题目 (程序实现采用C语言) 题目1:猴子选王(学时:3) 一堆猴子都有编号,编号是1,2,3 ...m,这群猴子(m个)按照1-m的顺序围坐一圈,从第1开始数,每数到第n个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王。 要求:m及n要求从键盘输入,存储方式采用向量及链表两种方式实现该问题求解。 //链表 #include #include // 链表节点 typedef struct _RingNode { int pos; struct _RingNode *next; }RingNode, *RingNodePtr; // 创建约瑟夫环,pHead:链表头指针,count:链表元素个数 void CreateRing(RingNodePtr pHead, int count) { RingNodePtr pCurr = NULL, pPrev = NULL; int i = 1; pPrev = pHead; while(--count > 0)

{ pCurr = (RingNodePtr)malloc(sizeof(RingNode)); i++; pCurr->pos = i; pPrev->next = pCurr; pPrev = pCurr; } pCurr->next = pHead; // 构成环状链表 } void KickFromRing(RingNodePtr pHead, int n) { RingNodePtr pCurr, pPrev; int i = 1; // 计数 pCurr = pPrev = pHead; while(pCurr != NULL) { if (i == n) { // 踢出环 printf("\n%d", pCurr->pos); // 显示出圈循序 pPrev->next = pCurr->next; free(pCurr); pCurr = pPrev->next; i = 1; } pPrev = pCurr;

数据结构实验报告--图实验

图实验 一,邻接矩阵的实现 1.实验目的 (1)掌握图的逻辑结构 (2)掌握图的邻接矩阵的存储结构 (3)验证图的邻接矩阵存储及其遍历操作的实现 2.实验内容 (1)建立无向图的邻接矩阵存储 (2)进行深度优先遍历 (3)进行广度优先遍历 3.设计与编码 MGraph.h #ifndef MGraph_H #define MGraph_H const int MaxSize = 10; template class MGraph { public: MGraph(DataType a[], int n, int e); ~MGraph(){ } void DFSTraverse(int v); void BFSTraverse(int v); private: DataType vertex[MaxSize]; int arc[MaxSize][MaxSize]; int vertexNum, arcNum; }; #endif MGraph.cpp #include using namespace std; #include "MGraph.h" extern int visited[MaxSize]; template MGraph::MGraph(DataType a[], int n, int e)

{ int i, j, k; vertexNum = n, arcNum = e; for(i = 0; i < vertexNum; i++) vertex[i] = a[i]; for(i = 0;i < vertexNum; i++) for(j = 0; j < vertexNum; j++) arc[i][j] = 0; for(k = 0; k < arcNum; k++) { cout << "Please enter two vertexs number of edge: "; cin >> i >> j; arc[i][j] = 1; arc[j][i] = 1; } } template void MGraph::DFSTraverse(int v) { cout << vertex[v]; visited[v] = 1; for(int j = 0; j < vertexNum; j++) if(arc[v][j] == 1 && visited[j] == 0) DFSTraverse(j); } template void MGraph::BFSTraverse(int v) { int Q[MaxSize]; int front = -1, rear = -1; cout << vertex[v]; visited[v] = 1; Q[++rear] = v; while(front != rear) { v = Q[++front]; for(int j = 0;j < vertexNum; j++) if(arc[v][j] == 1 && visited[j] == 0){ cout << vertex[j]; visited[j] = 1;

数据结构经典例题

数据结构经典例题 1.设计一个算法将L拆分成两个带头节点的单链表L1和L2。 void split(LinkList *&L,LinkList *&L1,LinkList *&L2) { LinkList *p=L->next,*q,*r1; //p指向第1个数据节点 L1=L; //L1利用原来L的头节点 r1=L1; //r1始终指向L1的尾节点 L2=(LinkList *)malloc(sizeof(LinkList));//创建L2的头节点 L2->next=NULL; //置L2的指针域为NULL while (p!=NULL) { r1->next=p; //采用尾插法将*p(data值为ai)插入L1中 r1=p; p=p->next; //p移向下一个节点(data值为bi) q=p->next; //由于头插法修改p的next域,故用q保存*p的后继节点 p->next=L2->next; //采用头插法将*p插入L2中 L2->next=p; p=q; //p重新指向ai+1的节点 } r1->next=NULL; //尾节点next置空 } 2.查找链表中倒数第k个位置上的节点(k为正整数)。若查找成功,算法输出该节点的data域的值,并返回1;否则,只返回0。 typedef struct LNode {int data; struct LNode *link; } *LinkList; int Searchk(LinkList list,int k) { LinkList p,q; int count=0; p=q=list->link; while (p!=NULL) { if (countlink; p=p->link; } if (count

相关主题
文本预览
相关文档 最新文档