C语言程序设计练习题.docx
- 文档编号:25297219
- 上传时间:2023-06-07
- 格式:DOCX
- 页数:43
- 大小:768.63KB
C语言程序设计练习题.docx
《C语言程序设计练习题.docx》由会员分享,可在线阅读,更多相关《C语言程序设计练习题.docx(43页珍藏版)》请在冰豆网上搜索。
C语言程序设计练习题
C语言程序设计练习题
答案
第1、2、3章概述、类型、表达式
一、选择题
1-5ADCBD6-10BACAA11-15BBDCC16-20BACAD21-25CDDDC26-30CDCCC31-35BDCBA36-40DDCBD41-45BDBCCB
第4章顺序结构
一、选择题
1-5DDCDA6-10BDCBD11-15ABBAD16-20DABBB
第5、6章选择与循环结构
一、选择题
1-5ACBAC6-10DAABB11-15DDBAA16-20CDADA21-25DCCDB26-30CDBDB
第7章数组
一、选择题
1-5DDDCC6-10DDDCC11-15DDCBD16-20CABBB21-25DBCCC26-30CDBDD
第8章函数
一、选择题
1-5DBCBA6-10BDCCB11-15BAADA16-20BDBCA21-25BCADC26-30CABBB31-35ADCCD36-40ACDBC
第9章编译预处理
一、选择题
1-5CCCDD6-10DCCDC11-15BBDBB
第10章指针
一、选择题
1-5ADCBA6-10DBBCB11-15AACCA16-20CBCCA21-25BDBAB26-30BDADD31-35DCDAB36-40DBBDD
第11章结构与联合
一、单选题
1-5DCBCD6-10DDADC11-15CBBDA16B
第12章文件
一、单选题
1A2B3CC4B5D6-10BBADC11-15ADCDA
数据结构答案
第一章
1.B
2.该程序段的时间复杂度为O(m*n)。
3.其中语句①的执行次数是1,设语句②的执行次数为f(n),则有:
2f(n)n。
得:
T(n)=O(log2n)
4.B
第二章
1.B2.B3.B4.B5.A6.B7.B8.D
9.解:
intlength(LinklistL)
{
intI;
listnode*p;
I=0;
P=L;
while(p->next!
=L){
p=p->next;
}
returnI;
}
10解:
voidpur_LinkList(LinkListH)
{LNode*p,*q,*r;p=H->next;/*p指向第一个结点*/
if(p==NULL)return;
while(p->next)
{q=p;
while(q->next)/*从*p的后继开始找重复结点*/
{if(q->next->data==p->data)
{r=q->next;/*找到重复结点,用r指向,删除*r*/q->next=r->next;
free(r);
}/*if*/
elseq=q->next;
}/*while(q->next)*/
p=p->next;/*p指向下一个,继续*/
}/*while(p->next)*/
}
该算法的时间性能为O(n2)。
11答:
voidLinkList_reverse(LinkList&L)
{
LinkListp,q,s;
p=L->next;q=p->next;s=q->next;p->next=NULL;
while(s->next)
{
q->next=p;p=q;
q=s;s=s->next;
}
q->next=p;s->next=q;L->next=s;
}
12答:
voiddelinsert(LinkList&L)
{
p=L->next;//p是链表的工作指针
pre=L;//pre指向链表中数据域最小值结点的前驱
q=p;//q指向数据域最小值结点,初始假定是第一结点while(p->next!
=NULL)
{
if(p->next->data
{pre=p;q=p->next;}
p=p->next;
}
if(q!
=L->next)//若最小值是第一元素结点,则不需再操作
{
pre->next=q->next;//将最小值结点从链表上摘下q->next=L->next;//将q结点插到链表最前面L->next=q;
}
13.]解:
假设单链表的表头指针用head表示,其类型为上面定义的LinkList,并且单链表不带头结点。
逆置后原
来的最后一个结点成为第一个结点,于是从第一个结点开始逐个修改每个结点的指针域进行逆置,且刚被逆置的
结点总是新链表的第一个结点,故令head指向它(如图2-1所示)。
具体算法描述如下:
(b)第三个结点逆置
图2-1单链表逆置示意图
voidcontray(LinkList*head)
{〃将head单链表中所有结点按相反次序链接
LinkList*p,*q;
p=head;//p指向未被逆序的第一个结点,初始时指向原表头结点head=NULL;
while(p!
=NULL)
{q=p;//q指向将被逆序链接的结点
p=p->next;
q->next=head;
head=q;
}}
14.解:
该可以这样考虑,先取开始结点的值,将它与其后的所有结点值比较,发现相同的就删除掉,然后
再取第二结点的值,重复上述过程直到最后一个结点。
设单链表(其类型为LinkList)的头指针head指向头结点,则可按下列步骤执行:
首先,用一个指针p指向单链表中第一个表结点,然后用另一个指针q查找链表中其余结点元素,由于是
单链表,故结束条件为p==NULL,同时让指针s指向q所指结点的前趋结点,当查找到结点具有q->data==p->data时删除q所指的结点,然后再修改q,直到q为空;然后使p指针后移(即p=p->next),重复进行,直到p为空时为止。
算法描述如下:
del(LinkList*head)
{〃删除单链表中值相同的多余结点
LinkList*p,*s,*q;p=head->next;
while(p!
=NULL&&p->next!
=NULL)
{s=p;//s指向要删除结点的前趋
q=p->next;
while(q!
=NULL)
{if(q->data==p->data)}//查找值相同的结点并删除
{s->next=q->next;
free(q);
q=s->next;
}else
{s=q;
q=q_>next;
}p=p->next;
}
}
第三、四章
15.D16.D17.C18.D19.A
二、填空
1.线性、任何、栈顶、队尾、队首2.n-i+13.n-i4.n-1
第八章
1.B
2.解:
初始
12
77
21
65
38
7
38
53
1趟
12
77
21
65
38
7
38
53
2趟
12
21
77
65
38
7
38
53
3趟
12
21
65
77
38
7
38
53
4趟
12
21
38
65
77
7
38
53
5趟
7
12
21
38
65
77
38
53
6趟
7
12
21
38
38
65
77
53
7趟
7
12
21
38
38
53
65
77
(表示有序区)
3.第一趟:
1565(4863497126)
第二趟:
154865(63497126)
第三趟:
6154865(3497126)
第四趟:
615344865(97126)
第五趟:
61534486597(126)
第六趟:
161534486597(26)
第七趟:
16152634486597
4.第一趟:
1537251047833298
第二趟:
1525103747328398
第三趟:
1510253732478398
第四趟:
1015253237478398
第五趟:
1015253237478398
5.第一趟:
1(4581674276929)
第二趟:
18(451674276929)
第三趟:
1816(4574276929)
第四趟:
181627(74456929)
第五趟:
18162729(456974)
第六趟:
1816272945(6974)
第七趟:
18162729456974
初始1
趟
|2趟
3趟
4趟
5趟
17
17
17
17
7
7
18
18
18
7
17
17
6040
7
18
1
18
18
40
7
32
32
11
32
32
7:
32
40
40
1
40
40
321
60
60
60
1
60
60
731
65
65
65
1
65
65
65
73
73
73
1■
73
73
85、
85
85
85
1
85
85
(表示有序区)
7.快速排序的第一趟结果为{
22,19,13,6,24,38,43,12};堆排序时所建立的初始大顶堆如所图所示:
两种排序方法所需辅助空间:
堆是0
(1),快速排序是O(logn),可见堆排序所需辅助空间较少;在最坏情况下两
种排序方法所需时间:
堆是0(nlogn),快速排序是0(n2),所以,可见快速排序时间复杂度最差。
注意:
快速排序的平均时排序速度最快,但在最坏情况下不一定比其他排序方法快。
lowhigh
low=high,所以第一趟快速排序的结果为:
712213865773853
(2)关键字序列(2,2,1)可以作为一个反例。
取第一个关键字作为支点,在一趟快排之后的结果是(1,2,
2),由于2已在排序后的最终位置,2在2划分出的前一部分子表中,所以2不可能再出现在2之后,即不可能
与原始序列中两者的顺序一致。
此反例说明快速排序不是稳定排序。
(加框为每次冒出元素)
21,32,73,68
21,32,68,73
9.解析:
(1)采用冒泡排序方法排序的各趟结果如下:
初始序列:
25,18,60,40,7,
第——趟:
口7,25,18,60,40,
第二趟:
7,
□8,
25,
21,
60,
40,
32,
68,
73
第三趟:
7,
18,
□,
25,
32,
60,
40,
68,
73
第四趟:
7,
18,
21,
□5,
32,
40,
60,
68,
73
第五趟:
7,
18,
21,
25,
32,
40,
60,
68,
73
第五趟无元素交换,排序结束。
初始序列:
25,
18,
60,
40,
□,
21,
32,
73,
68
第一一趟:
[7]
□8,
60,
40,
25,
2l,
32,
73,
68
第二趟:
[7,
18]
60,
40,
25,
□,
32,
73,
68
第三趟:
[7,
18,
21]
40,
□5,
60,
32,
73,
68
第四趟:
[7,
18,
21,
25]
40,
60,
□2,
73,
68
第五趟:
[7,
18,
21,
25,
32]
60,
□0,
73,
68
第八趟:
[7,
18,
21,
25,
32,
40]
□0,
73,
68
第七趟:
[7,
18,
21,
25,
32,
40,
60]
73,
□8
第八趟:
[7,
18,
21,
25,
32,
40,
60,
68]
73
结束:
7,
18,
21,
25,
32,
40,
60,
68,
73
(3)采用快速排序方法排序的各趟结果如下
:
初始序列:
25,
18,
60,
40,
乙
21,
32,
73,
68
第一趟:
[21
18
7]
25
[40
60
32
73
68]
第二趟:
[7
18]
21
25
[32]
40
[60
73
68]
第三趟:
7
[18]
21
25
32
40
60
[73
68]
第四趟:
7
18
21
25
32
40
60
[68]
73
结束:
7
18
21
25
32
40
60
68
73
10.
C11.6
第七章
1
1.B2.B3
C4.
C5.C
6.A
7.D
8.A
9.C10.A
11.D2.
A13
B14.
B15.
B16.D17.
C18.C
19.B20.B21.B22.B23.
B24.A25.C
2
1.⑴k1
⑵k2,k5,k7,k4
⑶2
⑷3
⑸4
⑹k5,k6
(2)采用直接选择排序方法排序的各趟结果如下:
(加框为每次选出元素)
⑺k1
2.树的结点个数至少为1(不同教材规定不同),而二叉树的结点个数可以为0;
树中结点的最大度数没有限制,而二叉树结点的最大度数为2;
树的结点无左、右之分,而二叉树的结点有左、右之分;
3.树可采用孩子-兄弟链表(二叉链表)做存储结构,目的并利用二叉树的已有算法解决树的有关问题。
10.dgbaechif、abdgcefhi、gdbeihfca
1.5种,图6.11
2.
二叉树如图6.12所示。
中序线索二叉树如图6.13(左)所示;
6.14所示。
3.
该二叉树转换后的的森林如图
后序线索二叉树如图
6.13
所示;
图
6.14
4.
图6.8的树转化为一棵二叉树如下,图
6.15:
图6.15
示
5.
画出构造Huffman树如图6.16所示,计算其带权路径长度为
图6.16Huffman树
i'c
h
对应的森林
i
一棵树的孩子兄弟表
6.一棵含有N个结点的k叉树,可能达到的最大深度h=N-k+1
最小深度各为:
logkN+1。
4
1.解:
方法是:
由前序先确定root,由中序可确定root的左、右子树。
然后由其左子树的元素集合和右子树的
集合对应前序遍历序列中的元素集合,可继续确定root的左右孩子。
将他们分别作为新的root,不断递归,则
所有元素都将被唯一确定,问题得解。
2.答:
算法如下
intBtreeHeight(BinTreeNode*BT)
{inth1,h2,h;
if(BT==NULLh=0;
else{
h1=BTreeHeight(BT—>leftChild);
h2=BTreeHeight(BT—>rightChild);
if(hl>h2)h=h1+1;
elseh=h2+1;
}
returnh;
}
3.
(1)二叉排序树如下图所示:
(2)哈夫曼树如下图所示:
4.先由先序序列的第一个结点确定二叉树的根结点,再由根结点在中序序列中左侧部分为左子树结点,在右侧部分为右子树结点,再由先序序列的第一个结点确定根结点的左右孩子结点,由类似的方法可确定其他结点,如
5.
下图所示。
第九章
1.用链地址法处理冲突的哈希表如下图所示:
0A
t
■
-WH1斗4汀—«1A1
£
A
3
-►
ex;
1匕却囚
4
A
E
A
e
十创卜1
7
ZD
&
A
•a
A
LD
11
*1口11A1
七1MIAI
12
A
ASL=1(1*6+2*4+3*1+4*1)=1.75
2.答:
线性探测再散列的散列表:
0123456789101112
14
1
68
27
55
19
20
84
79
23
11
10
1
2
1
4
3
1
1
3
9
1
1
3
查找成功的平均长度为ASL=1/12(1*6+2*1+3*3+4*1+9)=2.5查找不成功的平均长度为ASL=1/13(1+2+3+4…….+13)=7
3.
哈希表如下图所示:
4.哈希表及查找各关键字要比较的次数如下所示:
1
ASL=-(4X1+1X2+1X4+2X5)=2.5
012345678910
11
22
47
92
16
3
7
29
8
△▲△△
分析:
47、7、11、16、92均是由哈希函数得到的没有冲突的哈希地址而直接存入的。
H(29)=7,哈希地址上冲突,需寻找下一个空的哈希地址:
由Hi=(H(29)+1)MOD11=8,哈希地址8为空,将29存入。
另外,22、8同样在哈希地址上有冲突,也是由H找到空的哈希地址的。
而H(3)=3,哈希地址上冲突,由:
H1=(H(3)+1)MOD11=4,仍然冲突。
H2=(H(3)+2)MOD11=5,仍然冲突。
H3=(H(3)+3)MOD11=6,找到空的哈希地址,存入。
6.解:
建表如下:
7.解:
依题意,m=13,
9*A
A
线性探测法的下一个地址计算公式为:
di=H(key)
di+1=(di+1)%m;i=1,2,
其计算函数如下:
H
(19):
=19%13
=6
H
(01):
=01%13
=1
H
(23):
=23%13
=10
H
(14):
=14%13
=1
(冲突)
H
(14):
=(1+1)
%14
=2
H
(55):
=55%13
=3
H
(20):
=20%13
=7
H
(84):
=84%13
=6
(冲突)
H
(84):
=(6+1)
%14
=7
(仍冲突)
H
(84):
=(7+1)
%14
=8
H
(27):
=27%13
=1
(冲突)
H
(27):
=(1+1)
%14
=2
(仍冲突)
H
(27):
=(2+1)
%14
=3
(仍冲突)
H
(27):
=(3+1)
%14
=4
H
(68):
=68%13
=3
(冲突)
H
(68):
=(3+1)
%14
=4
(仍冲突)
H
(68):
=(4+1)
%14
=5
H
(11):
=11%13
=11
H
(10):
=10%13
=10
(冲突)
H
(10):
=(10+1)
%14
=11(仍冲突)
H
(10):
=(11+1)
%14
=12
H
(77):
=77%13
=12
(冲突)
H
(77):
=(12+1)
%14
=13
哈希表如下:
哈希地址
0
1
2
3
4
5
6
7
8
9
10
11
12
13
关键字
1
14
55
27
68
19
20
84
23
11
10
77
比较次数
1
2
1
4
3
1
1
3
1
1
3
2
共有12个关键字,等概率查找,则成功查找时
ASL=(1+2+1+4+3+1+1+3+1+1+3+2)/12=23/12~1.9
8.解析:
(1)散列表如图13.14所示。
地址
012
3
4
5
fi
7
8
9
10
II
12
養■字
Z7
53
2
ii
19
20
B
IB
比软次更
3
1
1
1
1
I
1
2
E13.U—牛赴列表
(2)
ASL
1632
8
11
-)
8
第十章
2.构造二叉排序树的过程如下图所示。
(f)
构造的二叉排序树如下图所示:
3.如下图所示:
(a)(b)(a)
M(f) 4.解: 折半查找的过程描述如下: 1 low=1;high=length; 2当low>high时,返回查找失败信息 3low a.若kx b.若kx>tbl.elem[mid].key,low=mid+1;转② c.若kx=tbl.elem[mid].key,返回数据元素在表中位置//查找成功 f mid=2 查找关键字为14的过程如下: 012345678910111213 7 14
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言程序设计 练习题
![提示](https://static.bdocx.com/images/bang_tan.gif)