中国铁道出版社数据结构第二版单元2练习参考答案.docx

上传人:b****7 文档编号:10476067 上传时间:2023-02-13 格式:DOCX 页数:15 大小:45.81KB
下载 相关 举报
中国铁道出版社数据结构第二版单元2练习参考答案.docx_第1页
第1页 / 共15页
中国铁道出版社数据结构第二版单元2练习参考答案.docx_第2页
第2页 / 共15页
中国铁道出版社数据结构第二版单元2练习参考答案.docx_第3页
第3页 / 共15页
中国铁道出版社数据结构第二版单元2练习参考答案.docx_第4页
第4页 / 共15页
中国铁道出版社数据结构第二版单元2练习参考答案.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

中国铁道出版社数据结构第二版单元2练习参考答案.docx

《中国铁道出版社数据结构第二版单元2练习参考答案.docx》由会员分享,可在线阅读,更多相关《中国铁道出版社数据结构第二版单元2练习参考答案.docx(15页珍藏版)》请在冰豆网上搜索。

中国铁道出版社数据结构第二版单元2练习参考答案.docx

中国铁道出版社数据结构第二版单元2练习参考答案

单元练习2

一.判断题(下列各题,正确的请在前面的括号内打√;错误的打╳)

(×)

(1)线性表的链式存储结构优于顺序存储。

(×)

(2)链表的每个结点都恰好包含一个指针域。

(√)(3)在线性表的链式存储结构中,逻辑上相邻的两个元素在物理位置上并不一定紧邻。

(×)(4)顺序存储方式的优点是存储密度大,插入、删除效率高。

(×)(5)线性链表的删除算法简单,因为当删除链中某个结点后,计算机会自动地将后续的各个单元向前移动。

(×)(6)顺序表的每个结点只能是一个简单类型,而链表的每个结点可以是一个复杂类型。

(√)(7)线性表链式存储的特点是可以用一组任意的存储单元存储表中的数据元素。

(√)(8)线性表采用顺序存储,必须占用一片连续的存储单元。

(×)(9)顺序表结构适宜于进行顺序存取,而链表适宜于进行随机存取。

(ㄨ)(10)插入和删除操作是数据结构中最基本的两种操作,所以这两种操作在数组中也经常使用。

二.填空题

0.顺序表中逻辑上相邻的元素在物理位置上必须相连。

1.线性表中结点的集合是有限的,结点间的关系是一对一关系。

2.顺序表相对于链表的优点是:

节省存储和随机存取。

3.链表相对于顺序表的优点是:

插入、删除方便。

(5)采用顺序存储结构的线性表叫顺序表。

(6)顺序表中访问任意一个结点的时间复杂度均为O

(1)。

(7)链表相对于顺序表的优点是插入、删除方便;缺点是存储密度小。

(8)在双链表中要删除已知结点*P,其时间复杂度为O

(1)。

(9)在单链表中要在已知结点*P之前插入一个新结点,需找到*P的直接前趋结点的地址,其查找的时间复杂度为O(n)。

(2)单链表中需知道头指针才能遍历整个链表。

(3)性表中第一个结点没有直接前趋,称为开始结点。

(4)在一个长度为n的顺序表中删除第i个元素,要移动n-i个元素。

(5)在一个长度为n的顺序表中,如果要在第i个元素前插入一个元素,要后移n-i+1个元素。

(6)在无头结点的单链表中,第一个结点的地址存放在头指针中,而其它结点的存储地址存放在前趋结点的指针域中。

(7)当线性表的元素总数基本稳定,且很少进行插入和删除操作,但要求以最快速度存取线性表中的元素时,应采用顺序存储结构。

(8)在线性表的链式存储中,元素之间的逻辑关系是通过指针决定的。

(9)在双向链表中,每个结点都有两个指针域,它们一个指向其前趋结点,另一个指向其后继结点。

(10)对一个需要经常进行插入和删除操作的线性表,采用链式存储结构为宜。

(11)双链表中,设p是指向其中待删除的结点,则需要执行的操作为:

p->prior->next=p->next。

(12)在如图所示的链表中,若在指针P所在的结点之后插入数据域值为a和b的两个结点,则可用下列两个语句:

S->next->next=P->next;和P->next=S;来实现该操作。

 

Λ

a

b

S

三.选择题

(1)在具有n个结点的单链表中,实现(A)的操作,其算法的时间复杂度都是O(n)。

A.遍历链表或求链表的第i个结点B.在地址为P的结点之后插入一个结点

C.删除开始结点D.删除地址为P的结点的后继结点

(2)设a、b、c为三个结点,p、10、20分别代表它们的地址,则如下的存储结构称为(B)。

4.循环链表B.单链表C.双向循环链表D.双向链表

(3)单链表的存储密度(C)。

A.大于1B.等于1C.小于1D.不能确定

(4)已知一个顺序存储的线性表,设每个结点占m个存储单元,若第一个结点的地址为B,则第i个结点的地址为(A)。

A.B+(i-1)*mB.B+i*mC.B-i*mD.B+(i+1)*m

(5)在有n个结点的顺序表上做插入、删除结点运算的时间复杂度为(B)。

A.O

(1)B.O(n)C.O(n2)D.O(log2n)

(6)设Llink、Rlink分别为循环双链表结点的左指针和右指针,则指针P所指的元素是双循环链表L的尾元素的条件是(D)。

A.P==LB.P->Llink==LC.P==NULLD.P->Rlink==L

(7)两个指针P和Q,分别指向单链表的两个元素,P所指元素是Q所指元素前驱的条件是(B)。

A.P->next==Q->nextB.P->next==QC.Q->next==PD.P==Q

(8)用链表存储的线性表,其优点是(C)。

A.便于随机存取B.花费的存储空间比顺序表少

C.便于插入和删除D.数据元素的物理顺序与逻辑顺序相同

(9)在单链表中,增加头结点的目的是(C)。

A.使单链表至少有一个结点B.标志表中首结点的位置

C.方便运算的实现D.说明该单链表是线性表的链式存储结构

(10)下面关于线性表的叙述中,错误的是(D)关系。

A.顺序表必须占一片地址连续的存储单元B.顺序表可以随机存取任一元素

C.链表不必占用一片地址连续的存储单元D.链表可以随机存取任一元素

(11)L是线性表,已知LengthList(L)的值是5,经DelList(L,2)运算后,LengthList(L)的值是(C)。

A.2B.3C.4D.5

(12)单链表的示意图如下:

L

A

B

C

D

Λ

Q

指向链表Q结点的前趋的指针是(B)。

A.LB.PC.QD.R

(13)设p为指向单循环链表上某结点的指针,则*p的直接前驱(C)。

A.找不到B.查找时间复杂度为O

(1)

C.查找时间复杂度为O(n)D.查找结点的次数约为n

(14)等概率情况下,在有n个结点的顺序表上做插入结点运算,需平均移动结点的数目为(C)。

A.nB.(n-1)/2C.n/2D.(n+1)/2

(15)在下列链表中不能从当前结点出发访问到其余各结点的是(C)。

A.双向链表B.单循环链表C.单链表D.双向循环链表

(16)在顺序表中,只要知道(D),就可以求出任一结点的存储地址。

A.基地址B.结点大小C.向量大小D.基地址和结点大小

(17)在双链表中做插入运算的时间复杂度为(A)。

A.O

(1)B.O(n)C.O(n2)D.O(log2n)

(18)链表不具备的特点是(A)。

A.随机访问B.不必事先估计存储空间

C.插入删除时不需移动元素D.所需空间与线性表成正比

(19)以下关于线性表的论述,不正确的为(C)。

A.线性表中的元素可以是数字、字符、记录等不同类型

B.线性顺序表中包含的元素个数不是任意的

C.线性表中的每个结点都有且仅有一个直接前趋和一个直接后继

D.存在这样的线性表,即表中没有任何结点

(20)在(B)的运算中,使用顺序表比链表好。

A.插入B.根据序号查找C.删除D.根据元素查找

四.下述算法的功能是什么?

(1)

(2)

解:

(1)返回结点*p的直接前趋结点地址。

(2)交换结点*p和结点*q(p和q的值不变)。

五.程序填空

1.已知线性表中的元素是无序的,并以带表头结点的单链表作存储。

试写一算法,删除表中所有大于min,小于max的元素,试完成下列程序填空。

Voiddelete(lklisthead;datatypemin,max)

{q=head->next;

while(p!

=NULL)

{if((p->data<=min)||(p->data>=max)

{q=p;p=p->next;}

else

{q->next=p->next;

delete(p);

p=q->next;}

}

}

2.在带头结点head的单链表的结点a之后插入新元素x,试完成下列程序填空。

structnode

{elemtypedata;

node*next;

};

voidlkinsert(node*head,elemtypex)

{node*s,*p;

s=newnode;

s->data=x;

p=head->next;

while(p!

=NULL)&&(p->data!

=a)

____p=p->next;

if(p==NULL)

cout<<"不存在结点a!

";

else{_____s->next=p->next______;

___p->next=s__________;

}

}

六.程序设计题

1.写一个对单循环链表进行遍历(打印每个结点的值)的算法,已知链表中任意结点的地址为P。

2.对给定的带头结点的单链表L,编写一个删除L中值为x的结点的直接前趋结点的算法。

3.将一个顺序表中从第i个结点开始的k个结点删除。

4.已知一个单链表,编写一个函数从单链表中删除自第i个结点起的k个结点。

5.有—个单链表(不同结点的数据域值可能相同),其头指针为head,编写一个函数计算值域为x的结点个数。

6.有两个循环单链表,链头指针分别为head1和head2,编写一个函数将链表head1链接到链表head2,链接后的链表仍是循环链表。

1.解:

voidShow(ListNode*P)

{ListNode*t=P;

do

{printf("%c",t->data);

t=t->rear;

}

while(t!

=P);

}

2.解:

voiddelete(ListNode*L)

{ListNode*p=L,*q;

if(L->next->data==X)

{printf(“值为x的结点是第一个结点,没有直接前趋结点可以删除”);

return;

}

for(;p->next->data!

=X;q=p;p=p->next);//删除指针p所指向的结点

q->next=p->next;

deletep;

}

 

3.解(校对一下,或换一题)

voidDel(SeqList*L,inti,intk)

{intj=i-1+k;

for(j=0;j

{L->data[i-1+j]=L->data[i+k-2+j];

if(i+k-2+j>L->last)

break;

}

}

voidDel(SeqList*L,inti,intk)

{intj=i-1+k;

if(j>L->last)

{printf(“超出范围!

”)

return;

}

for(j=0;jlast-i;j++)

L->data[i-1+j]=L->data[i+k-2+j];

}

4.解:

voidDel(node*head,inti,intk)

{

node*p,*q;

intj;

if(i==1)

for(j=1;j<=k;j++)//删除前k个元素

{

p=head;//p指向要删除的结点

head=head->next;

deletep;

}

else

{

p=head;

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

p=p->next;//p指向要删除的结点的前一个结点

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

{

q=p->next;//q指向要删除的结点

p->next=q->next;

deleteq;

}

}

}佟198

5.解:

本题是遍历单链表的每个结点,每遇到一个结点,结点个数加1,结点个数存储在变量n中。

实现本题功能的函数如下:

intcounter(head)

node*head;

{node*p;

intn=0;

p=head;

while(p!

=NULL)

{if(p->data==x)

n++;

p=p->next;

}

return(n);

}

6.解:

本题的算法思想是:

先找到两链表的尾指针,将第一个链表的尾指针与第二个链表的头结点链接起来,使之成为循环的。

函数如下:

node*link(node*head1,*head2)

{node*p,*q;

p=head1;

while(p->next!

=head1)

p=p->next;

q=head2;

while(q->next!

=head2)

q=q->next;

p->next=head2;

q->next=head1;

return(head1);

}

模拟考题

1.在顺序存储的线性表第i个位置插入新结点x,试完成下列程序填空。

typedefstruct//将data和last封装在一个结构体

{datatypedata[MAXLEN];//MAXLEN为线性表的最大长度

intlast;

}SeqList;

intInsList(SeqList*L,inti,datatypex)//插入结点函数

{intj;

if(L->last==MAXLEN-1)

{cout<<"顺序表已满!

";return(-1);}

if(i<1||i>L->last+2)//检查插入位置的正确性

{cout<<"位置出错!

";return(0);}

for(j=L->last;j>=i-1;j--)//结点移动

L->data[j+1]=L->data[j];

L->Lata[i-1]=x;//新结点插入

L->last++;(或L->last=L->last+1)

return

(1);

}

2.一个带头指针的单链表,写出在值为x的结点之后插入m个结点的算法。

voidinsertm(lklisthead;intm)

{p=head->next;

while(p!

=NULL)&&(p->data!

=x)

p=p->next;

if(p->data==x)

{q=p->next;

for(i=0;i

{s=new(node);

cin<

s->data=a;

p->next=s;

p=s;}

p->next=q;

}

}

3.有两个循环单链表,头指针分别为head1和head2,下列函数是将链表head1链接到链表head2,链接后的链表仍然是循环链表,试完成下列程序填空。

(提示:

先找到两链表的尾指针,再将第一个链表的尾指针与第二个链表的头结点链接起来)

node*link(node*head1,node*head2)

{node*p,*q;

p=head1;

while(p->next!

=head1)

p=p->next;

q=head2;

while(q->next!

=head2)

q=q->next;

p->next=head2;

q->next=head1;

return(head1);

}

出师表

两汉:

诸葛亮

  先帝创业未半而中道崩殂,今天下三分,益州疲弊,此诚危急存亡之秋也。

然侍卫之臣不懈于内,忠志之士忘身于外者,盖追先帝之殊遇,欲报之于陛下也。

诚宜开张圣听,以光先帝遗德,恢弘志士之气,不宜妄自菲薄,引喻失义,以塞忠谏之路也。

  宫中府中,俱为一体;陟罚臧否,不宜异同。

若有作奸犯科及为忠善者,宜付有司论其刑赏,以昭陛下平明之理;不宜偏私,使内外异法也。

  侍中、侍郎郭攸之、费祎、董允等,此皆良实,志虑忠纯,是以先帝简拔以遗陛下:

愚以为宫中之事,事无大小,悉以咨之,然后施行,必能裨补阙漏,有所广益。

  将军向宠,性行淑均,晓畅军事,试用于昔日,先帝称之曰“能”,是以众议举宠为督:

愚以为营中之事,悉以咨之,必能使行阵和睦,优劣得所。

  亲贤臣,远小人,此先汉所以兴隆也;亲小人,远贤臣,此后汉所以倾颓也。

先帝在时,每与臣论此事,未尝不叹息痛恨于桓、灵也。

侍中、尚书、长史、参军,此悉贞良死节之臣,愿陛下亲之、信之,则汉室之隆,可计日而待也

  臣本布衣,躬耕于南阳,苟全性命于乱世,不求闻达于诸侯。

先帝不以臣卑鄙,猥自枉屈,三顾臣于草庐之中,咨臣以当世之事,由是感激,遂许先帝以驱驰。

后值倾覆,受任于败军之际,奉命于危难之间,尔来二十有一年矣。

  先帝知臣谨慎,故临崩寄臣以大事也。

受命以来,夙夜忧叹,恐托付不效,以伤先帝之明;故五月渡泸,深入不毛。

今南方已定,兵甲已足,当奖率三军,北定中原,庶竭驽钝,攘除奸凶,兴复汉室,还于旧都。

此臣所以报先帝而忠陛下之职分也。

至于斟酌损益,进尽忠言,则攸之、祎、允之任也。

  愿陛下托臣以讨贼兴复之效,不效,则治臣之罪,以告先帝之灵。

若无兴德之言,则责攸之、祎、允等之慢,以彰其咎;陛下亦宜自谋,以咨诹善道,察纳雅言,深追先帝遗诏。

臣不胜受恩感激。

  今当远离,临表涕零,不知所言。

 

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

当前位置:首页 > 高等教育 > 军事

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

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