Turning Learners Into Developers
Codekilla
CODEKILLA
// projects.data-structures-c

10 Best Data Structures with C Projects

Hand-picked and ordered easiest → hardest — each with complete code and expected output. Build these to turn lessons into a portfolio.

Back to Data Structures with C course
// solution.code
c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// Dynamic Array structure
typedef struct {
    int *data;      // Pointer to array elements
    int size;       // Current number of elements
    int capacity;   // Current allocated capacity
} DynamicArray;

// Initialize dynamic array with initial capacity
DynamicArray* createArray(int initial_capacity) {
    DynamicArray *arr = (DynamicArray*)malloc(sizeof(DynamicArray));
    arr->data = (int*)malloc(initial_capacity * sizeof(int));
    arr->size = 0;
    arr->capacity = initial_capacity;
    return arr;
}

// Add element with automatic resizing (grow)
void push(DynamicArray *arr, int value) {
    if (arr->size == arr->capacity) {
        arr->capacity *= 2;  // Double capacity
        arr->data = (int*)realloc(arr->data, arr->capacity * sizeof(int));
        printf("Resized up to capacity: %d\n", arr->capacity);
    }
    arr->data[arr->size++] = value;
}

// Remove last element with automatic shrinking
int pop(DynamicArray *arr) {
    if (arr->size == 0) return -1;
    int value = arr->data[--arr->size];
    // Shrink if size is 1/4 of capacity to avoid thrashing
    if (arr->size > 0 && arr->size == arr->capacity / 4) {
        arr->capacity /= 2;
        arr->data = (int*)realloc(arr->data, arr->capacity * sizeof(int));
        printf("Resized down to capacity: %d\n", arr->capacity);
    }
    return value;
}

void printArray(DynamicArray *arr) {
    printf("Array [size=%d, capacity=%d]: ", arr->size, arr->capacity);
    for (int i = 0; i < arr->size; i++) printf("%d ", arr->data[i]);
    printf("\n");
}

int main() {
    DynamicArray *arr = createArray(2);
    
    // Test growing
    for (int i = 1; i <= 10; i++) push(arr, i * 10);
    printArray(arr);
    
    // Test shrinking
    for (int i = 0; i < 7; i++) pop(arr);
    printArray(arr);
    
    free(arr->data);
    free(arr);
    return 0;
}
output
Resized up to capacity: 4
Resized up to capacity: 8
Resized up to capacity: 16
Array [size=10, capacity=16]: 10 20 30 40 50 60 70 80 90 100 
Resized down to capacity: 8
Resized down to capacity: 4
Array [size=3, capacity=4]: 10 20 30