Skip to content
80 changes: 52 additions & 28 deletions arrays/arrays.c
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,13 @@
#include <string.h>
#include <errno.h>

typedef struct Array {
int capacity; // How many elements can this array hold?
int count; // How many states does the array currently hold?
char **elements; // The string elements contained in the array
typedef struct Array
{
int capacity; // How many elements can this array hold?
int count; // How many states does the array currently hold?
char **elements; // The string elements contained in the array
} Array;


/************************************
*
* CREATE, DESTROY, RESIZE FUNCTIONS
Expand All @@ -19,32 +19,45 @@ typedef struct Array {
/*****
* Allocate memory for a new array
*****/
Array *create_array (int capacity) {
Array *create_array(int capacity)
{
// Allocate memory for the Array struct
Array *newArray = malloc(sizeof(Array));

// Set initial values for capacity and count

newArray->capacity = capacity;
newArray->count = 0;
// Allocate memory for elements
newArray->elements = calloc(capacity, sizeof(char *));
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice use of calloc instead of malloc here.


return newArray;
}


/*****
* Free memory for an array and all of its stored elements
*****/
void destroy_array(Array *arr) {
void destroy_array(Array *arr)
{

// Free all elements
if (arr->elements != NULL)
{
free(arr->elements);
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think you'll want to loop over each element and free them one by one.


// Free array

if (arr != NULL)
{
free(arr);
}
}

/*****
* Create a new elements array with double capacity and copy elements
* from old to new
*****/
void resize_array(Array *arr) {
void resize_array(Array *arr)
{

// Create a new element storage with double capacity

Expand All @@ -53,11 +66,8 @@ void resize_array(Array *arr) {
// Free the old elements array (but NOT the strings they point to)

// Update the elements and capacity to new values

}



/************************************
*
* ARRAY FUNCTIONS
Expand All @@ -69,18 +79,24 @@ void resize_array(Array *arr) {
*
* Throw an error if the index is out of range.
*****/
char *arr_read(Array *arr, int index) {
char *arr_read(Array *arr, int index)
{

// Throw an error if the index is greater than the current count

if (index > arr->count)
{
fprintf(stderr, "Index, out of range");
exit(1);
}
// Otherwise, return the element at the given index
return arr->elements[index]
}


/*****
* Insert an element to the array at the given index
*****/
void arr_insert(Array *arr, char *element, int index) {
void arr_insert(Array *arr, char *element, int index)
{

// Throw an error if the index is greater than the current count

Expand All @@ -91,21 +107,28 @@ void arr_insert(Array *arr, char *element, int index) {
// Copy the element and add it to the array

// Increment count by 1

}

/*****
* Append an element to the end of the array
*****/
void arr_append(Array *arr, char *element) {
void arr_append(Array *arr, char *element)
{

// Resize the array if the number of elements is over capacity
// or throw an error if resize isn't implemented yet.
if (arr->count >= arr->capacity)
{
// resize_array(arr);
fprintf(stderr, "Index, out of range");
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Very nice error message. 👍

exit(0)
}

// Copy the element and add it to the end of the array
arr->elements[arr->count] = element;

// Increment count by 1

arr->count++;
}

/*****
Expand All @@ -114,33 +137,34 @@ void arr_append(Array *arr, char *element) {
*
* Throw an error if the value is not found.
*****/
void arr_remove(Array *arr, char *element) {
void arr_remove(Array *arr, char *element)
{

// Search for the first occurence of the element and remove it.
// Don't forget to free its memory!

// Shift over every element after the removed element to the left one position

// Decrement count by 1

}


/*****
* Utility function to print an array.
*****/
void arr_print(Array *arr) {
void arr_print(Array *arr)
{
printf("[");
for (int i = 0 ; i < arr->count ; i++) {
for (int i = 0; i < arr->count; i++)
{
printf("%s", arr->elements[i]);
if (i != arr->count - 1) {
if (i != arr->count - 1)
{
printf(",");
}
}
printf("]\n");
}


#ifndef TESTING
int main(void)
{
Expand Down