数据结构上机考试范围:顺序表、单链表、二叉树
顺序表表
基于sequlist.h中定义的顺序表,编写算法函数reverse(sequence_list*L),实现顺序表的就地倒置。
我们可以将一个顺序表分成两个部分
将第一个数和最后一个数互换
如此往复,就可以实现就地倒置了
编写一个算法函数voidsprit(sequence_list*L1,sequence_list*L2,sequence_list*L3),
将顺序表L1中的数据进行分类,奇数存放到存到顺序表L2中,偶数存到顺序表L3中,编写main()进行测试。
判断奇数和偶数的方法就是“%2”的方法
我们可以创造循环遍历最开始的顺序表,然后将奇数和偶数分别放入其他两个顺序表中
需要注意的是:我们每次插入的时候L2和L3这两个表长都需要加1
已知顺序表L1,L2中数据由小到大有序,请用尽可能快的方法将L1与L2中的数据合并到L3中,使数据在L3中按升序排列。
因为在原有的顺序表中的排序就是升序,所以我们只需要考虑插入顺序而不需要再次考虑排序
逐一将L1和L2中的数值进行比较,谁小谁就进,如此循环。遇到相等的情况时就任意进入然后让两个顺序表的所指向的位置向后移动
只要有任意一个顺序表插入完毕,结束循环,定flag为1
如果L1,L2原本就不相等。就将另一个顺序表剩下的数值全部插入。
图解如下:
假设顺序表la与lb分别存放两个整数集合,函数inter(seqlist*la,seqlist*lb,seqlist*lc)
的功能是实现求顺序表la与lb的交集存放到顺序表lc中,请将函数补充完整.
交集就是判断两个顺序表中的数据是否相同
如果数据相同就放入预定的lc中
所以我们要用到嵌套循环,才能让所有数据都进行对比
请编写一个算法函数partion(sequence_list*L),尽可能快地将顺序表L中的所有奇数调整到表的左边,
所有偶数调整到表的右边,并分析算法的时间复杂度。
数据的调整接近于无序,所以我们不妨再设置三个顺序表。
第一个顺序表用于存放奇数,第二个顺序表用于存放偶数,第三个顺序表用于生成我们想得到的顺序表
时间复杂度就是n
已知长度为n的线性表L采用顺序存储结构,编写一个复杂度为O(n)、
空间复杂度为O(1)的算法,该算法删除线性表中所有值为x的数据元素。
解法一:用k记录顺序表L中不等于x的元素个数(即需要保存的元素个数),边扫描L边统计k,并将不等于x的元素向前放在k位置上,最后修改L的长度。
题目已经把我要说的说了……
解法二:用k记录顺序表L中等于x的元素个数,边扫描L边统计K,并将不等于x的元素前移k个位置,最后修改L的长度。
设将n(n1)个整数存放到一维数组R中。试设计一个时间和空间两方面尽可能高效的算法,将R中整数序列循环左移p(0pn)个位置,即将R中的数据序列(X0,X1,…,Xn-1)变换为(Xp,Xp+1,…,Xn-1,X0,X1,…,Xp-1),
要求:
(1)给出算法的基本设计思想。
(2)根据设计思想,采用C、C++或JAVA语言描述算法,关键之处给出注释。
(3)说明你所设计算法的时间复杂度和空间复杂度。
函数reverse()的功能是将顺序表L-a[left..right]进行首尾倒置,请将函数补充完整
解法1:函数leftShift1()的功能是实现顺序表循环左移p位,其中n为顺序表中的元素个数
解法2:函数leftShift2()的功能是实现顺序表循环左移p位,其中n为顺序表中的元素个数