import random as rnd def ll_insert(head, name, phone): new_node = {'name': name, 'phone': phone, 'next': None} if head is None: return new_node current = head while current is not None: if current['name'] == name: current['phone'] = phone return head if current['next'] is None: break current = current['next'] current['next'] = new_node return head def ll_find(head, name): current = head while current is not None: if current['name'] == name: return current['phone'] current = current['next'] return None def ll_delete(head, name): if head is None: return None if head['name'] == name: return head['next'] current = head while current['next'] is not None: if current['next']['name'] == name: current['next'] = current['next']['next'] return head current = current['next'] return head def sort_records(lst): n = len(lst) for i in range(n): for j in range(0, n-i-1): if lst[j][0] > lst[j + 1][0]: lst[j], lst[j + 1] = lst[j + 1], lst[j] return lst def ll_list_all(head): record = [] current = head while current is not None: record += [(current['name'], current['phone'])] current = current['next'] res = sort_records(record) return res def def_hash(name, size): hash_value = 0 for char in name: hash_value += ord(char) final_idx = hash_value % size return final_idx def ht_insert(buckets, name, phone): size = len(buckets) idx = def_hash(name, size) ll_insert(buckets[idx], name, phone) def ht_find(buckets, name): size = len(buckets) idx = def_hash(name, size) return ll_find(buckets[idx], name) def ht_delete(buckets, name): size = len(buckets) idx = def_hash(name, size) buckets[idx] = ll_delete(buckets[idx], name) def ht_list_all(buckets): res = [] for head in buckets: current = head while current is not None: res += [(current['name'], current['phone'])] current = current['next'] return sort_records(res)