// 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
