# [Gavin Lewis]
# P9 - Employee Hash Table
# The Hash Dictionary points to the first element of the Employee Linked List with its hash (0-
11)
class HashDictionary:
def __init__(self, hashLength):
self.beginChain = []
self.endChain = []
for n in range(hashLength):
self.beginChain.append(None)
self.endChain.append(None)
# Employee Linked List
class Employee:
def __init__(self, empID, empLastName, empFirstName, empPhone):
self.empID = empID
self.LastName = empLastName
self.FirstName = empFirstName
self.phone = empPhone
self.nextEmployee = None # corrected variable name
self.deleted = False # added deleted flag to mark deleted employees
def __str__(self): # added string representation for Employee
return "Employee ID: {}, Last Name: {}, First Name: {}, Phone: {}".format(
self.empID, self.LastName, self.FirstName, self.phone)
class EmployeeHashTable:
def __init__(self, hashLength):
self.hashDict = HashDictionary(hashLength)
def insertEmployee(self, empID, empLastName, empFirstName, empPhone):
position = empID % 12
currentNode = self.hashDict.beginChain[position]
prevNode = None
while currentNode is not None:
prevNode = currentNode
currentNode = currentNode.nextEmployee
emp = Employee(empID, empLastName, empFirstName, empPhone)
if prevNode is None:
self.hashDict.beginChain[position] = emp
else:
prevNode.nextEmployee = emp
print("Employee with ID {} added to database".format(emp.empID))
def searchEmployee(self, empID):
position = empID % 12
currentNode = self.hashDict.beginChain[position]
while currentNode is not None:
if currentNode.empID == empID and not currentNode.deleted: # check for deleted flag
print("Employee Found:\n", currentNode)
return currentNode
currentNode = currentNode.nextEmployee
print("Employee with ID {} not found".format(empID))
return None
def deleteEmployee(self, empID):
position = empID % 12
currentNode = self.hashDict.beginChain[position]
while currentNode is not None:
if currentNode.empID == empID and not currentNode.deleted: # check for deleted flag
currentNode.deleted = True
print("Employee with ID {} marked as deleted".format(empID))
return
currentNode = currentNode.nextEmployee
print("Employee with ID {} not found".format(empID))
def traverseChain(self, startEMP):
print("Employee Chain:")
print(" ", startEMP)
node = startEMP.nextEmployee
while node is not None:
print(" ", node)
node = node.nextEmployee
# main program
from random import randint
import csv
hashLength = 12
empList = []
file = open('EmployeeDB.csv')
csvreader = csv.reader(file)
header = next(csvreader)
for employee in csvreader:
empList.append(employee)
HD = HashDictionary(hashLength)
for empRecord in empList:
empID = int(empRecord[0])
empLastName = empRecord[1]
empFirstName = empRecord[2]
empPhone = empRecord[3]
EMP = Employee(empID, empLastName, empFirstName, empPhone)
HD.insertEmployee(EMP)
empIDin = input("Enter Employee ID (001-999, 0 to Exit): ")
empID = int(empIDin)
while (empID > 0 and empID < 1000):
oper = input("Enter Operation Type (S)earch, (I).
1. # [Gavin Lewis]
# P9 - Employee Hash Table
# The Hash Dictionary points to the first element of the Employee Linked List with its hash (0-
11)
class HashDictionary:
def __init__(self, hashLength):
self.beginChain = []
self.endChain = []
for n in range(hashLength):
self.beginChain.append(None)
self.endChain.append(None)
# Employee Linked List
class Employee:
def __init__(self, empID, empLastName, empFirstName, empPhone):
self.empID = empID
self.LastName = empLastName
self.FirstName = empFirstName
self.phone = empPhone
self.nextEmployee = None # corrected variable name
self.deleted = False # added deleted flag to mark deleted employees
def __str__(self): # added string representation for Employee
return "Employee ID: {}, Last Name: {}, First Name: {}, Phone: {}".format(
self.empID, self.LastName, self.FirstName, self.phone)
class EmployeeHashTable:
2. def __init__(self, hashLength):
self.hashDict = HashDictionary(hashLength)
def insertEmployee(self, empID, empLastName, empFirstName, empPhone):
position = empID % 12
currentNode = self.hashDict.beginChain[position]
prevNode = None
while currentNode is not None:
prevNode = currentNode
currentNode = currentNode.nextEmployee
emp = Employee(empID, empLastName, empFirstName, empPhone)
if prevNode is None:
self.hashDict.beginChain[position] = emp
else:
prevNode.nextEmployee = emp
print("Employee with ID {} added to database".format(emp.empID))
def searchEmployee(self, empID):
position = empID % 12
currentNode = self.hashDict.beginChain[position]
while currentNode is not None:
if currentNode.empID == empID and not currentNode.deleted: # check for deleted flag
print("Employee Found:n", currentNode)
return currentNode
currentNode = currentNode.nextEmployee
3. print("Employee with ID {} not found".format(empID))
return None
def deleteEmployee(self, empID):
position = empID % 12
currentNode = self.hashDict.beginChain[position]
while currentNode is not None:
if currentNode.empID == empID and not currentNode.deleted: # check for deleted flag
currentNode.deleted = True
print("Employee with ID {} marked as deleted".format(empID))
return
currentNode = currentNode.nextEmployee
print("Employee with ID {} not found".format(empID))
def traverseChain(self, startEMP):
print("Employee Chain:")
print(" ", startEMP)
node = startEMP.nextEmployee
while node is not None:
print(" ", node)
node = node.nextEmployee
# main program
from random import randint
import csv
hashLength = 12
4. empList = []
file = open('EmployeeDB.csv')
csvreader = csv.reader(file)
header = next(csvreader)
for employee in csvreader:
empList.append(employee)
HD = HashDictionary(hashLength)
for empRecord in empList:
empID = int(empRecord[0])
empLastName = empRecord[1]
empFirstName = empRecord[2]
empPhone = empRecord[3]
EMP = Employee(empID, empLastName, empFirstName, empPhone)
HD.insertEmployee(EMP)
empIDin = input("Enter Employee ID (001-999, 0 to Exit): ")
empID = int(empIDin)
while (empID > 0 and empID < 1000):
oper = input("Enter Operation Type (S)earch, (I)nsert, (D)elete: ")
if (oper == "S"):
E = HD.searchEmployee(empID)
if (E != None):
print(E.empID, E.FirstName, E.LastName, E.phone)
else:
5. print(empID, " Doesn't Exist")
elif (oper == "I"):
E = HD.searchEmployee(empID)
if (E != None):
print (empID, " Already Exists.", E.LastName, " Cannot Have Duplicates")
else:
fName = input("Enter Employee First Name: ")
lName = input("Enter Employee Last Name: ")
phoneNum = input("Enter Employee Phone Number: ")
EMP = Employee(empID, lName, fName, phoneNum)
HD.insertEmployee(EMP)
print (EMP.empID, EMP.LastName, " Record Inserted")
elif (oper == "D"):
E = HD.searchEmployee(empID)
if (E != None):
HD.deleteEmployee(empID, E)
print (E.empID, E.LastName, " Deleted")
else:
print(empID, " Not Found. Cannot Delete")
empIDin = input("Enter Employee ID (001-999, 0 to Exit): ")
empID = int(empIDin)
for n in range(hashLength):
print (n)