(题)数据结构复习题

更新时间:2024-03-05 02:06:02 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

Ch3链表

一、选择题

(共18题,11道算法设计题)

1、设单链表中结点的结构为(data, link)。已知指针q所指结点是指针p所指结点的直接前驱,若在*q与*p之间插入结点*s,则应执行下列哪一个操作? (1) s->link = p->link; p->link = s; (3) p->link = s->link; s->link = p;

Key:(2)

2、设单链表中结点的结构为(data, link)。已知指针p所指结点不是尾结点,若在*p之后插入结点*s,则应执行下列哪一个操作? (1) s->link = p;

p->link = s;

(2) s->link = p->link;p->link = s; (4) p->link = s;

s->link = p;

(2) q->link = s; s->link = p; (4) p->link = s; s->link = q;

(3) s->link = p->link; p = s;

Key:(2)

3、设单链表中结点的结构为(data, link)。若想摘除结点*p的直接后继,则应执行下列哪一个操作?

(2) p = p->link; p->link = p->link->link; (4) p = p->link->link;

(1) p->link = p->link->link; (3) p->link = p->link;

Key:(1)

4、设单循环链表中结点的结构为(data, link),且rear是指向非空的带表头结点的单循环链表的尾结点的指针。若想删除链表第一个结点,则应执行下列哪一个操作? (1) s = rear; rear = rear->link; free(s); (2) rear = rear->link; free(rear); (3) rear = rear->link->link; free(rear);

(4) s = rear->link->link; rear->link->link = s->link; free(s);

1

Key:(4)

5、设双向循环链表中结点的结构为(data, prior, next),且不带表头结点。若想在指针p所指结点之后插入指针s所指结点,则应执行下列哪一个操作?

(1) p->next = s; s->prior = p; p->next->prior = s; s->next = p->next; (2) p->next = s; p->next->prior = s; s->prior = p; s->next = p->next; (3) s->prior = p; s->next = p->next; p->next = s; p->next->prior = s; (4) s->prior = p; s->next = p->next; p->next->prior = s; p->next = s;

Key:(4)

二、简答题

6、线性结构可用顺序表或链表存储。试问:

(1)如果有n个表同时并存,并且在处理过程中各表的长度会动态发生变化,表的总数也可能自动改变、在此情况下,应选用哪种存储表示?为什么?

Key:应选用链接存储表示。

如果采用顺序存储表示,必须在一个连续的可用空间中为这n个表分配空间。初始时因不知道哪个表增长得快,必须平均分配空间。在程序运行过程中,有的表占用的空间增长得快,有的表占用空间增长得慢;有的表很快就用完了分配给它的空间,有的表才用了少量的空间,在进行元素的插入时就必须成片地移动其他的表的空间,以空出位置进行插入;在元素删除时,为填补空白,也可能移动许多元素。这个处理过程极其繁琐和低效。

如果采用链接存储表示,一个表的存储空间可以连续,可以不连续。表的增长通过动态存储分配解决,只要存储器未满,就不会有表溢出的问题;表的收缩可以通过动态存储释放实现,释放的空间还可以在以后动态分配给其他的存储申请要求,非常灵活方便。对于n个表(包括表的总数可能变化)共存的情形,处理十分简便和快捷。所以选用链接存储表示较好。

(2)若表的总数基本稳定,且很少进行插入和删除,但要求以最快的速度存取表中的元素,这时,应采用哪种存储表示?为什么?

2

Key:应采用顺序存储表示。

因为顺序存储表示的存取速度快,但修改效率低。若表的总数基本稳定,且很少进行插入和删除,但要求以最快的速度存取表中的元素,这时采用顺序存储表示较好。

7、在单链表、双向链表和单循环链表中,若仅知道指针p指向某一结点,不知道表头指针,能否将结点*p从链表中删去?若可以,其时间复杂度各为多少?

三、算法设计题

8、设单循环链表中结点的结构为(data, link),且head是指向带表头结点的单循环链表的表头结点的指针。试编写一个算法,统计链表的长度(不计入表头结点)。

9、设A和B是两个单链表,表中的元素均按结点的值(整数)升序排列。试编写一个函数,将A和B归并成一个按结点的值降序排列的单链表C。要求辅助存储空间为O(1)。

10、已知head为单链表的表头指针, 链表中存储的都是整型数据,试写出实现下列运算的递归算法:

(1) 求链表中的最大整数。 (2) 求链表的结点个数。 (3) 求所有整数的平均值。

11、设有一个表头指针为h的单链表。试设计一个算法,通过遍历一趟链表,将链表中所有结点的链接方向逆转,如下图所示。要求逆转结果链表的表头指针h指向原链表的最后一个结点。

Λ 3

Λ

pr h Λ h

12、已知由带表头结点的单链表表示的线性表中含有三类字符类型的元素(字母字符、数字字符、其他字符)。试编写一个函数,构造三个以单循环链表表示的线性表,使得每个表中只包含同一类型的字符。要求利用原表中的结点空间作为这三个链表的结点空间。表头结点可另辟空间。

13、从左到右及从右到左遍历一个单链表是可能的,其方法是在从左向右遍历的过程中将链接方向逆转,如下图所示。在图中的指针p指向当前正在访问的结点,指针pr指向指针p

pr

所指结点的左侧的结点。此时,指针p所指结点左侧的所有结点的链接方向都已逆转。

p

14、求解Josephus问题:设n个人围坐在一个圆桌周围,从第s个人开始报数,数到第m个人,让他出局;然后从出局的下一个人重新开始报数,数到第m个人,再让他出局,……,如此反复直到所有的人全部出局为止。

(1) 以n = 9, s = 1, m = 5为例,人工模拟Josephus的求解过程以求得问题的解。 (2) 试编写一个求解Josephus问题的函数。用整数序列1, 2, 3, ……, n表示顺序围坐在圆桌周围的人,并采用不带表头结点的循环链表作为求解过程中使用的数据结构,对于任意给定的n, s和m,求出这n个人的出局序列。

15、试设计一个实现下述要求的查找运算函数Locate(L, x)。设有一个带表头结点的双向链表L,每个结点有4个数据成员:指向前驱结点的指针prior、指向后继结点的指针next、存放数据的成员data和访问频度freq。所有结点的freq初始时都为0。每当在链表上进行一

试编写两个函数,按上述方法自左向右、自右向左单步遍历单链表。表头指针为h。

Λ Λ

pr

p

Λ Λ Λ

pr

p

Λ 4

次Locate (L, x)操作时,令元素值为x的结点的访问频度freq加1,并将该结点前移,链接到与它的访问频度相等的结点后面,使得链表中所有结点保持按访问频度递减的顺序排列,以使频繁访问的结点总是靠近表头。

16、试设计一个算法,改造一个带表头结点的双向链表,所有结点的原有次序保持在各个结点的右链域rLink中,并利用左链域lLink把所有结点按照其值从小到大的顺序连接起来。

17、设有一个字符型的单链表,每个链结点中存放一个字符。试定义链表的数据类型并编制一个算法,判断链表中的字符是否中心对称。例如x y z z y x和x y z y x都是中心对称的字符串。

18、有一个循环链表,它既没有头指针又没有头结点。只有一个指针p指向表中的某一结点。试编写一个函数,删除指针p所指结点的直接前驱结点。

5

本文来源:https://www.bwwdw.com/article/26xa.html

Top