Skip to content

Instantly share code, notes, and snippets.

@mfurquimdev
Last active August 29, 2015 14:04
Show Gist options
  • Save mfurquimdev/f1cf9585852a753dfbcc to your computer and use it in GitHub Desktop.
Save mfurquimdev/f1cf9585852a753dfbcc to your computer and use it in GitHub Desktop.
A vector implemented in c
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#include <limits.h>
typedef struct Vector_t
{
unsigned int* data;
unsigned int current_size;
unsigned int total_length;
}vector_t;
void vector_init(vector_t*, unsigned int);
void vector_print(vector_t*);
void vector_free(vector_t*);
void vector_populate(vector_t*);
void vector_insert(vector_t*, unsigned int);
unsigned int vector_remove(vector_t*);
unsigned int vector_empty(vector_t*);
int main (void)
{
vector_t vector;
vector_init (&vector,5);
vector_populate (&vector);
printf("%u removed\n", vector_remove(&vector));
printf("%u removed\n", vector_remove(&vector));
printf("%u removed\n", vector_remove(&vector));
printf("%u removed\n", vector_remove(&vector));
printf("%u removed\n", vector_remove(&vector));
printf("%u removed\n", vector_remove(&vector));
vector_print (&vector);
vector_free (&vector);
return EXIT_SUCCESS;
}
unsigned int vector_empty(vector_t* vector)
{
return vector->current_size == 0;
}
unsigned int vector_remove (vector_t* vector)
{
unsigned int data;
unsigned int i;
assert (vector != NULL);
if (vector->current_size <= 0)
{
printf("Trying to remove element in an empty vector\n");
return UINT_MAX;
}
data = vector->data[0];
for (i = 1; i < vector->current_size; ++i)
vector->data[i-1] = vector->data[i];
vector->current_size --;
return data;
}
void vector_insert (vector_t* vector, unsigned int data)
{
assert (vector != NULL);
char errStr [44];
vector->data[vector->current_size] = data;
vector->current_size++;
if (vector->current_size > vector->total_length)
{
vector->total_length *= 2;
vector->data = (unsigned int*) realloc (vector->data, sizeof(unsigned int) * vector->total_length);
if (vector->data == NULL)
{
sprintf (errStr, "realloc failure in vector_insert(vector*,%d):", data);
perror(errStr);
exit (EXIT_FAILURE);
}
}
return ;
}
void vector_populate (vector_t* vector)
{
assert (vector != NULL);
printf("Populating vector\n");
vector_insert(vector,4);
vector_insert(vector,3);
vector_insert(vector,2);
vector_insert(vector,1);
vector_insert(vector,0);
return ;
}
void vector_init (vector_t* vector, unsigned int length)
{
assert (vector != NULL);
char errStr [44];
vector->total_length = length;
vector->current_size = 0;
vector->data = (unsigned int*) malloc (sizeof(unsigned int)*vector->total_length);
if (vector->data == NULL)
{
sprintf (errStr, "malloc failure in vector_init(vector*,%d):", length);
perror(errStr);
exit (EXIT_FAILURE);
}
return ;
}
void vector_print (vector_t* vector)
{
assert (vector != NULL);
unsigned int i;
for (i = 0; i < vector->current_size; ++i)
printf("(%2d) %u\n",i ,vector->data[i]);
return ;
}
void vector_free (vector_t* vector)
{
assert (vector != NULL);
if (vector->data != NULL)
free (vector->data);
return ;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment