《(题)数据结构复习题》由会员分享,可在线阅读,更多相关《(题)数据结构复习题(5页珍藏版)》请在金锄头文库上搜索。
1、1Ch3 链表 (共 18 题,11 道算法设计题)一、选择题1、设单链表中结点的结构为(data, link) 。已知指针 q 所指结点是指针 p 所指结点的直接前驱,若在*q 与*p 之间插入结点*s,则应执行下列哪一个操作?(1) s-link = p-link; p-link = s; (2) q-link = s; s-link = p;(3) p-link = s-link; s-link = p; (4) p-link = s; s-link = q;Key:(2)2、设单链表中结点的结构为(data, link) 。已知指针 p 所指结点不是尾结点,若在*p 之后插入结点*s,
2、则应执行下列哪一个操作?(1) s-link = p; p-link = s; (2) s-link = p-link;p-link = s;(3) s-link = p-link; p = s; (4) p-link = s; s-link = p;Key:(2)3、设单链表中结点的结构为(data, link) 。若想摘除结点*p 的直接后继,则应执行下列哪一个操作?(1) p-link = p-link-link; (2) p = p-link; p-link = p-link-link;(3) p-link = p-link; (4) p = p-link-link;Key:(1)4、
3、设单循环链表中结点的结构为(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) ;2Key:(4)5、设双向循环链表中结点的结构为(data, prior, next)
4、 ,且不带表头结点。若想在指针 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 =
5、s;Key:(4)二、简答题6、线性结构可用顺序表或链表存储。试问:(1)如果有 n 个表同时并存,并且在处理过程中各表的长度会动态发生变化,表的总数也可能自动改变、在此情况下,应选用哪种存储表示?为什么?Key:应选用链接存储表示。如果采用顺序存储表示,必须在一个连续的可用空间中为这 n 个表分配空间。初始时因不知道哪个表增长得快,必须平均分配空间。在程序运行过程中,有的表占用的空间增长得快,有的表占用空间增长得慢;有的表很快就用完了分配给它的空间,有的表才用了少量的空间,在进行元素的插入时就必须成片地移动其他的表的空间,以空出位置进行插入;在元素删除时,为填补空白,也可能移动许多元素。这个
6、处理过程极其繁琐和低效。如果采用链接存储表示,一个表的存储空间可以连续,可以不连续。表的增长通过动态存储分配解决,只要存储器未满,就不会有表溢出的问题;表的收缩可以通过动态存储释放实现,释放的空间还可以在以后动态分配给其他的存储申请要求,非常灵活方便。对于 n 个表(包括表的总数可能变化)共存的情形,处理十分简便和快捷。所以选用链接存储表示较好。(2)若表的总数基本稳定,且很少进行插入和删除,但要求以最快的速度存取表中的元素,这时,应采用哪种存储表示?为什么?3Key:应采用顺序存储表示。因为顺序存储表示的存取速度快,但修改效率低。若表的总数基本稳定,且很少进行插入和删除,但要求以最快的速度存
7、取表中的元素,这时采用顺序存储表示较好。7、在单链表、双向链表和单循环链表中,若仅知道指针 p 指向某一结点,不知道表头指针,能否将结点*p 从链表中删去?若可以,其时间复杂度各为多少?三、算法设计题8、设单循环链表中结点的结构为(data, link) ,且 head 是指向带表头结点的单循环链表的表头结点的指针。试编写一个算法,统计链表的长度(不计入表头结点) 。 9、设 A 和 B 是两个单链表,表中的元素均按结点的值(整数)升序排列。试编写一个函数,将 A 和 B 归并成一个按结点的值降序排列的单链表 C。要求辅助存储空间为 O(1) 。10、已知 head 为单链表的表头指针, 链表
8、中存储的都是整型数据,试写出实现下列运算的递归算法:(1) 求链表中的最大整数。(2) 求链表的结点个数。(3) 求所有整数的平均值。11、设有一个表头指针为 h 的单链表。试设计一个算法,通过遍历一趟链表,将链表中所有结点的链接方向逆转,如下图所示。要求逆转结果链表的表头指针 h 指向原链表的最后一个结点。prhh412、已知由带表头结点的单链表表示的线性表中含有三类字符类型的元素(字母字符、数字字符、其他字符) 。试编写一个函数,构造三个以单循环链表表示的线性表,使得每个表中只包含同一类型的字符。要求利用原表中的结点空间作为这三个链表的结点空间。表头结点可另辟空间。13、从左到右及从右到左
9、遍历一个单链表是可能的,其方法是在从左向右遍历的过程中将链接方向逆转,如下图所示。在图中的指针 p 指向当前正在访问的结点,指针 pr 指向指针p 所指结点的左侧的结点。此时,指针 p 所指结点左侧的所有结点的链接方向都已逆转。试编写两个函数,按上述方法自左向右、自右向左单步遍历单链表。表头指针为 h。14、求解 Josephus 问题:设 n 个人围坐在一个圆桌周围,从第 s 个人开始报数,数到第 m个人,让他出局;然后从出局的下一个人重新开始报数,数到第 m 个人,再让他出局,如此反复直到所有的人全部出局为止。(1) 以 n = 9, s = 1, m = 5 为例,人工模拟 Joseph
10、us 的求解过程以求得问题的解。(2) 试编写一个求解 Josephus 问题的函数。用整数序列 1, 2, 3, , n 表示顺序围坐在圆桌周围的人,并采用不带表头结点的循环链表作为求解过程中使用的数据结构,对于任意给定的 n, s 和 m,求出这 n 个人的出局序列。15、试设计一个实现下述要求的查找运算函数 Locate(L, x) 。设有一个带表头结点的双向链表 L,每个结点有 4 个数据成员:指向前驱结点的指针 prior、指向后继结点的指针next、存放数据的成员 data 和访问频度 freq。所有结点的 freq 初始时都为 0。每当在链表prppr p pr p5上进行一次
11、Locate (L, x)操作时,令元素值为 x 的结点的访问频度 freq 加 1,并将该结点前移,链接到与它的访问频度相等的结点后面,使得链表中所有结点保持按访问频度递减的顺序排列,以使频繁访问的结点总是靠近表头。16、试设计一个算法,改造一个带表头结点的双向链表,所有结点的原有次序保持在各个结点的右链域 rLink 中,并利用左链域 lLink 把所有结点按照其值从小到大的顺序连接起来。17、设有一个字符型的单链表,每个链结点中存放一个字符。试定义链表的数据类型并编制一个算法,判断链表中的字符是否中心对称。例如 x y z z y x 和 x y z y x 都是中心对称的字符串。18、有一个循环链表,它既没有头指针又没有头结点。只有一个指针 p 指向表中的某一结点。试编写一个函数,删除指针 p 所指结点的直接前驱结点。