严蔚敏数据结构课后习题与答案解析.docx

上传人:b****7 文档编号:26142817 上传时间:2023-06-17 格式:DOCX 页数:108 大小:68.95KB
下载 相关 举报
严蔚敏数据结构课后习题与答案解析.docx_第1页
第1页 / 共108页
严蔚敏数据结构课后习题与答案解析.docx_第2页
第2页 / 共108页
严蔚敏数据结构课后习题与答案解析.docx_第3页
第3页 / 共108页
严蔚敏数据结构课后习题与答案解析.docx_第4页
第4页 / 共108页
严蔚敏数据结构课后习题与答案解析.docx_第5页
第5页 / 共108页
点击查看更多>>
下载资源
资源描述

严蔚敏数据结构课后习题与答案解析.docx

《严蔚敏数据结构课后习题与答案解析.docx》由会员分享,可在线阅读,更多相关《严蔚敏数据结构课后习题与答案解析.docx(108页珍藏版)》请在冰豆网上搜索。

严蔚敏数据结构课后习题与答案解析.docx

严蔚敏数据结构课后习题与答案解析

 

第一章绪论

 

一、选择题

 

1.组成数据的基本单位是()

(A)数据项(B)数据类型(C)数据元素(D)数据变量

 

2.数据结构是研究数据的()以及它们之间的相互关系。

(A)理想结构,物理结构(B)理想结构,抽象结构

(C)物理结构,逻辑结构(D)抽象结构,逻辑结构

3.在数据结构中,从逻辑上可以把数据结构分成()

(A)动态结构和静态结构(B)紧凑结构和非紧凑结构

(C)线性结构和非线性结构(D)内部结构和外部结构

4.数据结构是一门研究非数值计算的程序设计问题中计算机的(①)以及它们之间的(②)和运算等的学科。

 

①(A)数据元素(B)计算方法(C)逻辑存储(D)数据映像

②(A)结构(B)关系(C)运算(D)算法

 

5.算法分析的目的是()。

(A)找出数据结构的合理性(B)研究算法中的输入和输出的关系

(C)分析算法的效率以求改进(D)分析算法的易懂性和文档性

6.计算机算法指的是(①),它必须具备输入、输出和(②)等5个特性。

①(A)计算方法(B)排序方法(C)解决问题的有限运算序列(D)调度方法

②(A)可执行性、可移植性和可扩充性(B)可行性、确定性和有穷性

(C)确定性、有穷性和稳定性(D)易读性、稳定性和安全性

 

二、判断题

1.数据的机内表示称为数据的存储结构。

()

 

2.算法就是程序。

()

3.数据元素是数据的最小单位。

()

4.算法的五个特性为:

有穷性、输入、输出、完成性和确定性。

()

5.算法的时间复杂度取决于问题的规模和待处理数据的初态。

()

 

三、填空题

1.数据逻辑结构包括________、________、_________和_________四种类型,其中树形结构

和图形结构合称为_____。

 

2.在线性结构中,第一个结点____前驱结点,其余每个结点有且只有______个前驱结点;最后

一个结点______后续结点,其余每个结点有且只有_______个后续结点。

3.在树形结构中,树根结点没有_______结点,其余每个结点有且只有_______个前驱结点;叶子结点没有________结点,其余每个结点的后续结点可以_________。

4.在图形结构中,每个结点的前驱结点数和后续结点数可以_________。

5.线性结构中元素之间存在________关系,树形结构中元素之间存在______关系,图形结构中元素之间存在_______关系。

6.算法的五个重要特性是_______、_______、______、_______、_______。

7.数据结构的三要素是指______、_______和________。

8.链式存储结构与顺序存储结构相比较,主要优点是________________________________。

9.设有一批数据元素,为了最快的存储某元素,数据结构宜用_________结构,为了方便插入一

个元素,数据结构宜用____________结构。

 

四、算法分析题

 

1.求下列算法段的语句频度及时间复杂度参考答案:

 

一、选择题

 

1.C2.C3.C4.A、B5.C6.C、B

 

二、判断题:

 

1、√2、×3、×4、×5、√

 

三、填空题

 

1、线性、树形、图形、集合?

;非线性(网状)2、没有;1;没有;13、前驱;1;后继;任意多个4、任意多个5、一对一;一对多;多对多6、有穷性;确定性;可行性;输入;输出7、数据元素;逻辑结构;存储结构8、插入、删除、合并等操作较方便9、顺序存储;链式存储

 

四、算法分析题

 

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

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

x=x+1;

分析:

该算法为一个二重循环,执行次数为内、外循环次数相乘,但内循环次数不固定,与

外循环有关,因些,时间频度T(n)=1+2+3+⋯+n=n*(n+1)/2

有1/4≤T(n)/n2≤1,故它的时间复杂度为O(n2),即T(n)

下列算法段的时间频度及时间复杂度

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

 

 

n2

 

数量级相同。

 

2、分析

 

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

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

x=i+j-k;

分析算法规律可知时间频度由于有1/6≤T(n)/n3

 

T(n)=1+(1+2)+(1+2+3)+...+(1+2+3+≤1,故时间复杂度为O(n3)

 

 

+n)

 

 

第二章线性表

 

一、选择题

1.一个线性表第一个元素的存储地址是100,每个元素的长度为2,则第5个元素的地址是()

(A)110(B)108(C)100(D)120

2.向一个有127个元素的顺序表中插入一个新元素并保持原来顺序不变,平均要移动()个元素。

 

(A)64(B)63(C)63.5(D)7

3.线性表采用链式存储结构时,其地址()。

(A)必须是连续的

 

(B)

 

部分地址必须是连续的

 

(C)一定是不连续的

 

(D)

 

连续与否均可以

 

4.在一个单链表中,若p所指结点不是最后结点,在p之后插入s所指结点,则执行()

(A)s->next=p;p->next=s;

 

(B)

 

s->next=p->next;p->next=s;

 

(C)s->next=p->next;p=s;

 

(D)p->next=s;s->next=p;

 

5.在一个单链表中,若删除p所指结点的后续结点,则执行()

(A)p->next=p->next->next;

 

(B)p=p->next;p->next=p->next->next;

 

(C)p->next=p->next;(D)p=p->next->next;

6.下列有关线性表的叙述中,正确的是()

(A)线性表中的元素之间隔是线性关系

(B)线性表中至少有一个元素

(C)线性表中任何一个元素有且仅有一个直接前趋

 

(D)线性表中任何一个元素有且仅有一个直接后继

7.线性表是具有n个()的有限序列(n≠0)

(A)表元素(B)字符(C)数据元素(D)数据项

 

二、判断题

1.线性表的链接存储,表中元素的逻辑顺序与物理顺序一定相同。

()

2.如果没有提供指针类型的语言,就无法构造链式结构。

()

 

3.线性结构的特点是只有一个结点没有前驱,只有一个结点没有后继,其余的结点只有一个

驱和后继。

4.

语句p=p->next

完成了指针赋值并使p指针得到了p指针所指后继结点的数据域值。

5.

要想删除p指针的后继结点,我们应该执行q=p->next

;p->next=q->next

;free(q)

、填空题

1.已知P为单链表中的非首尾结点,在P结点后插入S结点的语句为:

_______________________。

 

2.顺序表中逻辑上相邻的元素物理位置()相邻,单链表中逻辑上相邻的元素物理位置

_________相邻。

3.线性表L=(a1,a2,...,an)采用顺序存储,假定在不同的n+1个位置上插入的概率相同,则插入一个新元素平均需要移动的元素个数是________________________

4.在非空双向循环链表中,在结点q的前面插入结点p的过程如下:

p->prior=q->prior;

q->prior->next=p;

 

p->next=q;

 

______________________;

5.已知L是无表头结点的单链表,是从下列提供的答案中选择合适的语句序列,分别实现:

 

(1)表尾插入s结点的语句序列是_______________________________

(2)表尾插入s结点的语句序列是_______________________________

 

1.p->next=s;

 

2.p=L;

3.L=s;

 

4.p->next=s->next;

 

5.s->next=p->next;

 

6.s->next=L;

7.s->next=null;

 

8.while(p->next!

=Q)?

p=p-next;

 

9.while(p->next!

=null)p=p->next;

 

四、算法设计题

1.试编写一个求已知单链表的数据域的平均值的函数(数据域数据类型为整型)。

2.已知带有头结点的循环链表中头指针为head,试写出删除并释放数据域值为x的所有结点的c函数。

3.某百货公司仓库中有一批电视机,按其价格从低到高的次序构成一个循环链表,每个结点有价格、数量和链指针三个域。

现出库(销售)m台价格为h的电视机,试编写算法修改原链表。

 

4.某百货公司仓库中有一批电视机,按其价格从低到高的次序构成一个循环链表,每个结点有价格、数量和链指针三个域。

现新到m台价格为h的电视机,试编写算法修改原链表。

5.线性表中的元素值按递增有序排列,针对顺序表和循环链表两种不同的存储方式,分别编写C函数删除线性表中值介于a与b(a≤b)之间的元素。

6.设A=(a0,a1,a2,...,an-1),B=(b0,b1,b2,...,bm-1)是两个给定的线性表,它们的结点个数

分别是n和m,且结点值均是整数。

若n=m,且ai=bi(0≤i

若n

若存在一个j,jB。

试编写一个比较A和B的C函数,该函数返回-1或0或1,分别表示AB。

7.试编写算法,删除双向循环链表中第k个结点。

8.线性表由前后两部分性质不同的元素组成(a0,a1,...,an-1,b0,b1,...,bm-1),m和n为两

部分元素的个数,若线性表分别采用数组和链表两种方式存储,编写算法将两部分元素换位成

(b0,b1,...,bm-1,a0,a1,...,an-1),分析两种存储方式下算法的时间和空间复杂度。

9.用循环链表作线性表(a0,a1,...,an-1)和(b0,b1,...,bm-1)的存储结构,头指针分别为

ah和bh,设计C函数,把两个线性表合并成形如(a0,b0,a1,b1,⋯)的线性表,要求不开辟

新的动态空间,利用原来循环链表的结点完成合并操作,结构仍为循环链表,头指针为head,并

分析算法的时间复杂度。

 

10.试写出将一个线性表分解为两个带有头结点的循环链表,并将两个循环链表的长度放在各自的头结点的数据域中的C函数。

其中,线性表中序号为偶数的元素分解到第一个循环链表中,

序号为奇数的元素分解到第二个循环链表中。

11.试写出把线性链表改为循环链表的C函数。

 

12.己知非空线性链表中x结点的直接前驱结点为y,试写出删除x结点的C函数。

参考答案:

 

一、选择题

 

1.B2.C3.D4.B5.A6.A7、C

 

二、判断题:

 

参考答案:

1、×2、√3、×4、×5、√

 

三、填空题

 

1、s->next=p->next;p->next=s;2

、一定;不一定

3、n/24

、q->prior=p;5

(1)6)3)

(2)2)9)1)7)

 

四、算法设计题

 

1、

#include"stdio.h"

#include"malloc.h"

 

typedefstructnode

 

{intdata;

structnode*link;

 

}NODE;

intaver(NODE*head)

 

{inti=0,sum=0,ave;NODE*p;

p=head;

 

while(p!

=NULL)

{p=p->link;++i;

 

sum=sum+p->data;}

 

ave=sum/i;

return(ave);}

 

2、

#include"stdio.h"

 

#include"malloc.h"

typedefstructnode

 

{

intdata;/*

 

假设数据域为整型

 

*/

 

structnode*link;

}NODE;

 

voiddel_link(NODE*head,intx)/*

 

删除数据域为

 

x的结点*/

 

{

 

NODE*p,*q,*s;

 

p=head;

q=head->link;

 

while(q!

=head)

{if(q->data==x)

 

{p->link=q->link;

 

s=q;

 

q=q->link;

 

free(s);}

else

 

{

p=q;

 

q=q->link;

}

 

}

}

 

3、

voiddel(NODE*head,floatprice,intnum)

{

 

NODE*p,*q,*s;

 

p=head;q=head->next;

while(q->price

=head)

 

{

p=q;

 

q=q->next;

}

 

if(q->price==price)

q->num=q->num-num;

 

else

 

printf("无此产品");

if(q->num==0)

 

{

p->next=q->next;

 

free(q);

}

 

}

 

4、

#include"stdio.h"

#include"malloc.h"

 

typedefstructnode

{

 

floatprice;

intnum;

 

structnode*next;

}NODE;

 

voidins(NODE*head,floatprice,intnum)

 

{

 

NODE*p,*q,*s;

p=head;q=head->next;

 

while(q->price

=head)

 

{

p=q;

 

q=q->next;

}

 

if(q->price==price)

q->num=q->num+num;

 

else

{

 

s=(NODE*)malloc(sizeof(NODE));

 

s->price=price;

 

s->num=num;

 

s->next=p->next;

p->next=s;

 

}

}

 

5、顺序表:

算法思想:

从0开始扫描线性表,用k记录下元素值在a与b之间的元素个数,对于不满足

 

该条件的元素,前移k个位置,最后修改线性表的长度。

voiddel(elemtypelist[],int*n,elemtypea,elemtypeb

 

 

{

 

inti=0

 

,k=0;

 

while(i

{

 

if(list[i]>=a&&list[i]<=b)k++;

else

 

list[i-k]=list[i];

 

i++;

 

}

*n=*n-k;/*修改线性表的长度*/

 

}

 

循环链表:

voiddel(NODE*head,elemtypea,elemtypeb)

 

{

NODE*p,*q;

 

p=head;q=p->link;/*

 

假设循环链表带有头结点

 

*/

 

while(q!

=head&&q->data

 

{

p=q;

 

q=q->link;

 

}

 

while(q!

=head&&q->data

 

{

r=q;

 

q=q->link;

free(r);

 

}

if(p!

=q)

 

p->link=q;

 

}

 

6、

#defineMAXSIZE100

 

intlistA[MAXSIZE],listB[MAXSIZE];

 

intn,m;

 

intcompare(inta[],intb[])

{

 

inti=0;

 

while(a[i]==b[i]&&i

 

i++;

if(n==m&&i==n)return(0);

 

if(n

 

if(n>m&&i==m)return

(1);

if(i

 

if(a[i]

elseif(a[i]>b[i])return

(1);

 

}

 

7、

voiddel(DUNODE

 

**head,inti)

 

{

 

DUNODE*p;

 

if(i==0)

 

{

*head=*head->next;

 

*head->prior=NULL;

return(0);

 

}

Else

 

{for(j=0;j

=NULL;j++)

 

p=p->next;

if(p==NULL||j>i)return

(1);

 

p->prior->next=p->next;

p->next->prior=p->proir;

 

free(p);

return(0);

 

}

 

8.

 

顺序存储:

 

voidconvert(elemtypelist[],intl,inth)/*

 

将数组中第

 

l

 

个到第

 

h个元素逆置*/

 

{

inti;

 

elemtypetemp;

 

for(i=h;i<=(l+h)/2;i++)

{

 

temp=list[i];

list[i]=list[l+h-i];

 

list[l+h-i]=temp;

}

 

}

voidexchange(elemtypelist[],intn,intm);

 

{

 

convert(list,0,n+m-1);

 

convert(list,0,m-1);

 

convert(list,m,n+m-1);

}

 

该算法的时间复杂度为

 

O(n+m),

 

空间复杂度为

 

O

(1)

 

链接存储:

(不带头结点的单链表)

typedefstructnode

{

 

elemtypedata;

 

structnode*link;

}NODE;

 

voidconvert(NODE**head,intn,intm)

{

 

NODE*p,*q,*r;

inti;

 

p=*head;

q=*head;

 

for(i=0;i

 

q=q->link;/*q指向an-1结点*/

r=q->link;

q->link=NULL;

 

while(r->link!

=NULL)

 

r=r->link;/*r指向最后一个bm-1结点*/

*head=q;

 

r->link=p;

}

 

该算法的时间复杂度为O(n+m),但比顺序存储节省时间(不需要移动元素,只需改变指针),空间复杂度为O

(1)

9.

typedefstructnode

 

{

 

elemtypedata;

 

structnode*link;

 

}NODE;

NODE*union(NODE

 

*ah,NODE*bh)

 

{

NODE*a,*b,*head,*r,*q;

 

head=ah;

a=ah;

 

b=bh;

 

while(a->link!

=ah&&b->link!

=bh)

{

 

r=a->link;

q=b->link;

 

a->link=b;

b->link=r;

 

a=r;

b=q;

 

}

 

if(a->link==ah)/*a的结点个数小于等于b的结点个数*/

 

{

a->link=b;

 

while(b->link!

=bh)

 

b=b->link;

b->link=head;

 

}

if(b->link==bh)/*

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

当前位置:首页 > 农林牧渔 > 林学

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

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