数据结构题集C语言版答案严蔚敏编著.docx

上传人:b****9 文档编号:23431940 上传时间:2023-05-17 格式:DOCX 页数:240 大小:62.61KB
下载 相关 举报
数据结构题集C语言版答案严蔚敏编著.docx_第1页
第1页 / 共240页
数据结构题集C语言版答案严蔚敏编著.docx_第2页
第2页 / 共240页
数据结构题集C语言版答案严蔚敏编著.docx_第3页
第3页 / 共240页
数据结构题集C语言版答案严蔚敏编著.docx_第4页
第4页 / 共240页
数据结构题集C语言版答案严蔚敏编著.docx_第5页
第5页 / 共240页
点击查看更多>>
下载资源
资源描述

数据结构题集C语言版答案严蔚敏编著.docx

《数据结构题集C语言版答案严蔚敏编著.docx》由会员分享,可在线阅读,更多相关《数据结构题集C语言版答案严蔚敏编著.docx(240页珍藏版)》请在冰豆网上搜索。

数据结构题集C语言版答案严蔚敏编著.docx

数据结构题集C语言版答案严蔚敏编著

只要有信心,努力,一切可以改变。

第1章绪论

1.1简述下列术语:

数据

数据元素、数据对象、数据结构、存储结构、数据类型和抽象数据类型

解:

数据是对客观事物的符号表示

在计算机科学中是指所有能输入到计算机中并被计算机程序处理的符号的总称

数据元素是数据的基本单位

在计算机程序中通常作为一个整体进行考虑和处理

数据对象是性质相同的数据元素的集合

是数据的一个子集

数据结构是相互之间存在一种或多种特定关系的数据元素的集合

存储结构是数据结构在计算机中的表示

数据类型是一个值的集合和定义在这个值集上的一组操作的总称

抽象数据类型是指一个数学模型以及定义在该模型上的一组操作

是对一般数据类型的扩展

1.2试描述数据结构和抽象数据类型的概念与程序设计语言中数据类型概念的区别

  解:

抽象数据类型包含一般数据类型的概念

但含义比一般数据类型更广、更抽象

一般数据类型由具体语言系统内部定义

直接提供给编程者定义用户数据

因此称它们为预定义数据类型

抽象数据类型通常由编程者定义

包括定义它所使用的数据和在这些数据上所进行的操作

在定义抽象数据类型中的数据部分和操作部分时

要求只定义到数据的逻辑结构和操作说明

不考虑数据的存储结构和操作的具体实现

这样抽象层次更高

更能为其他用户提供良好的使用接口

1.3设有数据结构(D

R)

其中

  

 

试按图论中图的画法惯例画出其逻辑结构图

  解:

  

1.4试仿照三元组的抽象数据类型分别写出抽象数据类型复数和有理数的定义(有理数是其分子、分母均为自然数且分母不为零的分数)

解:

ADTComplex{

数据对象:

D={r

i|r

i为实数}

数据关系:

R={

i>}

基本操作:

InitComplex(&C

re

im)

操作结果:

构造一个复数C

其实部和虚部分别为re和im

DestroyCmoplex(&C)

操作结果:

销毁复数C

Get(C

k

&e)

操作结果:

用e返回复数C的第k元的值

Put(&C

k

e)

操作结果:

改变复数C的第k元的值为e

IsAscending(C)

操作结果:

如果复数C的两个元素按升序排列

则返回1

否则返回0

IsDescending(C)

操作结果:

如果复数C的两个元素按降序排列

则返回1

否则返回0

Max(C

&e)

操作结果:

用e返回复数C的两个元素中值较大的一个

Min(C

&e)

操作结果:

用e返回复数C的两个元素中值较小的一个

}ADTComplex

ADTRationalNumber{

数据对象:

D={s

m|s

m为自然数

且m不为0}

数据关系:

R={

m>}

基本操作:

InitRationalNumber(&R

s

m)

操作结果:

构造一个有理数R

其分子和分母分别为s和m

DestroyRationalNumber(&R)

操作结果:

销毁有理数R

Get(R

k

&e)

操作结果:

用e返回有理数R的第k元的值

Put(&R

k

e)

操作结果:

改变有理数R的第k元的值为e

IsAscending(R)

操作结果:

若有理数R的两个元素按升序排列

则返回1

否则返回0

IsDescending(R)

操作结果:

若有理数R的两个元素按降序排列

则返回1

否则返回0

Max(R

&e)

操作结果:

用e返回有理数R的两个元素中值较大的一个

Min(R

&e)

操作结果:

用e返回有理数R的两个元素中值较小的一个

}ADTRationalNumber

1.5试画出与下列程序段等价的框图

  

(1)product=1;i=1;

  while(i<=n){

  product*=i;

  i++;

  }

  

(2)i=0;

  do{

  i++;

  }while((i!

=n)&&(a[i]!

=x));

  (3)switch{

  casex

z=y-x;break;

  casex=y:

z=abs(x*y);break;

  default:

z=(x-y)/abs(x)*abs(y);

  }

1.6在程序设计中

常用下列三种不同的出错处理方式:

  

(1)用exit语句终止执行并报告错误;

  

(2)以函数的返回值区别正确返回或错误返回;

  (3)设置一个整型变量的函数参数以区别正确返回或某种错误返回

试讨论这三种方法各自的优缺点

  解:

(1)exit常用于异常错误处理

它可以强行中断程序的执行

返回操作系统

(2)以函数的返回值判断正确与否常用于子程序的测试

便于实现程序的局部控制

(3)用整型函数进行错误处理的优点是可以给出错误类型

便于迅速确定错误

1.7在程序设计中

可采用下列三种方法实现输出和输入:

  

(1)通过scanf和printf语句;

  

(2)通过函数的参数显式传递;

  (3)通过全局变量隐式传递

试讨论这三种方法的优缺点

  解:

(1)用scanf和printf直接进行输入输出的好处是形象、直观

但缺点是需要对其进行格式控制

较为烦琐

如果出现错误

则会引起整个系统的崩溃

(2)通过函数的参数传递进行输入输出

便于实现信息的隐蔽

减少出错的可能

(3)通过全局变量的隐式传递进行输入输出最为方便

只需修改变量的值即可

但过多的全局变量使程序的维护较为困难

1.8设n为正整数

试确定下列各程序段中前置以记号@的语句的频度:

  

(1)i=1;k=0;

  while(i<=n-1){

  @k+=10*i;

  i++;

  }

  

(2)i=1;k=0;

  do{

  @k+=10*i;

  i++;

  }while(i<=n-1);

  (3)i=1;k=0;

  while(i<=n-1){

i++;

  @k+=10*i;

  }

  (4)k=0;

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

  for(j=i;j<=n;j++)

  @k++;

  }

  (5)for(i=1;i<=n;i++){

  for(j=1;j<=i;j++){

  for(k=1;k<=j;k++)

  @x+=delta;

  }

  (6)i=1;j=0;

  while(i+j<=n){

@if(i>j)j++;

  elsei++;

  }

  (7)x=n;y=0;//n是不小于1的常数

  while(x>=(y+1)*(y+1)){

  @y++;

  }

  (8)x=91;y=100;

  while(y>0){

  @if(x>100){x-=10;y--;}

  elsex++;

  }

  解:

(1)n-1

(2)n-1

(3)n-1

(4)n+(n-1)+(n-2)+...+1=

(5)1+(1+2)+(1+2+3)+...+(1+2+3+...+n)=

=

=

(6)n

(7)向下取整

(8)1100

1.9假设n为2的乘幂

并且n>2

试求下列算法的时间复杂度及变量count的值(以n的函数形式表示)

  intTime(intn){

  count=0;x=2;

  while(x

  x*=2;count++;

  }

  returncount;

}

  解:

  count=

1.11已知有实现同一功能的两个算法

其时间复杂度分别为和

假设现实计算机可连续运算的时间为秒(100多天)

又每秒可执行基本操作(根据这些操作来估算算法时间复杂度)次

试问在此条件下

这两个算法可解问题的规模(即n值的范围)各为多少?

哪个算法更适宜?

请说明理由

  解:

n=40

n=16

则对于同样的循环次数n

在这个规模下

第二种算法所花费的代价要大得多

故在这个规模下

第一种算法更适宜

1.12设有以下三个函数:

 

请判断以下断言正确与否:

  

(1)f(n)是O(g(n))

  

(2)h(n)是O(f(n))

  (3)g(n)是O(h(n))

  (4)h(n)是O(n3.5)

  (5)h(n)是O(nlogn)

  解:

(1)对

(2)错(3)错(4)对(5)错

1.13试设定若干n值

比较两函数和的增长趋势

并确定n在什么范围内

函数的值大于的值

  解:

的增长趋势快

但在n较小的时候

的值较大

当n>438时

1.14判断下列各对函数和

当时

哪个函数增长更快?

  

(1)

  

(2)

  (3)

  (4)

  解:

(1)g(n)快

(2)g(n)快(3)f(n)快(4)f(n)快

1.15试用数学归纳法证明:

  

(1)

  

(2)

  (3)

  (4)

1.16试写一算法

自大至小依次输出顺序读入的三个整数X

Y和Z的值

  解:

intmax3(intx

inty

intz)

{

if(x>y)

if(x>z)returnx;

elsereturnz;

else

if(y>z)returny;

elsereturnz;

}

1.17已知k阶斐波那契序列的定义为

...

试编写求k阶斐波那契序列的第m项值的函数算法

k和m均以值调用的形式在函数参数表中出现

  解:

k>0为阶数

n为数列的第n项

intFibonacci(intk

intn)

{

if(k<1)exit(OVERFLOW);

  int*p

x;

p=newint[k+1];

if(!

p)exit(OVERFLOW);

inti

j;

for(i=0;i

if(i

elsep[i]=1;

}

for(i=k+1;i

x=p[0];

for(j=0;j

p[k]=2*p[k-1]-x;

}

returnp[k];

}

1.18假设有A

B

C

D

E五个高等院校进行田径对抗赛

各院校的单项成绩均已存入计算机

并构成一张表

表中每一行的形式为

项目名称

性别

校名

成绩

得分

编写算法

处理上述表格

以统计各院校的男、女总分和团体总分

并输出

  解:

typedefenum{A

B

C

D

E}SchoolName;

typedefenum{Female

Male}SexType;

typedefstruct{

charevent[3];//项目

SexTypesex;

SchoolNameschool;

intscore;

}Component;

typedefstruct{

intMaleSum;//男团总分

intFemaleSum;//女团总分

intTotalSum;//团体总分

}Sum;

SumSumScore(SchoolNamesn

Componenta[]

intn)

{

Sumtemp;

temp.MaleSum=0;

temp.FemaleSum=0;

temp.TotalSum=0;

inti;

for(i=0;i

if(a[i].school==sn){

if(a[i].sex==Male)temp.MaleSum+=a[i].score;

if(a[i].sex==Female)temp.FemaleSum+=a[i].score;

}

}

temp.TotalSum=temp.MaleSum+temp.FemaleSum;

returntemp;

}

1.19试编写算法

计算的值并存入数组a[0..arrsize-1]的第i-1个分量中(i=1

2

...

n)

假设计算机中允许的整数最大值为maxint

则当n>arrsize或对某个

使时

应按出错处理

注意选择你认为较好的出错处理方法

  解:

#include

#include

#defineMAXINT65535

#defineArrSize100

intfun(inti);

intmain()

{

inti

k;

inta[ArrSize];

cout<<"Enterk:

";

cin>>k;

if(k>ArrSize-1)exit(0);

for(i=0;i<=k;i++){

if(i==0)a[i]=1;

else{

if(2*i*a[i-1]>MAXINT)exit(0);

elsea[i]=2*i*a[i-1];

}

}

for(i=0;i<=k;i++){

if(a[i]>MAXINT)exit(0);

elsecout<

}

return0;

}

1.20试编写算法求一元多项式的值的值

并确定算法中每一语句的执行次数和整个算法的时间复杂度

注意选择你认为较好的输入和输出方法

本题的输入为

输出为

  解:

#include

#include

#defineN10

doublepolynomail(inta[]

inti

doublex

intn);

intmain()

{

doublex;

intn

i;

inta[N];

cout<<"输入变量的值x:

";

cin>>x;

cout<<"输入多项式的阶次n:

";

cin>>n;

if(n>N-1)exit(0);

cout<<"输入多项式的系数a[0]--a[n]:

";

for(i=0;i<=n;i++)cin>>a[i];

cout<<"Thepolynomailvalueis"<

n

x

n)<

return0;

}

doublepolynomail(inta[]

inti

doublex

intn)

{

if(i>0)returna[n-i]+polynomail(a

i-1

x

n)*x;

elsereturna[n];

}

  本算法的时间复杂度为o(n)

第2章线性表

2.1描述以下三个概念的区别:

头指针

头结点

首元结点(第一个元素结点)

  解:

头指针是指向链表中第一个结点的指针

首元结点是指链表中存储第一个数据元素的结点

头结点是在首元结点之前附设的一个结点

该结点不存储数据元素

其指针域指向首元结点

其作用主要是为了方便对链表的操作

它可以对空表、非空表以及首元结点的操作进行统一处理

2.2填空题

  解:

(1)在顺序表中插入或删除一个元素

需要平均移动表中一半元素

具体移动的元素个数与元素在表中的位置有关

(2)顺序表中逻辑上相邻的元素的物理位置必定紧邻

单链表中逻辑上相邻的元素的物理位置不一定紧邻

(3)在单链表中

除了首元结点外

任一结点的存储位置由其前驱结点的链域的值指示

(4)在单链表中设置头结点的作用是插入和删除首元结点时不用进行特殊处理

2.3在什么情况下用顺序表比链表好?

  解:

当线性表的数据元素在物理位置上是连续存储的时候

用顺序表比用链表好

其特点是可以进行随机存取

2.4对以下单链表分别执行下列各程序段

并画出结果示意图

 

  解:

  

  

  

  

  

  

2.5画出执行下列各行语句后各指针及链表的示意图

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--)Ins_LinkList(L

i+1

i*2);

for(i=1;i<=3;i++)Del_LinkList(L

i);

  解:

 

2.6已知L是无表头结点的单链表

且P结点既不是首元结点

也不是尾元结点

试从下列提供的答案中选择合适的语句序列

  a.在P结点后插入S结点的语句序列是___41_______________

  b.在P结点前插入S结点的语句序列是___711841_______________

  c.在表首插入S结点的语句序列是___512_______________

  d.在表尾插入S结点的语句序列是_______916___________

  

(1)P->next=S;

  

(2)P->next=P->next->next;

  (3)P->next=S->next;

  (4)S->next=P->next;

  (5)S->next=L;

  (6)S->next=NULL;

  (7)Q=P;

  (8)while(P->next!

=Q)P=P->next;

  (9)while(P->next!

=NULL)P=P->next;

  (10)P=Q;

  (11)P=L;

  (12)L=S;

  (13)L=P;

  解:

a.(4)

(1)

b.(7)(11)(8)(4)

(1)

c.(5)(12)

d.(9)

(1)(6)

2.7已知L是带表头结点的非空单链表

且P结点既不是首元结点

也不是尾元结点

试从下列提供的答案中选择合适的语句序列

a.删除P结点的直接后继结点的语句序列是____________________

b.删除P结点的直接前驱结点的语句序列是____________________

c.删除P结点的语句序列是____________________

d.删除首元结点的语句序列是____________________

  e.删除尾元结点的语句序列是____________________

  

(1)P=P->next;

  

(2)P->next=P;

  (3)P->next=P->next->next;

  (4)P=P->next->next;

  (5)while(P!

=NULL)P=P->next;

  (6)while(Q->next!

=NULL){P=Q;Q=Q->next;}

  (7)while(P->next!

=Q)P=P->next;

  (8)while(P->next->next!

=Q)P=P->next;

  (9)while(P->next->next!

=NULL)P=P->next;

  (10)Q=P;

  (11)Q=P->next;

  (12)P=L;

  (13)L=L->next;

  (14)free(Q);

  解:

a.(11)(3)(14)

b.(10)(12)(8)(3)(14)

c.(10)(12)(7)(3)(14)

d.(12)(11)(3)(14)

e.(9)(11)(3)(14)

2.8已知P结点是某双向链表的中间结点

试从下列提供的答案中选择合适的语句序列

  a.在P结点后插入S结点的语句序列是_______________________

  b.在P结点前插入S结点的语句序列是_______________________

  c.删除P结点的直接后继结点的语句序列是_______________________

  d.删除P结点的直接前驱结点的语句序列是_______________________

  e.删除P结点的语句序列是_______________________

  

(1)P->next=P->next->next;

  

(2)P->priou=P->priou->priou;

  (3)P->next=S;

  (4)P->priou=S;

  (5)S->next=P;

  (6)S->priou=P;

  (7)S->next=P->next;

  (8)S->priou=P->priou;

  (9)P->priou->next=P->next;

  (10)P->priou->next=P;

  (11)P->next->priou=P;

  (12)P->next->priou=S;

  (13)P->priou->next=S;

  (14)P->next->priou=P->priou;

  (15)Q=P->next;

  (16)Q=P->priou;

  (17)free(P);

  (18)free(Q);

  解:

a.(7)(3)(6)(12)

b.(8)(4)(5)(13)

c.(15)

(1)(11)(18)

d.(16)

(2)(10)(18)

e.(14)(9)(17)

2.9简述以下算法的功能

  

(1)StatusA(LinkedListL){//L是无表头结点的单链表

  if(L&&L->next){

  Q=L;L=L->next;P=L;

  while(P->next)P=P->next;

  P->next=Q;Q->next=NULL;

  }

  returnOK;

  }

  

(2)voidBB(LNode*s

LNode*q){

  p=s;

  while(p->next!

=q)p=p->next;

  p->next

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1