mirror of
https://github.com/TheAlgorithms/C
synced 2024-11-21 13:01:34 +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