


- # 哈希表
- # 员工信息
- class Emp:
- id: int = 0
- name: str = ''
- next = None
-
- def __init__(self, id, name):
- self.id = id
- self.name = name
-
- def __str__(self):
- return f"id={self.id}, name={self.name}"
-
-
- class EmpLinkedList:
- # 头指针,指向第一个 Emp,即链表的head指向的是第一个数据节点
- head: Emp = None
-
- # 添加员工到链表
- # 此处假设输入的员工ID是递增的
- def add(self, emp: Emp):
- if self.head is None:
- self.head = emp
- return
- cur = self.head
- while cur.next is not None:
- cur = cur.next # 后移
- # 找到链表的最后位置,将新员工节点添加在链表最后
- cur.next = emp
-
- # 遍历链表
- def list(self):
- if self.head is None:
- print("当前链表为空")
- return
-
- cur = self.head
- while cur is not None:
- print(" => ", cur)
- cur = cur.next # 后移,继续遍历
-
- # 根据id查找员工信息
- def find_emp_by_id(self, id: int):
- if self.head is None:
- print("当前链表为空")
- return
- cur = self.head
- while cur is not None:
- if cur.id == id:
- break # 此时 cur 指向的节点就是要查找的员工
- cur = cur.next
-
- return cur
-
-
- class HashTab:
- def __init__(self, size):
- self.size = size
- self.emp_linkedlist = [EmpLinkedList() for i in range(size)]
-
- def add(self, emp: Emp):
- # 根据员工ID,得到该员工应当添加到表里的哪条链表
- linked_list_no = self.hash_func(emp.id)
- self.emp_linkedlist[linked_list_no].add(emp)
-
- # 根据id查找员工信息
- def find_emp_by_id(self, id: int):
- linked_list_no = self.hash_func(id)
- emp = self.emp_linkedlist[linked_list_no].find_emp_by_id(id)
- if emp:
- print("员工信息为:", emp)
- else:
- print(f"没有找到id为{id}的员工")
-
- # 遍历所有链表,即遍历哈希表中的所有链表
- def list(self):
- for i in range(self.size):
- print(f"第{i + 1}条链表员工信息:", end="")
- self.emp_linkedlist[i].list()
-
- # 散列函数,此处用最简单的取模法实现
- def hash_func(self, id):
- return id % self.size
-
-
- def hash_test():
- hash_tab = HashTab(7)
- while True:
- select = None
- print("1. 添加员工信息")
- print("2. 输出全部员工信息")
- print("3. 根据id查找员工")
- print("4. 退出")
-
- select = int(input("请选择:"))
- if select == 1:
- id = int(input("请输入员工id:"))
- name = input("请输入员工姓名:")
- emp = Emp(id, name)
- hash_tab.add(emp)
- elif select == 2:
- hash_tab.list()
- elif select == 3:
- id = int(input("请输入员工id:"))
- hash_tab.find_emp_by_id(id)
- elif select == 4:
- break
- else:
- print("输入错误,没有该选项,请重新选择")
-
-
- hash_test()