Skip to content

@EmilHernvall /vector.c
Created

Embed URL

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Simple vector-implementation in C
#include <stdio.h>
#include <stdlib.h>
#include "vector.h"
void vector_init(vector *v)
{
v->data = NULL;
v->size = 0;
v->count = 0;
}
int vector_count(vector *v)
{
return v->count;
}
void vector_add(vector *v, void *e)
{
if (v->size == 0) {
v->size = 10;
v->data = malloc(sizeof(void*) * v->size);
memset(v->data, '\0', sizeof(void) * v->size);
}
// condition to increase v->data:
// last slot exhausted
if (v->size == v->count) {
v->size *= 2;
v->data = realloc(v->data, sizeof(void*) * v->size);
}
v->data[v->count] = e;
v->count++;
}
void vector_set(vector *v, int index, void *e)
{
if (index >= v->count) {
return;
}
v->data[index] = e;
}
void *vector_get(vector *v, int index)
{
if (index >= v->count) {
return;
}
return v->data[index];
}
void vector_delete(vector *v, int index)
{
if (index >= v->count) {
return;
}
v->data[index] = NULL;
int i, j;
void **newarr = (void**)malloc(sizeof(void*) * v->count * 2);
for (i = 0, j = 0; i < v->count; i++) {
if (v->data[i] != NULL) {
newarr[j] = v->data[i];
j++;
}
}
free(v->data);
v->data = newarr;
v->count--;
}
void vector_free(vector *v)
{
free(v->data);
}
int main(void)
{
vector v;
vector_init(&v);
vector_add(&v, "emil");
vector_add(&v, "hannes");
vector_add(&v, "lydia");
vector_add(&v, "olle");
vector_add(&v, "erik");
int i;
printf("first round:\n");
for (i = 0; i < vector_count(&v); i++) {
printf("%s\n", vector_get(&v, i));
}
vector_delete(&v, 1);
vector_delete(&v, 3);
printf("second round:\n");
for (i = 0; i < vector_count(&v); i++) {
printf("%s\n", vector_get(&v, i));
}
vector_free(&v);
return 0;
}
#ifndef VECTOR_H__
#define VECTOR_H__
typedef struct vector_ {
void** data;
int size;
int count;
} vector;
void vector_init(vector*);
int vector_count(vector*);
void vector_add(vector*, void*);
void vector_set(vector*, int, void*);
void *vector_get(vector*, int);
void vector_delete(vector*, int);
void vector_free(vector*);
#endif
@sshtmc

Do you have a license in mind for this gist? Can we assume it's an MIT license?

@bart113

There is a bug in vector_delete. The v->size should be updated after new array is allocated (because it has different size than the old one). This leads to memory leaks and/or segfaults.

@cli248

for vector_add, is it should be "memset(v->data, '\0', sizeof(void *) * v->size)", not sizeof(void)

@darelf

vector_delete doesn't have to reallocate a new memory block. Especially if you aren't changing the size of the array and are only allowing one item to be deleted at a time, then just start at the index that you are going to delete and shift everything down one, setting the last index to NULL.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Something went wrong with that request. Please try again.