线性表.docx

上传人:b****6 文档编号:3018738 上传时间:2022-11-17 格式:DOCX 页数:12 大小:21.10KB
下载 相关 举报
线性表.docx_第1页
第1页 / 共12页
线性表.docx_第2页
第2页 / 共12页
线性表.docx_第3页
第3页 / 共12页
线性表.docx_第4页
第4页 / 共12页
线性表.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

线性表.docx

《线性表.docx》由会员分享,可在线阅读,更多相关《线性表.docx(12页珍藏版)》请在冰豆网上搜索。

线性表.docx

线性表

线性表

(总分:

104.00,做题时间:

90分钟)

一、单项选择题

(总题数:

12,分数:

24.00)

1.

(1)静态链表既有顺序存储的优点,又有动态链表的优点,所以,它存取表中第i个元素的时间与i无关。

(2)静态链表中能容纳的元素个数的最大数在表定义时就确定了,以后不能增加。

(3)静态链表与动态链表在元素的插入、删除上类似,不需做元素的移动。

以上错误的是()。

(分数:

2.00)

 A.

(1),

(2)

 B.

(1) √

 C.

(1),

(2),(3)

 D.

(2)

解析:

静态链表使用结构体数组来实现线性链表的功能。

因为其用游标cur来指示下一个数据元素的存储位置,所以存取数据时静态链表同线性链表(单链表)是相似的。

也就是说,静态链表在存取表中第i个元素的时间同i是相关的。

2.在一个长度为n的顺序表中删除第i个元素(0<=i<=n)时,需向前移动()个元素。

(分数:

2.00)

 A.n-i √

 B.n-i+1

 C.n-i-1

 D.i

解析:

一般情况下,删除顺序表的第i(1<-i<-n)个元素时需要将第i+1到第n个元素(共n-i个元素)依次向前移动一个位置。

所以答案为A。

3.下面关于线性表的叙述中,错误的是哪一个?

()

(分数:

2.00)

 A.线性表采用顺序存储,必须占用一片连续的存储单元

 B.线性表采用顺序存储,便于进行插入和删除操作 √

 C.线性表采用链接存储,不必占用一片连续的存储单元

 D.线性表采用链接存储,便于插入和删除操作

解析:

线性表采用顺序存储,并不便于进行插入和删除操作。

4.下述哪一条是顺序存储结构的优点?

()

(分数:

2.00)

 A.存储密度大 √

 B.插入运算方便

 C.删除运算方便

 D.可方便地用于各种逻辑结构的存储表示

解析:

顺序存储利用物理的邻接关系表示数据元素之间的逻辑关系,因此没有必要设置指针域,所以其存储密度比链式存储大,但是插入运算和删除运算都需大量移动数据元素,并不方便;D选项并不是顺序存储结构的优点。

所以答案为A。

5.若某线性表最常用的操作是存取任一指定序号的元素和在最后进行插入和删除运算,则利用()存储方式最节省时间。

(分数:

2.00)

 A.顺序表 √

 B.双链表

 C.带头结点的双循环链表

 D.单循环链表

解析:

“存取任一指定序号”最好的方法是实现“随机存取”,则可采用顺序表。

并且,因为插入和删除操作都是在最后进行的,所以无需大量移动数据元素,选项A是最合适的。

6.对于顺序存储的线性表,访问结点和增加、删除结点的时间复杂度为()。

(分数:

2.00)

 A.O(n),O(n)

 B.O(n),O

(1)

 C.O

(1),O(n) √

 D.O

(1),O

(1)

解析:

顺序存储可以实现“随机存取”,因此访问结点的时间复杂度为O

(1),而插入、删除结点由于涉及到大量移动元素,故其时间复杂度为O(n)。

7.线性表是()。

(分数:

2.00)

 A.一个有限序列,可以为空 √

 B.一个有限序列,不可以为空

 C.一个无限序列,可以为空

 D.一个无限序列,不可以为空

解析:

线性表是由相同类型的结点组成的有限序列。

如:

由n个结点组成的线性表

(a1,a2,…,an)

a1是最前结点,an是最后结点。

结点也称为数据元素或者记录。

线性表中结点的个数称为其长度。

长度为O的线性表称为空表。

所以答案为A。

8.设单链表中结点的结构为

typedefstructnode∥链表结点定义

ElemTypedata;∥数据

structnode*Link;∥结点后继指针

ListNode;

已知指针p所指结点不是尾结点,若在p之后插入结点s,则应执行下列哪一个操作?

()

(分数:

2.00)

 A.s—>link—p;p—>link—s;

 B.s—>link—p—>link;p—>link—s; √

 C.s一>link===P—>link;P—S;

 D.p—>link—S;s—>link—p;

解析:

[*]

9.某线性表中最常用的操作是在最后一个元素之后插入一个元素和删除第一个元素,则采用()存储方式最节省运算时间。

(分数:

2.00)

 A.单链表

 B.仅有头指针的单循环链表

 C.双链表

 D.仅有尾指针的单循环链表 √

解析:

仅有尾指针的单循环链表,可以非常方便地找到尾结点,尾结点后面的第一个结点往往是头结点,头结点的下一个结点就是第线性表的第一个结点。

对最后一个元素和第一个元素操作对带尾指针的单循环链表是非常方便的。

10.在双向循环链表中,在P所指的结点之后插入S指针所指的结点,其操作是()。

(分数:

2.00)

 A.p—>next=s;s—>prior=p;p—>next—>prior=s;s—>next=p—>next;

 B.s—>prior=p;s—>next=p—>next;p—>next=s;P—>next—>prior=s:

 C.p—>next=s;p—>next—>prior=s;s—>prior=p;s—>next=p—>next;

 D.s—>prior=p;s—>next=p—>next;p—>next—>prior=s;p—>next=s:

 √

解析:

同单链表相比,双向链表的插入、删除操作需同时修改两个指针。

[*]

步骤:

s—>prior—p—>prior;

p—>prior—>next=s;

s—>next=p;

p—>prior=s;

11.在一个长度为n的顺序表中向第i个元素(0<i<n+1)之前插入一个新元素时,需向后移动()个元素。

(分数:

2.00)

 A.n-i

 B.n-i+1 √

 C.n-i-1

 D.i

解析:

一般情况下,在顺序表的第i(1<=i<=n)个元素之前插入一个元素,需要将第n至i的元素(共n-i+1个元素)向后移动一个位置。

所以答案为B。

12.若长度为n的线性表采用顺序存储结构,在其第i个位置插入一个新元素的算法的时间复杂度为()(1<=i<=n+1)。

(分数:

2.00)

 A.O(0)

 B.O

(1)

 C.O(n) √

 D.O(n2)

解析:

顺序存储的线性表在插入新元素时,需要将第i个元素到第n个元素均向后移动一个单位,插入的新元素成为第i个元素,原来的第i个元素成为第i+1个元素,原来的第n个元素成为第n+1个元素,线性表的长度加1,插入操作的主要工作都放在移动元素上。

假设线性表中含有n个数据元素,在进行插入操作时,若假定在n+1个位置上插入元素的可能性均等,则平均移动元素的个数为:

除非插入在线性表的最后,否则都要移动元素。

所以其时间复杂度为O(n),答案为C。

二、综合应用题(总题数:

8,分数:

80.00)

13.设计在无头结点的单链表中删除第i个结点的算法。

(分数:

10.00)

__________________________________________________________________________________________

正确答案:

(算法思想为:

(1)应判断删除位置的合法性,当i<0或i>n-1时,不允许进行删除操作;

(2)当i=0时,删除第一个结点;

(3)当0<i<n时,允许进行删除操作,但在查找被删除结点时,须用指针记住该结点的前趋结点。

算法描述如下:

delete(LinkList*q,inti)

{∥在无头结点的单链表中删除第i个结点

LinkList*P,*S;

intj;

if(i<0)

printf(“Can'tdelete”);

elseif(i==0)

{s=q;

q=q—>next;

free(s);

}

else

{j=0;s=q;

while((j<i)&&(s!

=NULL))

{p=s;

s=s=>next;

j++:

}

if(s==NULL)

printf(“Cant'tdelete”);

else

{p—>next=s—>next;

free(s);

}

}

})

解析:

14.设计将带表头的链表逆置算法。

(分数:

10.00)

__________________________________________________________________________________________

正确答案:

(解析:

设单循环链表的头指针为head,类型为LinkList。

逆置时需将每一个结点的指针域做一修改,使其原前趋结点成为后继。

如要更改q结点的指针域时,设S指向其原前趋结点,P指向其原后继结点,则只需进行q—>next—>s;操作即可,算法描述如下:

voidinvert(LinkList*head)

{∥逆置head指针所指向的单循环链表

linklist*p,*q,*S;

q=head;

p—head—>next;

while(p!

=head)∥当表不为空时,逐个结点逆置

{s=q;

q=P;

p=p—>next;

q—>next=s;

}

p—>next=q;

,)

解析:

15.设顺序表中的数据元素递增有序,编写一算法将元素X插入到顺序表的适当位置上,并保证该表的有序性。

(分数:

10.00)

__________________________________________________________________________________________

正确答案:

(只要从终端结点开始往前找到第一个比X小(或相等)的结点数据,在这个位置插入就可以了。

算法描述如下:

SqList*Insert—SqList(SqList*L,inti,Elemtypex)

{

if((i<1)‖(i>L—>length+1))

{

printf(“插入位置不合理”);exit(l);

}

if(L—>length>—L—>MaxSize—1)

print{(“顺序表已满,不能再插入!

”);exit(l);

}

{or(m—L—>length—1;m>=i—1;——m)

L—>data[m+1]=L—>data[m];

L—>data[i—1]=x;

L—>length++:

returnL;

})

解析:

16.设线性表A=(a1,a2,a3,…,an)以带头结点的单链表作为存储结构。

编写一个函数,对A进行调整,使得当n为奇数时A=(a2,a4,…,an-1,a1,a3,…,an),当n为偶数时A=(a2,a4,…,an,a1,a3,…,an-1)。

(分数:

10.00)

__________________________________________________________________________________________

正确答案:

(方法一:

voidf(LinkListL)

{

LinkListp,q,r;

p=L;∥*P是偶数尾结点

q=L—>next;∥*q是当前奇数结点

while(q&&q—>next)∥尚有未调整的偶数结点

{

r=q—>next;∥r指向当前偶数结点

q—>next=r—next;∥删除偶数结点

r—>next=P—>next。

P—>next=r;∥插入偶数结点

p=p—>next;

q=q—>next;

}

}

方法二:

voidf(LinkListL)

{

LinkListp,h,

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

当前位置:首页 > 幼儿教育 > 幼儿读物

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

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