def insert_at(data, size, index, value):
"""Insert value at position index, shifting later elements right.
Precondition: 0 <= index <= size < len(data) (there is room).
Postcondition: data[index] == value; the elements that were in
data[index..size-1] are now in data[index+1..size];
returns the new size, size + 1.
"""
assert 0 <= index <= size < len(data), "bad index or array full"
for i in range(size, index, -1): # right to left!
data[i] = data[i - 1]
data[index] = value
return size + 1
def delete_at(data, size, index):
"""Remove the element at index, shifting later elements left.
Precondition: 0 <= index < size.
Postcondition: the elements that were in data[index+1..size-1] are
now in data[index..size-2]; returns the new size, size - 1.
"""
assert 0 <= index < size, "bad index"
for i in range(index, size - 1): # left to right
data[i] = data[i + 1]
data[size - 1] = None # tidy the unused slot
return size - 1
data = [None] * 8
size = 0
for name in ["Ana", "Ben", "Cai", "Dev"]:
size = insert_at(data, size, size, name) # insert at the end
print(data[:size])
size = insert_at(data, size, 1, "Zoe")
print(data[:size], size)
size = delete_at(data, size, 1)
print(data[:size], size)
print(data)