设计一个简单的学生信息管理系统,每个学生的信息包括学号、姓名、性别、班级和电话等,以姓名为关键字,自选哈希函数,分别以线性探测法和链地址法处理冲突创建哈希表,并实现查找已知姓名学生的电话功能。
时间: 2024-04-18 09:26:10 浏览: 96
下面是一个简单的学生信息管理系统的Java实现,使用了哈希表来存储学生信息,并通过姓名作为关键字进行查找。其中包括了线性探测法和链地址法两种处理冲突的方式。
```java
import java.util.LinkedList;
// 学生信息类
class Student {
int id;
String name;
String gender;
String className;
String phone;
public Student(int id, String name, String gender, String className, String phone) {
this.id = id;
this.name = name;
this.gender = gender;
this.className = className;
this.phone = phone;
}
}
// 学生信息管理系统类
public class StudentInfoManagementSystem {
private int capacity; // 哈希表容量
private LinkedList<Student>[] linearProbingHashTable; // 线性探测法哈希表
private LinkedList<Student>[] chainingHashTable; // 链地址法哈希表
public StudentInfoManagementSystem(int capacity) {
this.capacity = capacity;
this.linearProbingHashTable = new LinkedList[capacity];
this.chainingHashTable = new LinkedList[capacity];
}
// 哈希函数
private int hash(String key) {
int hash = 0;
for (int i = 0; i < key.length(); i++) {
hash += key.charAt(i);
}
return hash % capacity;
}
// 线性探测法插入元素
public void insertLinearProbing(Student student) {
int index = hash(student.name);
// 线性探测找到下一个可用位置
while (linearProbingHashTable[index] != null) {
index = (index + 1) % capacity;
}
// 插入元素
linearProbingHashTable[index] = new LinkedList<>();
linearProbingHashTable[index].add(student);
}
// 链地址法插入元素
public void insertChaining(Student student) {
int index = hash(student.name);
// 在链表中查找是否已存在相同姓名的学生
if (chainingHashTable[index] != null) {
for (Student existingStudent : chainingHashTable[index]) {
if (existingStudent.name.equals(student.name)) {
// 学生已存在,更新信息
existingStudent.id = student.id;
existingStudent.gender = student.gender;
existingStudent.className = student.className;
existingStudent.phone = student.phone;
return;
}
}
} else {
chainingHashTable[index] = new LinkedList<>();
}
// 未找到相同姓名的学生,插入新的学生信息
chainingHashTable[index].add(student);
}
// 查找学生电话(线性探测法)
public String findPhoneNumberLinearProbing(String name) {
int index = hash(name);
// 线性探测查找学生信息
while (linearProbingHashTable[index] != null) {
for (Student student : linearProbingHashTable[index]) {
if (student.name.equals(name)) {
return student.phone;
}
}
index = (index + 1) % capacity;
}
return null; // 未找到学生信息
}
// 查找学生电话(链地址法)
public String findPhoneNumberChaining(String name) {
int index = hash(name);
// 在链表中查找学生信息
if (chainingHashTable[index] != null) {
for (Student student : chainingHashTable[index]) {
if (student.name.equals(name)) {
return student.phone;
}
}
}
return null; // 未找到学生信息
}
public static void main(String[] args) {
// 创建学生信息管理系统实例
StudentInfoManagementSystem system = new StudentInfoManagementSystem(100);
// 添加学生信息
system.insertLinearProbing(new Student(1, "Alice", "Female", "Class A", "1234567890"));
system.insertLinearProbing(new Student(2, "Bob", "Male", "Class B", "9876543210"));
system.insertLinearProbing(new Student(3, "Cathy", "Female", "Class C", "1111111111"));
// 查找学生电话
String alicePhone = system.findPhoneNumberLinearProbing("Alice");
System.out.println("Alice's phone number: " + alicePhone);
String bobPhone = system.findPhoneNumberLinearProbing("Bob");
System.out.println("Bob's phone number: " + bobPhone);
String cathyPhone = system.findPhoneNumberLinearProbing("Cathy");
System.out.println("Cathy's phone number: " + cathyPhone);
}
}
```
这个简单的学生信息管理系统使用了哈希表来存储学生信息,并提供了线性探测法和链地址法两种处理冲突的方式。你可以根据需要修改和扩展这个实现。
阅读全文