题目
问题描述: 某公司为发展生产向社会公开招聘m个工种的工作人员,每个工种各有不同的编号(0,1,2,…,m-1)和计划招聘人数,参加招聘的人数有n个(编号为0,1,2,…,n-1)。每位应聘者可以申报两个工种,并参加公司组织的考试。公司将按应聘者的成绩,从高到低的顺序排队录取。公司的录取原则是:从高分到低分依次对每位应聘者按其第一志愿录取;当不能按第一志愿录取时,便将他的成绩扣去5分后,重新排队,并按其志愿考虑录取。
功能要求: 要求程序输出每个工种录用者的信息(编号和成绩),以及落选者的信息(编号和成绩)。
设计思路: 程序为每个工种保留一个录取者的有序队列。录取处理循环直至招聘额满,或已对全部应聘者都做了录用处理。
在这里,假设招聘的工种数为m=3,分别是工种0,工种1和工种2;而应聘者的序号是由系统自动从0开始排序的
代码
应聘者属性:
package keshe.entity;
/**
* @ClassName 应聘者
* @Description DOTO
* @Author 作者
* @Date 2021/12/15 4:16
* @Version 1.0
**/
public class Applicant {
public int id; //编号
public double grade; //成绩
public int first; //第一工种
public int second; //第二工种
public Applicant () {}//无参构造函数
public Applicant(int id, double grade, int first, int second) {//带参构造函数
this.id = id;
this.grade = grade;
this.first = first;
this.second = second;
}
}
接口:
package keshe.service;
import keshe.entity.Applicant;
public interface ILinked {//接口
//尾插法创建链表
void addLast(Applicant applicant);
//打印单链表
void display(Node head);
//归并排序
public Node sortNode (Node head);
//删除节点--按照应聘者的序号进行删除
public void remove(int id);
}
节点类:
package keshe.service;
import keshe.entity.Applicant;
/**
* @ClassName 节点类
* @Description DOTO
* @Author 作者
* @Date 2021/12/15 4:18
* @Version 1.0
**/
public class Node {
public Node next; //指针域
public Applicant applicant; //数据域--员工对象
public Node (Applicant applicant) {
this.applicant = applicant;
}
}
链表类:
package keshe.service;
import keshe.entity.Applicant;
/**
* @ClassName 实现类--链表类
* @Description DOTO
* @Author 作者
* @Date 2021/12/15 4:20
* @Version 1.0
**/
public class SingleListed implements ILinked{
public Node head; //创建头结点
@Override
//创建链表
public void addLast(Applicant applicant) { //尾插法创建链表
Node node = new Node(applicant); //创建一个实体对象
Node cur = this.head; //尾结点指向头结点
//如果是第一次插入,直接到尾结点
if(this.head == null) {
this.head = node;
} else {
//找尾巴
while(cur.next != null) {
cur = cur.next;
}
//推出上面的循环,cur所执行的位置就是尾结点
cur.next = node;
}
}
@Override
//打印
public void display(Node head) {
Node p = head;
while (p != null) {
System.out.println("该应聘者的序号为:" + p.applicant.id);
System.out.println("该应聘者的成绩为:" + p.applicant.grade);
System.out.println();
p = p.next;
}
System.out.println();
}
@Override
//排序
public Node sortNode(Node head) {
//采用归并排序
if (head == null || head.next == null) {
return head;
}
//获取中间节点
Node mid = getMid(head);
Node right = mid.next;
mid.next = null;