Easy to use, header only, macro generated, generic and type-safe Data Structures in C

Overview

C Macro Collections

C Macro Collections Logo

Easy to use, header only, macro generated, generic and type-safe Data Structures in C.

LinkToRepo Stars LinkToDocs

License Version travis-ci codecov test_suit

Table of Contents

Installation

No installation is required. The entire library is made of header files and can be directly included into your project.

Contributing

There is a lot to be done. You can check the TODO file in the root of the repository or the issues in the github page. Also, tests and documentation are in constant development. Also check out the STATUS file for the status on the development of the library.

Usage

The header macro_collections.h includes every feature from the library and comes with higher level APIs that help you generate collections from specific sub-libraries with specific extensions.

Below is a minimal example that makes use of some core functionalities. And a lot of explanation too!

// This is the master header. This will include every feature of the library.
// This comes with many helper macros (high level API) and utility functions.
#include "macro_collections.h"

// A PARAM is a standard way to pass required parameters to the lower level API.
// It is a tuple of form (PFX, SNAME, SIZE, K, V). In this case, not all of them
// are used, so we can leave them empty. We are creating a list of value int.
#define MY_LIST_PARAMS (intl, int_list, , , int)

// High level API. Generate a LIST from the CMC library with the STR extension
// using our previously defined PARAMs. Every collections has a CORE part that
// needs to be generated first. Then, we can add other parts after. This macro
// does all of that for us. The STR part will provide us with a function that
// will be used later.
C_MACRO_COLLECTIONS_EXTENDED(CMC, LIST, MY_LIST_PARAMS, (STR))

int main(void)
{
    // Our list type is defined by SNAME and all functions are prefixed by PFX
    // (PFX can also be thought as the function's namespace). Also, nodes,
    // entries, iterators and other structures are prefixed by SNAME. So PFX is
    // for functions and SNAME is for structs, where the main one is simply
    // 'struct SNAME'.
    // To initialize a list we need to pass in an initial capacity and something
    // that is called a function table for the V type.
    // This function table is a struct with methods that will extract some
    // (sometimes) necessary behaviour from your custom data type. Things like
    // hash, comparison and printing. A list doesn't require any of these
    // functions. That is, the CORE module doesn't use any of them.
    // But since we are using the STR module, we will need to define the 'str'
    // function. luckily, for the 'int' type, the library already provides such
    // function (cmc_i32_str), provided by the /utl/futils.h header file.
    struct int_list *list = intl_new(32, &(struct int_list_fval){ .str = cmc_i32_str, NULL });

    // Check if the list was successfully initialized. It could fail if the
    // initial capacity is too big or if 'struct int_list_fval *' is NULL,
    // because every data structure must have a valid function table.
    if (!list)
        return 1;

    // Add some items to the list. The CMC data structures are all dynamically
    // sized. So there can be as many items as you want as long as you have
    // enough memory.
    for (int i = 0; i < 100; i++)
    {
        // Try to add an element to the list. If it fails you can check what
        // caused it by getting its flag.
        if (!intl_push_back(list, i))
        {
            enum cmc_flags flag = intl_flag(list);
            // Use cmc_flags_to_str to map the enum error to a string.
            fprintf(stderr, "%s : push_back failed\n", cmc_flags_to_str[flag]);
        }
    }

    // Now we will use the STR module, the _print() function. This is where the
    // '.str' from the function table comes into play. If we haven't defined it,
    // the program would've crashed. We also need to define to which file we
    // will be printing the list's content. In this case, the terminal. Also,
    // some strings need to be defined. They will be printed: before all elements,
    // between each one, and after all elements. This is very usefull and can
    // print a data structure very nicely.
    intl_print(list, stdout, "[ ", ", ", " ]\n");

    // You should see a nicely printed list in your terminal.

    // Free all of its resources
    intl_free(list);
}

Now all you have to do is to compile the source code with -I /path/to/library/src. There is no required installation or pre-compilation.

Features

The C Macro Collections library is organized into many other sub-libraries. The following table is a quick overview.

Library Name Description
CMC Macro Collections The main library with dynamically-sized collections
COR Core Core functionalities used by more than one collection, usually from different sub-libraries
EXT Extensions Extension to collections from CMC, SAC and TSC libraries
INT Integrations Macros that facilitate the creation of code that involves more than one type of collection
SAC Statically Allocated Collections Collections with a fixed sized array that don't use any heap allocation
TSC Thread-Safe Collections Collections that allow multiple operations from multiple threads
UTL Utilities General utilities

Every macro that generates code for a certain collection can be found with the following template. Some exceptions exist as certain collections don't have or can't have some features. One big example is the UTL library, which does not follow this pattern.

macro_name := CMC_[ lib ]_[ collection ]_[ part ]_[ access ]_[ file ]

lib := CMC | COR | DEV | EXT | INT | SAC | TSC
collection := BITSET | DEQUE | HASHBIDIMAP | ... | TREEMULTISET | TREESET
part := CORE | ITER | INIT | ... | SETF | NODE
access := PUBLIC | PRIVATE
file := HEADER | SOURCE

Some collections might not be present in a certain lib. Check the documentation.

Every macro is suffixed by CMC and each section is separated by an underscore (_). The first section is the library (lib). The second is the collection name in all uppercase. Then the part (or which module) that you wish to generate. And last, if it is code that should belong to a header file or code that should belong to a source file.

Project Structure

  • benchmarks - Where all benchmarks are hosted
  • docs - A folder hosting the generated documentation by mdBook
  • documentation - The markdowns used by mdBook to generate the website
  • examples - Examples using the C Macro Collections Library
  • src - All headers part of the C Macro Collections Library
    • macro_collections.h - Master header containing all collections and utilities
  • tests - Where all tests are hosted

Available Collections

Check out the STATUS file at the root of the project for more information.

The following table is an overview of all the currently available or upcoming data structures:

Collection Abstract Data Type Data Structure Details
BitSet
bitset.h
Set Dynamic Array A set of bits that can be individually modified and queried, each identified by a bit index
Deque
deque.h
Double-Ended Queue Dynamic Circular Array A circular array that allows push and pop on both ends (only) at constant time
HashBidiMap
hashbidimap.h
Bidirectional Map Two Hashtables A bijection between two sets of unique keys and unique values K <-> V using two hashtables
HashMap
hashmap.h
Map Flat Hashtable A unique set of keys associated with a value K -> V with constant time look up using a hashtable with open addressing and robin hood hashing
HashMultiMap
hashmultimap.h
Multimap Hashtable A mapping of multiple keys with one node per key using a hashtable with separate chaining
HashMultiSet
hashmultiset.h
Multiset Flat Hashtable A mapping of a value and its multiplicity using a hashtable with open addressing and robin hood hashing
HashSet
hashset.h
Set Flat Hashtable A unique set of values with constant time look up using a hashtable with open addressing and robin hood hashing
Heap
heap.h
Priority Queue Dynamic Array A binary heap as a dynamic array as an implicit data structure
IntervalHeap
intervalheap.h
Double-Ended Priority Queue Custom Dynamic Array A dynamic array of nodes, each hosting one value from the MinHeap and one from the MaxHeap
LinkedList
linkedlist.h
List Doubly-Linked List A default doubly-linked list
List
list.h
List Dynamic Array A dynamic array with push and pop anywhere on the array
Queue
queue.h
FIFO Dynamic Circular Array A queue using a circular array with enqueue at the back index and dequeue at the front index
SkipList
WIP
Sorted List Skip List A sorted Linked List with average O(log n) search, insertion and deletion complexity
SortedList
sortedlist.h
Sorted List Sorted Dynamic Array A lazily sorted dynamic array that is sorted only when necessary
Stack
stack.h
FILO Dynamic Array A stack with push and pop at the end of a dynamic array
TreeBidiMap
WIP
Sorted Bidirectional Map Two AVL Trees A sorted bijection between two sets of unique keys and unique values K <-> V using two AVL trees
TreeMap
treemap.h
Sorted Map AVL Tree A unique set of keys associated with a value K -> V using an AVL tree with log(n) look up and sorted iteration
TreeMultiMap
WIP
Sorted Multimap AVL Tree A sorted mapping of multiple keys with one node per key using an AVL Tree of linked-lists
TreeMultiSet
WIP
Sorted Multiset AVL Tree A sorted mapping of a value and its multiplicity using an AVL tree
TreeSet
treeset.h
Sorted Set AVL Tree A unique set of keys using an AVL tree with log(n) look up and sorted iteration

Other Features

These are some features within the library that are implemented by all collections.

Two-way iterators

All collections come with a two-way iterator. You can go back and forwards in constant time and access elements in constant time.

Custom Allocation

All collections have a cmc_alloc_node which provides pointers to the four dynamic memory allocation functions in C: malloc, calloc, realloc and free. These pointers can be customized for each individual collection created or a default can be used, as specified in cmc_alloc_node_default.

Callbacks

Every function that operates on a collection can be separated in 5 different types. Create, Read, Update, Delete and (an extra one besides CRUD) Resize. You can define one callback function for each operation. Check out the documentation to see when each callback function is called.

Functions Table

Functions table is a struct of function pointers containing 'methods' for a custom data type. Some methods are optional and others are needed in order to a collection to operate. They are:

CMP

A comparator function is used in sorted collections or when an equality is being checked like when trying to find a certain element in a list. It is responsible for taking two arguments of the same data type and comparing them. The return value is an int with the following definitions:

  • Return 1 if the first argument is greater than the second;
  • Return 0 if the first argument equals the second;
  • Return -1 if the first argument is less than the second.

CPY

A copy function is used when a collection is being copied. It can be used to make a deep copy of of your custom data type. It must take a single parameter and return a new copy of that same data type. If this function is absent (NULL) the data type will be copied by assignment (for pointers this is a shallow copy).

STR

A string function is responsible for taking a FILE pointer and a custom data type and outputting the string representation of that data returning a bool indication success or failure. It is useful for debugging.

FREE

The free function is called when a collection is cleared (all elements removed) or freed (all elements removed and freed from memory) and it is responsible for completely freeing all resources that are usually acquired by your data type.

HASH

This function receives a custom data type as parameter and returns a size_t hash of that data. Used in hashtables.

PRI

A priority function works much like the comparator function except that it compares the priority between two elements. It is used in collections whose structure is based on the priority of elements and not in their general comparison.

  • Return 1 if the first argument has a greater priority than the second;
  • Return 0 if the first argument has the same priority as second;
  • Return -1 if the first argument has a lower priority than the second.

The following table shows which functions are required, optional or never used for each Collection:

Collection CMP CPY STR FREE HASH PRI
Deque #9f3b94 #9f3b94 #497edd #00d3eb #2ef625 #2ef625
HashMap #b82b28 #9f3b94 #497edd #00d3eb #b82b28 #2ef625
HashBidiMap #b82b28 #9f3b94 #497edd #00d3eb #b82b28 #2ef625
HashMultiMap #b82b28 #9f3b94 #497edd #00d3eb #b82b28 #2ef625
HashMultiSet #b82b28 #9f3b94 #497edd #00d3eb #b82b28 #2ef625
HashSet #b82b28 #9f3b94 #497edd #00d3eb #b82b28 #2ef625
Heap #9f3b94 #9f3b94 #497edd #00d3eb #2ef625 #b82b28
IntervalHeap #9f3b94 #9f3b94 #497edd #00d3eb #2ef625 #b82b28
List #9f3b94 #9f3b94 #497edd #00d3eb #2ef625 #2ef625
LinkedList #9f3b94 #9f3b94 #497edd #00d3eb #2ef625 #2ef625
Queue #9f3b94 #9f3b94 #497edd #00d3eb #2ef625 #2ef625
SortedList #b82b28 #9f3b94 #497edd #00d3eb #2ef625 #2ef625
Stack #9f3b94 #9f3b94 #497edd #00d3eb #2ef625 #2ef625
TreeMap #b82b28 #9f3b94 #497edd #00d3eb #2ef625 #2ef625
TreeSet #b82b28 #9f3b94 #497edd #00d3eb #2ef625 #2ef625
Color Label
#b82b28 Required for basic functionality.
#9f3b94 Required for specific functions.
#497edd Required for non-core specific functions.
#00d3eb Optional.
#2ef625 Not Used.

Design Decisions

Stack vs Heap Allocation

Currently all collections need to be allocated on the heap. Iterators have both options but it is encouraged to allocate them on the stack since they don't require dynamic memory.

Some collections overlap others in terms of functionality

Yes, you can use a Deque as a Queue or a List as a Stack without any major cost, but the idea is to have the least amount of code to fulfill the needs of a collection.

Take for example the Stack. It is simple, small and doesn't have many functions. If you generate a List to be used (only) as a Stack (which is one of the bulkiest collections) you'll end up with a lot of code generated and compiled for nothing.

The Deque versus Queue situation is a little less problematic, but again, you need to be careful when generating a lot of code as compilation times might go up to 15 seconds even with modern ultra-fast compilers.

Another example is using a HashMap/TreeMap as a HashSet/TreeSet (with a dummy value that is never used), but I just think that this is a bad thing to do and you would be wasting some memory. Also, the sets generate a lot of code related to set theory, whereas maps don't.

But what about the LinkedList ?

You can use them as Stacks, Queues and Deques, but with modern memory hierarchy models, array-based data structures have a significantly faster runtime due to caching, so I didn't bother to have specific implementations of those aforementioned collections.

You can't structurally modify a collection when iterating over it

Modifying a collection will possibly invalidate all iterators currently initialized by it. Currently, the only collection that allows this is the LinkedList (using the node-based functions, not the iterator).

What to use

(Outdated)

The following table shows how each collection is implemented and how well they do when using as common abstract data types.

  • Ideal - The collection implements correctly the abstract data type;
  • Not Ideal - The implementation is fulfilled but some functionalities are either not part of the ADT or not present;
  • Bad - It can be done, but its a bad idea.

DataStructuresDiagram

GoodColor AverageColor BadColor

Code Review

Check out some code reviews that covers some parts the project. Most of them were posted a long time ago and are probably outdated.

About Link
Unit Test ./utl/test.h Code Review
Interval Heap ./cmc/intervalheap.h Code Review
Hash Set ./cmc/hashset.h Code Review
Linked List ./cmc/linkedlist.h Code Review
Others Code Review
Comments
  • list.h -  a couple of issues

    list.h - a couple of issues

    Line 299, I think it should be memmove(list->buffer, list->buffer + 1, (list->count - 1) * sizeof(V));

    Line 311, I think it should be memmove(list->buffer + index, list->buffer + index + 1, (list->count - index - 1) * sizeof(V));

    I also suggest calling PFX##_pop_at(list, 0) inside PFX##_pop_front. Also, all of the pop functions should be calling deallocators

    will fix 
    opened by pfeatherstone 4
  • Define deallocator functions once in

    Define deallocator functions once in "new" functions

    Can I suggest we parse the deallocator to the "new" function and hold it in the container, thus avoiding having to parse it to every "pop", "remove" and "clear" function.

    enhancement 
    opened by pfeatherstone 3
  • Fix colour blocks in README

    Fix colour blocks in README

    placehold.it has an expired SSL certificate, so the coloured blocks weren't rendering correctly in the README. It seems to have been replaced by via.placeholder.com.

    opened by pxeger 1
  • Update Examples

    Update Examples

    • Updates examples so that they compile using the latest implementation of the CMC.
      • Closes #3
      • Only changes what is required to compile successfully.
    • Fix minor date typo in macro_collections.h.
    opened by TryExceptElse 1
  • Merge cmc and ext

    Merge cmc and ext

    At this point of the project if feels like the ext collections are growing quite big and the idea of having half of the collections in one folder and the other half in another is quite unnecessary. So eventually merge all collections into the cmc folder and leave dev and sac.

    opened by LeoVen 0
  • Many examples are outdated

    Many examples are outdated

    This library is constantly receiving new updates that are disruptive and I believe that by now all examples no longer compile. This will eventually be fixed but only when all collections have the functions in the scope defined by the TODO file and the unit tests are complete.

    opened by LeoVen 0
  • Overflow warnings in utl_futils.h

    Overflow warnings in utl_futils.h

    Overflow warnings in utl_futils.h

    Describe the bug

    Compiling the utl_futils.h header on a 32bit Cortex M0 ARM gives overflow warnings for hash math, since 64bit integer math is apparently not supported.

    How to Reproduce

    Steps to reproduce the behavior:

    1. Setup a cross-compiling environment for a ARM M0 Cortex (i.e Raspberry Pi Pico)
    2. compile the main example.c
    3. See the warnings

    Expected behavior

    Somehow this 64bit math should not be included in this case.

    Screenshots

    [build] [1/2  50% :: 0.097] Building C object console/CMakeFiles/console.dir/console.c.obj
    [build] /home/rafa/repos/own/pico/pico-lipophot4c/src/lib/C-Macro-Collections/include/c_macro_collections/utl_futils.h: In function 'cmc_str_hash_java':
    [build] /home/rafa/repos/own/pico/pico-lipophot4c/src/lib/C-Macro-Collections/include/c_macro_collections/utl_futils.h:413:28: warning: conversion from 'long long unsigned int' to 'size_t' {aka 'unsigned int'} changes value from '1125899906842597' to '4294967269' [-Woverflow]
    [build]   413 |     size_t hash = UINT64_C(1125899906842597); // prime
    [build]       |                            ^~~~~~~~~~~~~~~~
    [build] In file included from /home/rafa/repos/own/pico/pico-lipophot4c/src/console/console.c:16:
    [build] /home/rafa/repos/own/pico/pico-lipophot4c/src/lib/C-Macro-Collections/include/c_macro_collections/utl_futils.h: In function 'cmc_str_hash_murmur3':
    [build] /home/rafa/repos/own/pico/pico-lipophot4c/src/lib/C-Macro-Collections/include/c_macro_collections/utl_futils.h:428:13: warning: right shift count >= width of type [-Wshift-count-overflow]
    [build]   428 |     x ^= (x >> 33);
    [build]       |             ^~
    [build] /home/rafa/repos/own/pico/pico-lipophot4c/src/lib/C-Macro-Collections/include/c_macro_collections/utl_futils.h:430:13: warning: right shift count >= width of type [-Wshift-count-overflow]
    [build]   430 |     x ^= (x >> 33);
    [build]       |             ^~
    [build] /home/rafa/repos/own/pico/pico-lipophot4c/src/lib/C-Macro-Collections/include/c_macro_collections/utl_futils.h:432:13: warning: right shift count >= width of type [-Wshift-count-overflow]
    [build]   432 |     x ^= (x >> 33);
    [build]       |             ^~
    [build] /home/rafa/repos/own/pico/pico-lipophot4c/src/lib/C-Macro-Collections/include/c_macro_collections/utl_futils.h: In function 'cmc_str_hash_murmur3_variant':
    [build] /home/rafa/repos/own/pico/pico-lipophot4c/src/lib/C-Macro-Collections/include/c_macro_collections/utl_futils.h:447:13: warning: right shift count >= width of type [-Wshift-count-overflow]
    [build]   447 |     x ^= (x >> 33);
    [build]       |             ^~
    [build] /home/rafa/repos/own/pico/pico-lipophot4c/src/console/console.c: In function 'console_init':
    [build] /home/rafa/repos/own/pico/pico-lipophot4c/src/console/console.c:52:80: warning: initialization of '_Bool (*)(FILE *, int)' from incompatible pointer type '_Bool (*)(FILE *, int32_t)' {aka '_Bool (*)(FILE *, long int)'} [-Wincompatible-pointer-types]
    [build]    52 |     struct int_list *list = intl_new_custom(32, &(struct int_list_fval){.str = cmc_i32_str, NULL}, &custom_allocator, NULL);
    

    Please complete the following information:

    • Type: [e.g. src, tests, examples, benchmarks]
    • OS: linux, cross development for raspberry pi pico
    • Compiler GCC
    • Compiler Version 10.3.1 arm-none-eabi

    Additional context

    bug 
    opened by astrorafael 0
  • Include file with only macro collection declarations

    Include file with only macro collection declarations

    Feature Request Template

    What is the nature of this request?

    • Restructure the main library include file to selective include only what you need

    Is your feature request related to a problem? Please describe.

    Trying to use this library in a 32bit Cortex M0 microcontroller. Including macro_collections.h is overkill and gives compile error for stuff that I don't even need (multithreading, etc.)

    Describe the solution you'd like

    I have produced a simple header file - for instance, macro_defs.h - where only the global macros are defined. Then it is just a matter of including the needed header files in your code, like:

    #include "cmc_list.h" #include "ext_cmc_list.h" #include "utl_futils.h" #include "macro_defs.h"

    The existing macro_collections.h can include this file as the very last and we have the same functionality as before

    feature request 
    opened by astrorafael 2
  • Bitset implementation needs used_bits field

    Bitset implementation needs used_bits field

    Currently, bitset always uses a power of 2 size. If you want to only use 100 bits, all operations are based on 128 and might be incorrect. Operations on the last word must always be checked if all of its bits are being used.

    opened by LeoVen 0
  • HashBidiMap iterators

    HashBidiMap iterators

    HashBidiMap iterators are still not implemented properly. Currently you can only iterate over the keys. Decide whether:

    • [ ] One iterator containing both IterKey and IterVal
    • [ ] Separate iterators for IterKey and IterVal*

    See which approach is most compatible with CMC_FOREACH and have a similar look to the other iterators.

    opened by LeoVen 0
Owner
Leonardo Vencovsky
Computer Engineering Undergrad @ EEP
Leonardo Vencovsky
Functional, Type safe, Lazy abstractions for generic iterators in C

C-Iterplus Functional abstractions for working with iterators, as demonstrated in c-iterators. Finding the longest common prefix of an array of string

Chase 27 Oct 18, 2022
Eggs.Variant is a C++11/14/17 generic, type-safe, discriminated union.

Eggs.Variant Introduction Eggs.Variant is a C++11/14/17 generic, type-safe, discriminated union. See the documentation at http://eggs-cpp.github.io/va

null 138 Dec 3, 2022
Cross-platform STL-styled and STL-compatible library with implementing containers, ranges, iterators, type traits and other tools; actors system; type-safe config interface.

Yato A small repository where I'm gatherting useful snippets and abstractions for C++ development. Yato includes 3 main modules: multidimensional cont

Alexey 10 Dec 18, 2022
A collecton of generic reference counted data structures, tools to create compatible C style classes, and demo applications

The Offbrand library is a collection of reference counted generic data structures written in C for C. The library includes bash scripts to assist in t

Tyler Heck 82 Dec 10, 2022
A library of generic data structures.

Collections-C A library of generic data structures including a list, array, hashtable, deque etc.. Examples Building and Installing Using the library

Srđan Panić 2.5k Jan 8, 2023
Generic Data Structures In C

Generic Data Structures In C Objective: ability to use data structures with full functionality on any data type type safety is absolutely critical, ma

null 5 May 4, 2022
Step is a C++17, header-only library of STL-like algorithms and data structures

Step is a C++17, header-only library of STL-like algorithms and data structures. Installation git clone --depth 1 https://github.com/storm-ptr/step.gi

storm-ptr 3 Sep 1, 2022
Multi-Purpose Header-Only C Data Structures

USAGE These header files are meant to be a simple means of using datastructures in a C project. They are universally useable with any other C datatype

Andre Schneider 2 Jul 15, 2022
A library of type safe sets over fixed size collections of types or values, including methods for accessing, modifying, visiting and iterating over those.

cpp_enum_set A library of type safe sets over fixed size collections of types or values, including methods for accessing, modifying, visiting and iter

Carl Dehlin 22 Jun 16, 2022
Strong typedef - A class template that creates a new type that is distinct from the underlying type, but convertible to and from it

jss::strong_typedef <Tag, ValueType, Properties...> This is an implementation of a C++17 class template that provides a wrapper type that is convertib

Anthony Williams 101 Dec 21, 2022
ring-span lite - A C++yy-like ring_span type for C++98, C++11 and later in a single-file header-only library

ring-span lite: A circular buffer view for C++98 and later Contents Example usage In a nutshell Dependencies Installation Synopsis Reported to work wi

Martin Moene 127 Dec 28, 2022
Data Structures And Algorithms Made Easy

Data Structures And Algorithms Made Easy Copyright (c) August 28, 2016 CareerMonk Publications and others. E-Mail : [email protected] Last modificat

Narasimha Karumanchi 387 Nov 18, 2022
This project contains the carefully compiled easy to medium level Data Structures & Algorithm questions.

Engineering-Daze Hey everyone! ?? This project contains the carefully compiled easy to medium level Data Structures & Algorithm questions. Engineering

DSC-Banasthali 8 Apr 30, 2022
Typesafe, Generic & Fastest Set Data structure implementation in C

Typesafe & Fast as fuck Set in C Key Features Extremely fast non-cryptographic hash algorithm XXHash Complete Typesafe APIs Double Hashing to avoid bo

Robus Gauli 4 Sep 6, 2021
Repository of problems and solutions of labsheets used for Data Structures and Algorithms (CS F211) in Semester 2, 2020-21 at BITS Pilani - Hyderabad Campus.

CS F211 Data Structures and Algorithms (BITS Pilani - Hyderabad Campus) This repository contains the problems, solution approaches & explanations and

Rohit Dwivedula 27 Oct 31, 2022
Algo-Tree is a collection of Algorithms and data structures which are fundamentals to efficient code and good software design

Algo-Tree is a collection of Algorithms and data structures which are fundamentals to efficient code and good software design. Creating and designing excellent algorithms is required for being an exemplary programmer. It contains solutions in various languages such as C++, Python and Java.

DSC-Banasthali 53 Oct 4, 2022
Templates, algorithms and data structures implemented and collected for programming contests.

Templates, algorithms and data structures implemented and collected for programming contests.

Shahjalal Shohag 2k Jan 2, 2023
A reverse engineering tool to interactively reconstruct structures and generate header files

ReGenny ReGenny is a reverse engineering tool to interactively reconstruct structures and generate usable C++ header files. Header file generation is

null 91 Dec 28, 2022