mirror of
https://github.com/TheAlgorithms/C
synced 2024-11-25 06:49:36 +03:00
feat: add a vector implementation in data structures (#977)
* added a vector implementation in data structures * changed a comment * made the required changes * added tests
This commit is contained in:
parent
25f3b63d5b
commit
154bcdb935
168
data_structures/vector.c
Normal file
168
data_structures/vector.c
Normal file
@ -0,0 +1,168 @@
|
|||||||
|
/**
|
||||||
|
* @file
|
||||||
|
* @brief This is a vector implemenation in C. A vector is an expandable array.
|
||||||
|
* @details This vector implementation in C comes with some wrapper functions that lets the user work with data without having to worrying about memory.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h> /// for IO operations
|
||||||
|
#include <stdlib.h> /// for malloc() and free()
|
||||||
|
#include <assert.h> /// for testing using assert()
|
||||||
|
|
||||||
|
/** This is the struct that defines the vector. */
|
||||||
|
typedef struct {
|
||||||
|
int len; ///< contains the length of the vector
|
||||||
|
int current; ///< holds the current item
|
||||||
|
int* contents; ///< the internal array itself
|
||||||
|
} Vector;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This function initilaizes the vector and gives it a size of 1
|
||||||
|
* and initializes the first index to 0.
|
||||||
|
* @params Vector* (a pointer to the Vector struct)
|
||||||
|
* @params int (the actual data to be passed to the vector)
|
||||||
|
* @returns none
|
||||||
|
*/
|
||||||
|
void init(Vector* vec, int val) {
|
||||||
|
vec->contents = (int*)malloc(sizeof(int));
|
||||||
|
vec->contents[0] = val;
|
||||||
|
vec->current = 0;
|
||||||
|
vec->len = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This function clears the heap memory allocated by the Vector.
|
||||||
|
* @params Vector* (a pointer to the Vector struct)
|
||||||
|
* @returns: none
|
||||||
|
*/
|
||||||
|
void delete(Vector* vec) {
|
||||||
|
free(vec->contents);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This function clears the contents of the Vector.
|
||||||
|
* @params Vector* (a pointer to the Vector struct)
|
||||||
|
* @returns: none
|
||||||
|
*/
|
||||||
|
void clear(Vector* vec) {
|
||||||
|
delete(vec);
|
||||||
|
init(vec, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This function returns the length the Vector.
|
||||||
|
* @params Vector* (a pointer to the Vector struct)
|
||||||
|
* @returns: int
|
||||||
|
*/
|
||||||
|
int len(Vector* vec) {
|
||||||
|
return vec->len;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This function pushes a value to the end of the Vector.
|
||||||
|
* @params Vector* (a pointer to the Vector struct)
|
||||||
|
* @params int (the value to be pushed)
|
||||||
|
* @returns: none
|
||||||
|
*/
|
||||||
|
void push(Vector* vec, int val) {
|
||||||
|
vec->contents = realloc(vec->contents, (sizeof(int) * (vec->len + 1)));
|
||||||
|
vec->contents[vec->len] = val;
|
||||||
|
vec->len++;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This function get the item at the specified index of the Vector.
|
||||||
|
* @params Vector* (a pointer to the Vector struct)
|
||||||
|
* @params int (the index to get value from)
|
||||||
|
* @returns: int
|
||||||
|
*/
|
||||||
|
int get(Vector* vec, int index) {
|
||||||
|
if(index < vec->len) {
|
||||||
|
return vec->contents[index];
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This function sets an item at the specified index of the Vector.
|
||||||
|
* @params Vector* (a pointer to the Vector struct)
|
||||||
|
* @params int (the index to set value at)
|
||||||
|
* @returns: none
|
||||||
|
*/
|
||||||
|
void set(Vector* vec, int index, int val) {
|
||||||
|
if(index < vec->len) {
|
||||||
|
vec->contents[index] = val;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This function gets the next item from the Vector each time it's called.
|
||||||
|
* @params Vector* (a pointer to the Vector struct)
|
||||||
|
* @returns: int
|
||||||
|
*/
|
||||||
|
int next(Vector* vec) {
|
||||||
|
if(vec->current == vec->len) {
|
||||||
|
vec->current = 0;
|
||||||
|
}
|
||||||
|
int current_val = vec->contents[vec->current];
|
||||||
|
vec->current++;
|
||||||
|
return current_val;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This function returns the pointer to the begining of the Vector.
|
||||||
|
* @params Vector* (a pointer to the Vector struct)
|
||||||
|
* @returns: void*
|
||||||
|
*/
|
||||||
|
void* begin(Vector* vec) {
|
||||||
|
return (void*)vec->contents;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This function prints the entire Vector as a list.
|
||||||
|
* @params Vector* (a pointer to the Vector struct)
|
||||||
|
* @returns: none
|
||||||
|
*/
|
||||||
|
void print(Vector* vec) {
|
||||||
|
int size = vec->len;
|
||||||
|
printf("[ ");
|
||||||
|
for(int count = 0; count < size; count++) {
|
||||||
|
printf("%d ", vec->contents[count]);
|
||||||
|
}
|
||||||
|
printf("]\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This function tests the functions used to work with Vectors.
|
||||||
|
* @returns: none
|
||||||
|
*/
|
||||||
|
static void test() {
|
||||||
|
Vector vec;
|
||||||
|
init(&vec, 10);
|
||||||
|
assert(get(&vec, 0) == 10);
|
||||||
|
push(&vec, 20);
|
||||||
|
assert(get(&vec, 1) == 20);
|
||||||
|
set(&vec, 0, 11);
|
||||||
|
assert(get(&vec, 0) == 11);
|
||||||
|
assert(next(&vec) == 11);
|
||||||
|
set(&vec, 1, 22);
|
||||||
|
assert(get(&vec, 1) == 22);
|
||||||
|
assert(len(&vec) == 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Main function
|
||||||
|
* @returns 0 on exit
|
||||||
|
*/
|
||||||
|
int main() {
|
||||||
|
test();
|
||||||
|
|
||||||
|
Vector vec;
|
||||||
|
init(&vec, 10);
|
||||||
|
push(&vec, 20);
|
||||||
|
print(&vec);
|
||||||
|
set(&vec, 0, 11);
|
||||||
|
set(&vec, 1, 22);
|
||||||
|
print(&vec);
|
||||||
|
printf("Length: %d\n", len(&vec));
|
||||||
|
return 0;
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user