数据结构的C语言的经典练习题,有详细的答案和注释讲解
1.6在程序设计中,常用下列三种不同的出错处理方式:
(1)用exi语句终止执行并报告错误
(2)以函数的返回值区别正确返回或错误返回;
(3)设置一个整型变量的函数参数以区别正确返回或某种错误返回
试讨论这三种方法各自的优缺点。
解:(1)exit常用于异常错误处理,它可以强行中淅程序的执行,返囯操作系统。
(2)以函数的返回值判断正确与杏常用于子程序的测试,便于实现程序的局邹控制。
(3)用整型函数进行错误处理的优点是冂以给出错误型,使于迅速确定错误
1.7在程序设计中,可采用下列三种方法实现输出和输入:
(1)通过 scanf和 printf语句;
(2)通过函数的参数显式传递;
(3)通过全局变量隐式传递。
试讨论这三种方法的优缺点。
解:(1)用 scanf和 printf直接进行输入输岀的好处是羏象、直观,但缺点是需要对其进行格式控制,
较为烦琐,如果出现错误,则会引起整个系统的崩溃。
(2)通过函数的参数传递进行输入输出,便于实信息的隐蔽,减少出错的可能。
(3)通过全局变量的隐式传递进行输入输出最为方便,只需修改变量的值即可,但过多的全局变量使程
序的维护较为困难
1.8设n为正整数。试确定下列各程序段中前置以记号@的语句的频度:
while(i=n-1)(
@k+=10*i;
(2)i=1;k=0
k+10*i
y while(i<=n-1)
(3)i=1;k=0;
e(i<=n-1){
i++;
@k+=10*i
(4)k=0;
for(i-1: i
for (j=i: j<=n: j++)
(5)for(i=1;i<=n;i++)
for (j-1: j<=i: j++)i
for(k=1: k<=j: k++)
while(i+j<=n)i
g if(i>j)j++;
e⊥se
(7)x=n;y=0;∥/n是不小于1的常数
while(x>=(y+1)*(y+1)1
(8)x=91;y=100;
while(y>0)[
@if(x》100){x=10;y-;}
解:(1)
(2)n
(3)n-1
n(n+
(4)n+(n-1)+(n-2)+..+1
i(i+1)
(5)1+(1+2)+(1+2+3)+.+(1+2+3+,,,+n)
L+
1(n+1)(2n+1)+-n(+1)=n(n+1)(2n+3)
12
」向下取整
(8)1100
1.9假设n为2的乘幂,并且n>2,试求下列算法的时间复杂度及变量 count的值(以n的函数形式表示)
int Time(int n)t
t=0
while(x
2: count++
retur
unt
解:O(log2n)
2
count=log n-2
11已知有实现同一功能的两个算法,其时问复杂度分别为O2)和O(),假设现实计算机可连续
运算的时间为10′秒(100多天),又每秒可执行基本操作(根据这些操作来估算算法时间复杂度)10次。
试问在此条件下,这两个算法可解问题的规模(即n值的范围)各为多少?哪个算法更适宜?请说明理由
解:2=1012
40
n=10
n=16
则对于同样的循抔次教n,在这个规模卜,第二种算法所花費的代价婓大得多。故在这个趔模卜,第
一种算法更适宜
1.12设有以下三个函数:
f(n)=2ln4+n2+100,g{n)=15n4+500n3,h(n)=50)m35+ nlogn
请判断以下断言正确与否:
(1)f(n)是0(g(n)
(2)h(n)是0(f(n))
(3)g(n)是0(h(n)
(4)hn)是0(n35
(5)h(n)是0( nlogn)
解:(1)对(2)错(3)错(4)对(5)错
1.13试设定若干n值,比较两函数n2和50nlog2n的增长趋势,并确定n在什么范围内,函数n2的值
大于50nlog2n的值。
解:n2的增长趋势快,但在n较小的时候,50nlog2n的值较大
当n>438时,n2>50nlog2n
1,1判断下列各对函数f(n)和g(n),当n→∞时,哪个函数增长更快?
)f()=10m2+m(n+10).g)=2n+n+7
(2)f(an)=(un(n!)+5)2,g(n)=13n25
)rf(n)=n2+Vn4+1,g(n)=(n(n)2+n
(f(n)=2)+(2),g)=n)+
解:(1)g(n快(2)g(n)快(3)f(m)快(4)f(m)快
1.15试用数学归纳法证明
()∑2=m(n+1)n+1)6(n>0)
2∑x=(x1-1/(x-1)(
x≠1,n≥0
r=0
()∑2=2”-
(n≥1
∑(2i-1)
1.16试写一算法,自大至小依次输出顺序读入的三个整数X,Y和Z的值
解
int max 3(int x, int y,
if(x)z) return x
else return z
f(y>z)return y
else return Z
1.17已知k阶斐波那契序列的定义为
f60=0,f1=0,…,f2=0,f
f=fu-+fu2+
kk+1,
试编写求k阶斐波那契序列的第m项值的函数算法,k和m均以值调用的形式在函数参数表中出现
解:k>0为阶数,n为数列的第n项
int Fibonacci ( int k, int n
if(k<1) exit ( OVERFLOW)
if(!p) exit(OVERFLOW)
1nt
for(i=0;i
if(i
else pli]=
(i=k+1;i
p[0
for(j=0:j
p[k]=2*p[k1]x;
irn pki
1.18假设有A,B,C,D,E五个高等院校进行田径对抗赛,各院校的单项成绩均已存入计算机,并构成一
张表,表中每一行的形式为
项目名称性别
校名
成绩
得分
编写算法,处理上述表格,以统计各院校的男、女总分和团体总分,并输出。
解
typedef enuma, B, C, D, E) SchoolName:
typedef enum [ Female, Molc) ScxTypc
typedef struct
chur event「31;//目
SexType sex
SchoolNane school
Int sco
t
typedef struct
int Malesun
//男团总分
int femalesum;//女团总分
int Totalsun://团体总分
Sum SumScore(SchoolName sn, Component a[, int n)
Sum tem
Males
temp. Femalesum-0;
temp. TotalSum=0
Int
f(ali] school==sn)i
if (ali]. sex==Male) temp. MaleSum+=ali. score
I[i]. sex==Female) temp FemaleSumt=alil. score
temp.TotalSumtemp MaleSumttemp. FemaleSum
return temp:
1.9试编写算法,计算i*的值并存入数组a[0. arrsize1]的第i-1个分量中(i=1,2,…,n)。假设计
算机中允许的整数最大值为 maxint,则当 narrsiz或对某个k(1≤k≤n),使k2k> max int时,
应按出错处理。注意选择你认为较好的出错处理方法
解:
#inc lude
#define MAXINT 65535
tdefine ArrSize 10
i ( int i)
t main
nt i, k
int aLArrs1zel
cou
Enter k
cin>>k
if(k>ArrSize-D) exit(o)
for(i-0: i
if(i=0)a[i]=1;
else i
if(2*i=*a[i-1]>MAXINT) exit(O)
else a[i]=2**ali-1
for (i=0:i<=k: i++)
if(ali]>MAXINT) exit(o)
else cout
return o
120试编写算法求一元多项式的值P(x)=∑ax的值Pn(x),并确定算法中每一语句的执行次数
和整个算法的时间复杂度注意选择你认为较好的输入和输出方法,本题的输入为a:(=0,1,…,n),x
和n,输出为P(xn)
解
#includeiostream. h>
tincludexstdlib, h>
Defined 1o
double pol ynomail(int all, int i, double x, int n
nt main o
double
int n, i
int aInI
cout("输入变量的值x:"
cout《"输入多项式的阶次n:";
if(n N-1) exit (0
cout<
for(i=0; i
cout<
return
double polynomail(int a[l, int i, double x, int n
if(i>0) return a[n-i]+polynomail(a, i-1,x,n)*x
本算法的时间复杂度为on)。
第2章线性表
2.1描述以下三个概念的区别:头指针,头结点,首元结点(第一个元素结点〕
解:头指针是指向链表中第一个结点的指针。首元结点是指链表中存储第一个数据元素的结点。头结
点是在首元结点之前附设的一个结点,该结点不存储数据元素,其指针域指向首元结点,其作用主要是为
了方使对链表的操作。它可以对空表、非空表以及首元结点的操作进行统一处理。
2.2填空题。
解:(1)在顺序表中插入或删除一个元素,需要平均移动表中一半元素,具体移动的元索个数与元素
在表中的位置有关。
(2)顺序表中逻辑上相邻的元素的物理位置必定紧邻。单链表中逻辑上相邻的元素的物理位置不一定
紧邻。
(3)在单链表中,除了首元结点外,任一结点的存储位置由某前练点的链域的值指示。
(4)在单链表中设置头结点的作用是入和酈除苣元结点不逝行殊处理。
2.3在什么情况下用顺序表比链表好?
解:当线性表的数据元紊在物理位臀上是连续存偕的时候,用顺序表比用表好,其特点是可以进行
随机存取。
2.4对以下单链表分别执行下列各程序段,并画出结果示意图。
1-26_738
解:
(1)L-2573
P
R
2)一?381
R
(3)L
t2L5758
R
(4)L
25778}→
()L-25{735
R
(6)1-210{14_6416
R
(7)L
10
14
+6161→
2.5画出执行下列各行语句后各指针及链表的示意图
L=(LinkListmalloc(sizeof(LNode)): P=L:
for(i=1;i<=4;i+)
P->next=(LinkList)malloc(sizeof(lnode)
P=->next
P->data=i=k2
P->next-NULL
for (i=4; i>=1; i-) Ins LinkList(L, i+1, i=2)
for(i=l: 1<=3; 1++) Del LinkList( l, i)
解:
L:3_57
P
L一123458-78k
L[424678区
26已知L是无表头结点的单链表,且P结点既不是首元结点,也不是尾元结点,试从下列提供的答案中
选择合适的语句序列。
a.在P结点后插入S结点的语句序列是