more work on the array list implementation
This commit is contained in:
parent
3644c63f43
commit
b63d729b87
|
@ -26,11 +26,33 @@ void array_append(i32_ArrayList* s, int v) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// insert value at index
|
// create an array list and fill in with values from array
|
||||||
void array_insert_at(i32_ArrayList* arr, int index, int32_t value) {
|
i32_ArrayList* new_arraylist_from_array(int cap, int* arr) {
|
||||||
for (int i = index; i > arr->index; i--) {
|
i32_ArrayList* out = new_arraylist(cap);
|
||||||
arr->data[i] = arr->data[i - 1];
|
for (int i = 0; i < cap; i++) {
|
||||||
|
array_append(out, arr[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return (out);
|
||||||
|
}
|
||||||
|
|
||||||
|
// insert value at index
|
||||||
|
// the strategy here is to start from the last element in the array and shift it to the right
|
||||||
|
// gotta be careful and check that the index + 1 <= capacity otherwise we are in trouble
|
||||||
|
void array_insert_at(i32_ArrayList* arr, int at_index, int32_t value) {
|
||||||
|
if (at_index == arr->index) {
|
||||||
|
array_append(arr, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (at_index + 1 > arr->capacity) {
|
||||||
|
printf("ERROR: this insert is not possible since the shift required would be over the capacity of the array\n");
|
||||||
|
printf("You requested insert at %d but array capacity is set to %d\n", at_index, arr->capacity);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = arr->index; i >= at_index; i--) {
|
||||||
|
arr->data[i + 1] = arr->data[i];
|
||||||
|
}
|
||||||
|
arr->data[at_index] = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t array_get_at(i32_ArrayList* arr, int index) {
|
int32_t array_get_at(i32_ArrayList* arr, int index) {
|
||||||
|
@ -57,11 +79,16 @@ void print_array_list(i32_ArrayList* arr) {
|
||||||
for (int i = 0; i < arr->index; i++) {
|
for (int i = 0; i < arr->index; i++) {
|
||||||
printf(" %d ", arr->data[i]);
|
printf(" %d ", arr->data[i]);
|
||||||
}
|
}
|
||||||
printf("]\n");
|
printf("]\t<capacity: %d; index: %d>\n", arr->capacity, arr->index);
|
||||||
}
|
}
|
||||||
|
|
||||||
int main() {
|
int main() {
|
||||||
i32_ArrayList* a = new_arraylist(5);
|
i32_ArrayList* a = new_arraylist(5);
|
||||||
|
int arr_values[5] = {1, 2, 3, 4, 5};
|
||||||
|
i32_ArrayList* b = new_arraylist_from_array(5, arr_values);
|
||||||
|
print_array_list(b);
|
||||||
|
|
||||||
|
// these should all work just fine
|
||||||
array_append(a, 10);
|
array_append(a, 10);
|
||||||
print_array_list(a);
|
print_array_list(a);
|
||||||
array_append(a, 11);
|
array_append(a, 11);
|
||||||
|
@ -72,11 +99,40 @@ int main() {
|
||||||
print_array_list(a);
|
print_array_list(a);
|
||||||
array_append(a, 14);
|
array_append(a, 14);
|
||||||
print_array_list(a);
|
print_array_list(a);
|
||||||
|
|
||||||
|
// this one will error
|
||||||
|
array_append(a, 100);
|
||||||
|
|
||||||
|
// so we remove one and then add
|
||||||
pop_from_array(a);
|
pop_from_array(a);
|
||||||
print_array_list(a);
|
print_array_list(a);
|
||||||
array_append(a, 15);
|
array_append(a, 100);
|
||||||
print_array_list(a);
|
print_array_list(a);
|
||||||
|
|
||||||
|
// now we test inserting different index
|
||||||
array_insert_at(a, 3, 55);
|
array_insert_at(a, 3, 55);
|
||||||
print_array_list(a);
|
print_array_list(a);
|
||||||
printf("%d\n", array_get_at(a, 3));
|
array_insert_at(a, 4, 555);
|
||||||
}
|
print_array_list(a);
|
||||||
|
|
||||||
|
// what happens if try to insert at the last element
|
||||||
|
// this first implementation of the araylist will just overwrite this value
|
||||||
|
array_insert_at(a, 4, 100);
|
||||||
|
print_array_list(a);
|
||||||
|
|
||||||
|
// what if insert at 3 in this first version?
|
||||||
|
// this will shift the current 3 to 4, but this causes the 100 to be removed
|
||||||
|
array_insert_at(a, 3, 123);
|
||||||
|
print_array_list(a);
|
||||||
|
|
||||||
|
// array_append(a, 14);
|
||||||
|
// print_array_list(a);
|
||||||
|
// pop_from_array(a);
|
||||||
|
// print_array_list(a);
|
||||||
|
// array_insert_at(a, 5, 90000);
|
||||||
|
// print_array_list(a);
|
||||||
|
// array_insert_at(a, 3, 1000);
|
||||||
|
// array_insert_at(a, 4, 1000);
|
||||||
|
// array_insert_at(a, 5, 10001);
|
||||||
|
// print_array_list(a);
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue