数据结构习题精解(C语言实现+微课视频)
上QQ阅读APP看书,第一时间看更新

2.7 线性表的典型试题精选与解析

2.7.1 典型试题

一、单项选择题

1、对线性表,在下列哪种情况下应当采用链表表示?(  )

A.经常需要随机地存取元素

B.经常需要进行插入和删除操作

C.表中元素需要占据一片连续的存储空间

D.表中元素的个数不变

2、在带有头结点的单链表L中,要向表头插入一个由指针p指向的结点,则需执行(  )。

A.p->next=L->next;L->next=p;

B.p->next=L;L=p;

C.p->next=L;p=L;

D.L=p;p->next=L;

3、非空的循环单链表head的尾结点p满足(  )。

A.p->next==head

B.p->next==NULL

C.p==NULL

D.p==head

4、在双向循环链表中,在p指针所指的结点后插入一个指针q所指向的新结点,修改指针的操作是(  )。

A.p->next=q;q->prior=p;p->next->prior=q;q->next=q;

B.p->next=q;p->next->prior=q;q->prior=p;q->next=p->next;

C.q->prior=p;q->next=p->next;p->next->prior=q;p->next=q;

D.q->next=p->next;q->prior=p;p->next=q;p->next=q;

5、线性表采用链式存储时,结点的存储地址(  )。

A.必须是连续的

B.必须是不连续的

C.连续与否均可

D.和头结点的存储地址相连续

6、(2016年全国统考试题)已知表头元素为c的单链表在内存中的存储状态如下表所示。

现将f存放在1014H处并插入到单链表,若f在逻辑上位于a和e之间,则a、e、f的链接地址依次是(  )。

A.1010H,1014H,1004H

B.1010H,1004H,1014H

C.1014H,1010H,1004H

D.1014H,1004H,1010H

7、从表中任一结点出发,都能扫描整个表的是(  )。

A.单链表

B.顺序表

C.循环链表

D.静态链表

8、在一个长度为n的带头结点的单链表L中,设有尾指针r,则执行(  )操作与链表的表长有关。

A.删除单链表中的第一个元素

B.在单链表中第一个元素前插入新元素

C.删除单链表中的最后一个元素

D.在单链表最后一个元素后插入新元素

9、在双向链表存储结构中,删除p指向的结点时修改指针的操作是(  )。

A.p->prior->next=p->next;p->next->prior=p->prior;

B.p->prior=p->prior->prior;p->prior->next=p;

C.p->next->prior=p;p->next=p->next->next;

D.p->next=p->prior->prior;p->prior=p->next->next;

10、(2016年统考试题)已知一个带有表头结点的双向循环链表L,结点结构为,其中prev和next分别是指向其直接前驱和直接后继结点的指针。现要删除指针p所指向的结点,正确的语句序列是(  )。

A.p->next->prev=p->prev;p->prev->next=p->prev;free(p);

B.p->next->prev=p->next;p->prev->next=p->next;free(p);

C.p->next->prev=p->next;p->prev->next=p->prev;free(p);

D.p->next->prev=p->prev;p->prev->next=p->next;free(p);

11、不带头结点的单链表head为空的判定条件是(  )。

A.head==NULL

B.head->next==NULL

C.head->next==head

D.head!=NULL

12、(哈尔滨工业大学考研试题)将长度为n的单链表链接在长度为m的单链表之后的算法时间复杂度为(  )。

A.O(1)

B.O(n)

C.O(m)

D.O(m+n)

13、在一个单链表中,已知q所指结点是p所指结点的前驱结点,若在q和p之间插入一个结点s,则执行(  )。

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

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

C.q->next=s;s->next=p;

D.p->next=s;s->next=q;

14、在具有n个结点的单链表上查找值为x的元素时,其时间复杂度为(  )。

A.O(n)

B.O(1)

C.O(n2

D.O(n-1)

15、在一个单链表中,若删除p所指向结点的后继结点,则执行(  )。

A.p->next=p->next->next;

B.p=p->next;p->next=p->next->next;

C.p=p->next;

D.p=p->next->next;

16、已知指针p和q分别指向某单链表中第一个结点和最后一个结点。假设指针s指向另一个单链表中某个结点,则在s所指结点之后插入上述链表应执行的语句为(  )。

A.q->next=s->next;s->next=p;

B.s->next=p;q->next=s->next;

C.p->next=s->next;s->next=q;

D.s->next=q;p->next=s->next;

17、在单链表中,指针p指向元素为x的结点,实现删除x的后继的语句是(  )。

A.p=p->next;

B.p->next=p->next->next;

C.p->next=p;

D.p=p->next->next;

18、(北京理工大学考研试题)在一个单链表中,指针p指向其中某个结点,若在该结点前插入一个由指针s指向的结点,则需执行(  )。

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

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

C.r=p->next;p->next=s;s->next=r;

D.仅靠已知条件无法实现

19、(华中科技大学考研试题)某线性表用带头结点的循环单链表存储,头指针为head,当head->next->next->next==head成立时,线性表的长度可能是(  )。

A.1或2

B.2

C.3

D.0或2

20、(2013年全国统考试题)已知两个长度分别为m和n的升序链表,如果将它们合并为一个长度为m+n的降序排列的链表,则最坏情况下算法时间复杂度为(  )。

A.O(n)

B.O(m*n)

C.O(min(m,n))

D.O(max(m,n))

二、综合分析题

1、函数GetElem实现返回单链表的第i个元素,请在空格处将算法补充完整。其中结点结构为

2、以下是实现单链表的插入算法,请在空格处将算法补充完整。

3、以下是实现单链表的删除算法,请在空格处将算法补充完整。

4、写出算法的功能。

5、一元稀疏多项式以带头结点的循环单链表按降幂排列,结点包含3个域:系数coef、指数exp和指针next。现对该链表求一阶导数,链表的头指针为h,头结点的exp域的值为-1。

6、对单链表中元素按插入法排序的C语言描述算法如下,其中L为链表头结点指针,NLLL表示指针为空。请填充算法中标出的空白处,完成其功能。

三、算法设计题

1、编写算法,实现带头结点单链表的逆置。

2、有两个循环链表,链头指针分别为L1和L2,要求写出算法将L2链表链到L1链表之后,且连接后仍保持循环链表形式。

3、编写算法,将一个无序的单链表变成一个有序的单链表,要求按照从小到大排列并且不占用额外的存储空间。

4、已知有两个带头结点的单链表A和B,A和B中的元素由小到大排列,设计一个算法,求A和B的交集C,将A和B中相同的元素插入C中。

5、利用单链表的基本运算,实现如果在单链表A中出现的元素,在单链表B中也出现,则将A中该元素删除。如果把单链表看成是集合,这其实是求两个集合的差集A-B,即所有属于集合A而不属于集合B的元素。

6、编写算法,将两个非递减排列的单链表A和B合并得到C,C中的元素仍按照非递减排列。

7、已知有两个带头结点的双向循环链表A和B,它们的元素均是按照递增排列,编写算法,将A和B合并成一个双向循环链表,并使合并后链表中的元素也按照递增排列。

8、已知一个双向循环链表L,设计算法实现将双向循环链表L的所有结点逆置。

9、(西北大学考研试题)编写程序,要求完成:(1)建立一个带头结点的线性链表,用以存放输入的二进制数,链表中每个结点的data域存放一个二进制位。(2)在此链表上实现对二进制数加1的运算,并输出运算结果。

10、(2012年全国统考试题)假定采用带头结点的单链表保存单词,当两个单词有相同的后缀时,则可共享相同的后缀存储空间。例如,“loading”和“being”的存储映像如图2-32所示。

图2-32 存储映像

设str1和str2分别指向两个单词所在单链表的头结点,链表结点结构为,请设计一个时间上尽可能高效的算法,找出由str1和str2所指的两个链表共同后缀的起始位置(如图中字符i所在结点的位置p)。要求:

(1)给出算法的基本设计思想。

(2)根据算法设计思想,请采用C语言描述算法。

(3)说明算法的时间复杂度。

11、(2019年全国统考试题)设线性表(a1,a2,a3,…,an-1,an)采用带头结点的单链表保存,链表中的结点定义如下:

请设计一个空间复杂度为O(1)且时间上尽可能高效的算法,重新排列L中的各结点,得到线性表L’=(a1,an,a2,an-1,a3,an-2,…)。要求:

(1)给出算法的基本设计思想。

(2)根据设计思想,采用C或C++语言描述算法,关键之处给出注释。

(3)说明你所设计的算法时间复杂度。

12、(南京航空航天大学考研试题)假设A为递增有序的单链表(长度为n),B为递减有序的单链表(长度为m),编写算法,利用原链表的结点存储空间,将A和B合并成一个递增有序的单链表,要求时间复杂度为O(n+m),并给出算法思想。