# 2009s チェイン法 class Node: """構造体 Node に相当""" def __init__(self, key, data, nextNode=None): self.key = key self.data = data self.nextNode = nextNode # ハッシュ表(配列)の初期化。大きさ7で、初期値は null (None) table = [None] * 7 def hashValue(key): """ハッシュ関数:7で割った余り""" return key % 7 def search(key): """【設問2】探索関数""" hash_idx = hashValue(key) node = table[hash_idx] while node is not None: if node.key == key: # 【ア】 return node.data # 探索成功 node = node.nextNode # 【イ】後続ノードに着目 return None # 【ウ】探索失敗 def addNode(key, data): """【設問3】追加関数""" hash_idx = hashValue(key) node = table[hash_idx] # 既に登録済みかチェック while node is not None: if node.key == key: # 【ア】と同じ return False # 登録済み node = node.nextNode # 【イ】と同じ # 新しいノードを生成して「先頭」に追加 # 【エ】new Node(key, data, node) tempNode = Node(key, data, table[hash_idx]) # 【オ】配列の指し先を新しいノードに更新 table[hash_idx] = tempNode return True # --- 動作確認 --- addNode(16, "DataA") # 16 % 7 = 2 addNode(37, "DataB") # 37 % 7 = 2 (衝突!2番目に追加) addNode(23, "DataC") # 23 % 7 = 2 (衝突!3番目に追加) print(search(23)) # "DataC" が表示される print(search(99)) # None が表示される