Implementing Vector - C Programming Tutorial

In this c programming tutorial we are going to see code for implementing vector in c language or creating array of size N (Any size array) in language. So let's proceed, in this c programming tutorial we're just going to create a dynamically sized array of integers. Here's what the definition of a vector interface might look like:
// vector.h
#define VECTOR_INITIAL_CAPACITY 100
// Define a vector type
typedef struct {
  int size;      // slots used so far
  int capacity;  // total available slots
  int *data;     // array of integers we're storing
} Vector;
void vector_init(Vector *vector);
void vector_append(Vector *vector, int value);
int vector_get(Vector *vector, int index);
void vector_set(Vector *vector, int index, int value);
void vector_double_capacity_if_full(Vector *vector);
void vector_free(Vector *vector);
Note that we are writing this code in header file and we will be calling it vector.h

Implementing Vector

Below is the code for implementation of the interface we defined (vector.h) above. We will be naming this code as vector.c
// vector.c
#include <stdio.h>
#include <stdlib.h>
#include "vector.h"
void vector_init(Vector *vector) {
  // initialize size and capacity
  vector->size = 0;
  vector->capacity = VECTOR_INITIAL_CAPACITY;
  // allocate memory for vector->data
  vector->data = malloc(sizeof(int) * vector->capacity);
}
void vector_append(Vector *vector, int value) {
  // make sure there's room to expand into
  vector_double_capacity_if_full(vector);
  // append the value and increment vector->size
  vector->data[vector->size++] = value;
}
int vector_get(Vector *vector, int index) {
  if (index >= vector->size || index < 0) {
    printf("Index %d out of bounds for vector of size %d\n", index, vector->size);
    exit(1);
  }
  return vector->data[index];
}
void vector_set(Vector *vector, int index, int value) {
  // zero fill the vector up to the desired index
  while (index >= vector->size) {
    vector_append(vector, 0);
  }
  // set the value at the desired index
  vector->data[index] = value;
}
void vector_double_capacity_if_full(Vector *vector) {
  if (vector->size >= vector->capacity) {
    // double vector->capacity and resize the allocated memory accordingly
    vector->capacity *= 2;
    vector->data = realloc(vector->data, sizeof(int) * vector->capacity);
  }
}
void vector_free(Vector *vector) {
  free(vector->data);
}
What we did here is simply allocated memory using malloc() function. The size of the memory allocated will be the simply the size of the vector we want, multiplied by the size of type of the vector we are going to create. Here we are creating Vector for storing integer values, so the size of memory would be "sizeof(int) * vector->capacity". Note that if you want create vector for storing values with some other data type, then simply change the data type of the "* data" in structure we have defined to required one and that's it.

 

Using our Vector

In this usage example, we keep things simple and just pass around the pointer to a variable called vector allocated on the stack, we will be naming this file as vector-usage.c
// vector-usage.c
#include <stdio.h>
#include "vector.h"
int main() {
  // declare and initialize a new vector
  Vector vector;
  vector_init(&vector);
  // fill it up with 150 arbitrary values
  // this should expand capacity up to 200
  int i;
  for (i = 200; i > -50; i--) {
    vector_append(&vector, i);
  }
  // set a value at an arbitrary index
  // this will expand and zero-fill the vector to fit
  vector_set(&vector, 4452, 21312984);
  // print out an arbitrary value in the vector
  printf("Heres the value at 27: %d\n", vector_get(&vector, 27));
  // we're all done playing with our vector,
  // so free its underlying data array
  vector_free(&vector);
}

 

Comments

Popular posts from this blog

MATLAB code for Circular Convolution using Matrix method

Positive number pipe in angular 2+