/DataStructure

关于考研数据结构与算法综合题的代码实现

Primary LanguageC

dataStructure

顺序表(seqList)

01.从顺序表中删除的一个最小值并用函数返回,空出的位置由最后一个元素填补,若顺序表为空则显示出错信息并退出运行

02.实现顺序表的逆置操作,空间复杂度为O(1)

03.删除顺序表中所有值为x的元素,时间复杂度为O(n),空间复杂度为O(1)

04.从有序的顺序表中,删除给定值在s和t之间的所有元素,若s和t的值不合法或顺序表为空则输出错误信息并返回

05.从顺序表中,删除给定值在s和t之间的所有元素,若s和t的值不合法或顺序表为空则输出错误信息并返回

06.从有序顺序表中删除所有重复的元素,使得表中所有的元素值各不相同

07.将两个有序的顺序表合并为一个有序的顺序表,并由作为函数返回值返回

08.已知在一个数组A[m+n]中依次存放着两个线性表(a1,a2,...,am)和(b1,b2,...,bn).编写一个函数,将数组中的两个顺序表的位置互换,即将(b1,b2,...,bn)放在(a1,a2,...,am)的前面

09. 给定一个有序递增的顺序表。要求高效查找值为x的元素,若查找到了,(如果有后继元素的话)则将其与后继元素交换;若找不到,则将其插入表中,且表中依旧有序

10.[2010统考真题]设将n(n>1)个整数存放到一维数组R中,设计一个在时间和空间两方面都尽可能高效的算法.将R中保存的序列循环左移p(0<p<n)个位置,即将R中的数据由(X0,X1,...,Xn-1)变换为(Xp,Xp+1,...,Xn-1,X0,X1,...,Xp-1).

11.[2011统考真题]一个长度为L(L>=1)的升序序列S,处在L/2上取整位置的数称为S的中位数.现给定两个等长的升序序列A和B,设计一个在时间和空间两方面都尽可能高效的算法,找出两个序列整体的中位数.

12.[2013统考真题]已知一个整数序列A=(a0,a1,...,an-1),其中0<=ai<n(0<=i<n).若存在ap1=ap2=...=apm=x且m>n/2(0<=pk<n,1<=k<=m),则称x为A的主元素.例如A=(0,5,5,3,5,7,5,5),则5为主元素;又如:A=(0,5,5,3,5,1,5,7),则A没有主元素.设计高效的算法,找出主元素并输出,若没有则输出-1

13.[2018统考真题]给定一个含n(n>=1)个整数的数组,设计一个在时间上尽可能高效的算法,找出数组中未出现的最小正整数.

14.[2022统考真题]定义三元组(a,b,c)的距离D=|a-b|+|b-c|+|c-a|.给定三个非空集合S1、S2和S3,按升序分别存储在3个数组中. 请设计一个尽可能高效的算法,计算并输出所有可能的三元组(a,b,c)(a∈S1,b∈S2,c∈S3)中的最小距离. 例如:S1={-1,0,9}, S2={-25,-10,10,11}, S3={2,9,17,30,41}的最小距离是2,对应的三元组是(9,10,9).

链表(linkList)

01.递归地删除不带头结点的单链表L中所有值为x的结点

02.删除带头结点的单链表中所有值为x的结点

03.实现从尾到头(反向)输出一个带头结点的单链表中元素的值

04.删除带头结点的单链表中的其中一个最小结点

05.就地逆置(空间复杂度为O(1))带头结点的单链表

06.使带头结点的单链表中的元素递增有序

07.删除无序的带有头结点的单链表中值介于给定的两个值之间的所有元素

08.给定两个单链表,找出两个链表的公共结点

09.给定一个带头结点的单链表,按递增的次序输出单链表中各节点的数据元素,并释放结点所占的存储空间

10.将带有头结点的单链表A分解成两个带头结点的单链表A和B.使得A中含有原表中序号为奇数的元素,B表中含有原表中序号为偶数的元素.保持相对顺序不变.

11. 设C={a1,b1,a2,b2,...,an,bn}为线性表,采用带头结点的单链表存放,设计一个算法,将其拆分为两个线性表,使得A={a1,a2,...,an},B={bn,...,b2,b1}

12.一个递增有序的线性表中,有数值相同的元素存在.若存储方式为单链表.设计算法去掉数值相同的元素,使表中不再有重复的元素

13.将两个按元素值递增排列的单链表,归并为一个按元素递减的单链表.要求利用原来的两个单链表的结点存放归并后的单链表.

14.A和B是两个所含元素递增的单链表,设计一个算法从A和B中的公共元素产生单链表C,且不破坏A、B结点

15.A、B代表两个以单链表方式存储的集合,两个链表中的元素均递增,求A、B两个集合的交集.且最终结果存放于A中(不另开空间)

16.判断单链表B中元素依次组成的序列是否为单链表A中元素组成的序列的子序列

17.判断带头结点的双循环链表是否对称(即从头部遍历到中间位置和从尾部遍历到中间位置得到的元素序列是否一样)

18.有两个循环单链表,链表头指针分别为h1和h2,编写一个函数将链表h2链接到链表h1之后,要求链接后仍保持循环链表形式

19.有一个带头结点的循环单链表,结点值均为正数.设计一个算法,反复找出链表中的结点最小值,然后将其从链表中删除,直到单链表为空为止,再删除表头结点.

20.设头指针L的带头结点的非循环双向链表,其中每个节点除了前驱指针、数据和后继指针外,还有一个访问频度域freq.在链表被启用前,其值被初始化为0.每当链表中进行一次Locate(L,x)运算时,令元素值为x的结点中的freq域的值增1,并使此链表中结点保持按访问频度非增(递减)的顺序排列.同时最近访问的结点排在频度相同的结点前面,以使频繁访问的结点总是靠近表头.试编写符合上述要求的Locate(L,x)运算的算法,该运算为函数过程,返回找到结点的地址,类型为指针型.

21.单链表有环,是指单链表的最后一个结点指向了链表中的某个结点.试着编写算法判断单链表是否存在环.

22.[2009统考真题]有一个带有表头结点的单链表,在不改变链表的前提下,设计尽可能高效的算法,查找链表中倒数第k个位置上的结点.

23.[2012统考真题]假定采用带头结点的单链表保存单词,当两个单词有相同的后缀时,可以共享相同的后缀空间,例如:"loading"和"being"中"ing"是共享的.设str1和str2分别指向两个单词所在单链表的头结点,找出str1和str2所指向的.两个链表的共同后缀的起始位置.

24.[2015统考真题] 保留带头结点的单链表中第一次出现的结点而删除其余绝对值相等的结点

25.[2019统考真题] 设线性表L=(a1,a2,a3...,an)采用带头结点的单链表保存,请设计一个空间复杂度为O(1)且时间上尽可能高效的算法,重新排列L中的各节点,得到线性表L'=(a1,an,a2,an-1,...)

栈和队列(stack & queue)

01.假设以I和O分别表示入栈和出栈操作,栈的初态和终态为空,入栈和出栈可以表示成仅由I和O组成的序列,可操作的序列称为合法序列,否则称为非法序列.判定给定序列的合法性.

02.判断给定字符是否中心对称,如xyx,xyyx都是中心对称的

03.共享栈的实现:设有两个栈s1和s2都采用顺序栈方式,并共享一个存储区[0, Maxsize-1],为了尽量利用空间,减少溢出的可能,可采用栈顶相向,迎面增长的存储方式.试设计入栈、出栈操作.

04.希望循环队列中的元素都能够得到利用,则需要设置一个标志域tag,并以tag的值为0或1来区分头指针和尾指针相同时的队列状态是"空"还是"满",试编写此结构的入队和出队算法

05.Q是一个队列,S是一个空栈,实现将队列中的元素逆置的算法

06.用两个栈来模拟实现一个队列

07.[2019统考真题]请设计一个队列,要求满足:(1).初始化时队列为空;(2).入队时,允许增加队列占有的空间;(3).出队后,出对元素所占的空间可重复使用;(4).入队操作和出队操作的时间复杂度始终保持为O(1)

08.假设一个算术表达式中包含圆括号、方括号和花括号三种类型的括号(半角),编写一个算法来判别表达式中的括号是否匹配,以字符'\0'作为算术表达式的结束符.

09.火车调度站的入口处有n节硬座和软座车厢(分别用H和S表示),H和S是混杂在一起的,试着编写算法,输出对n节车厢进行调度的操作(即入栈或出栈操作),使得所有的软座车厢都被调度到硬座车厢之前.

10.利用一个栈实现以下递归函数的非递归计算


if n = 0:

Pn(x) = 1

if n = 1:

Pn(x) = 2x

if n > 1:

Pn(x) = 2xPn-1(x) - 2(n-1)Pn-2(x)

11.某汽车轮渡口,过江渡船每次能载10辆车过江.过江车辆分为客车类和货车类,上渡船有如下规定:同类车先到先上船;客车先于火车上船,且每上4辆客车,才允许放上1辆货车;若等待客车不足4辆,则以货车代替;若无货车等待,允许客车都上船.设计一个算法模拟渡口管理.

operatingSystem

进程(线程)同步问题(Process synchronization problems)

设自行车生产线上有一个箱子,其中有N个位置(N>=3),每个位置可存放一个车架或一个车轮,又设有三名工人:工人1:加工一个车架,车架放在箱中;工人2:加工一个车轮,车轮放在箱中;工人3:箱中取一个车架、箱中取两个个车轮,组装为一台车,实现这三个工人的工作.

面包店有很多面包,由n名销售人员推销,每名顾客进店后取一个号,并且等待叫号,当一名销售人员空闲时,就叫下一个号.试设计一个使推销人员和顾客同步的算法.

[2011统考真题].某银行提供1个服务窗口和10个供顾客等待的座位.顾客到达银行的时候若有空座位,则到取号机上领取一个号,等待叫号.取号机每次允许一位顾客使用.当营业员空闲的时候,通过叫号选取一个顾客,并为其服务.请实现其同步与互斥.

理发店有一位理发师、一把理发椅和n把供等候理发的顾客坐的椅子.若没有顾客,理发师便在理发椅上睡觉,一位顾客到来时,顾客必须叫醒理发师,若理发师正在理发时又有顾客来到,若有空椅子可坐,则坐下来等待,否则就离开.试用pv操作实现并说明信号量的定义和初值.

南开大学和天津大学之间有一条弯曲的路,每次只允许一辆自行车通过,但中间有笑的安全岛M(同时允许两辆车通过),可供已进入两端的两辆小车错车,请实现其同步与互斥.

三个合作进程,都需要从同一个设备输入各自的数据a、b、c,该输入设备需要互斥使用,而且第一个数据必须由P1进程读取,第二个数据必须由P2进程读取,第三个数据必须由P3进程读取.然后三个进程分别进行下面的计算:P1: x = a + b;P2: y = a * b; P3: z = y + c - a;最后,P1进程通过所连接的打印机将计算结果x,y,z的值打印出来.

有n(n≥3)名哲学家围坐在一张圆桌边,每名哲学家交替地就餐和思考.在圆桌中心有m(m≥1)个碗,每两名哲学家之间有一根筷子.每名哲学家必须取到一个碗和两侧的筷子之后,才能就餐,就餐完毕,将碗和筷子放回原位,并继续思考.为使得尽可能多的哲学家同时就餐,且防止出现死锁现象,请用信号量实现同步和互斥.

设公共汽车上驾驶员和售票员的活动分别为--驾驶员:启动车辆、正常行车、到站停车;售票员:关车门、售票、开车门.在汽车不断地到站、停车、行驶的过程中,试用pv操作调节二者的同步关系.

在一个仓库中可以存放A和B两种产品,要求:1.每次只能存入一种产品;2.A产品数量-B产品数量 < M;3.B产品数量-A产品数量 < N其中M、N为正整数,试描述A、B入库过程

寺庙中有若干小和尚和老和尚,有一个水缸,由小和尚提水入缸供老和尚饮用,水缸可以容纳10桶水,水取自同一井中.水井径窄,每次只能容一个桶取水.水桶的总数为3个,每次入缸取水仅为1桶水,且不可以同时进行.

[2013统考真题].某博物馆最多可以容纳500人同时参观,有一个出入口,该出入口仅允许通过一个人,参观者活动为:进门、参观、出门.请实现其同步和互斥.

某工厂有两个生产车间和一个装配车间,两个生产车间分别生产A,B两种零件,装配车间的任务是把A、B两种零件组装成产品.两个生产车间每生产一个零件后,都要分别把它们送到装配车间的货架F1、F2上.F1存放零件A,F2存放零件B,F1和F2的容量均为10.装配工人每次从货架上取一个零件A和一个零件B之后组装成产品,请用P,V操作进行正确管理.

设P、Q、R共享一个缓冲区,P、Q构成一对生产者-消费者,R即位生产者又为消费者.使用PV操作实现同步.

[2014统考真题].系统中有多个生产者进程和多个消费者进程,共享一个能存放1000件产品的环形缓冲区(初始为空).缓冲区未满时,生产者进程可以进入其生产的一件产品,否则等待;缓冲区未空时,消费者进程可以从缓冲区取走一件产品,否则等待.要求一个消费者进程从缓冲区取出10件产品后,其他消费者进程才可以取产品.请实现其同步和互斥.

[2009统考真题].三个进程P1、P2、P3互斥使用一个包含N个单元的缓冲区,每次用produce()生成一个正整数并用put()送入缓冲区某一个空单元;P2每次用getodd()从缓冲区取出一个奇数并用countodd()统计奇数个数;P3每次用geteven()从该缓冲区取出一个偶数并用counteven()统计偶数个数.请实现其同步与互斥.

存在一座桥,桥上的车流方向由南到北或者由北到南:(1) 假设桥上每次只允许一辆车行驶,试用信号灯的pv操作实现交通管理;(2) 假设桥上不允许两车交会,但允许同方向多俩车一次通过,试用信号灯的pv操作实现交通管理

[2020统考真题].现有5个操作A、B、C、D、E,操作C必须在A和B完成之后执行,操作E必须在C和D完成之后执行,请用PV操作实现操作间的同步.

[2017统考真题].某进程中有3个并发执行的线程thread1,thread2和thread3.请添加必要的信号量和PV操作,要求确保线程互斥访问临界资源,并且最大限度地并发执行.

假设一个录像厅有1、2、3三种不同的录像片可由观众选择放映,录像厅的放映规则如下:1.任意时刻,最多只能放映一种录像片,正在放映的录像片是自动循环放映的,最后一名观众主动离开时结束当前录像片的放映2.选择当前正在放映的录像片的观众可以立即进入,允许同时多位选择同一种录像片的观众同时观看,同时观看的观众数量不限3.等待观看其他录像片的观众按照到达顺序排队,当一种新的录像片开始放映时,所有等待观看该录像片的观众可依次进入录像厅同时观看.用一个进程(这里用线程)代表一个观众.用pv操作来实现.