The first basic data-structure everybody should learn is the singly linked list.

In a singly linked list you save your data in nodes, a combination of data and a pointer to the next node. To add nodes you simply allocate them and rewire the pointers, such that it appears in the right spot in the list.

To remove an element you have to rewire the previous and next node, such that their pointers point to each other, and then free the memory.

The idea behind this data-structures is, that you can add and remove elements easily from the end, front and middle of the list. And because you just allocate more memory, the list can grow dynamically.

The problem is to get to the elements. Because they are allocated on the heap the elements are all over the place and can only be found via the pointers. So, when you want to get to the middle, you have to traverse the linked list.

Another downside of singly linked list is, that you can't go backwards. That is were the doubly linked list comes in, but more on that later.

The last disadvantage is, when you want to process lot's of data in a short amount of time, you are often limited by cache misses. And linked list in general are terrible for that kind of work, because most elements aren't in the same cache line.

Your task will be to implement the functions for add, insert_after, remove and get. It is often helpful to draw the operations you want to do on paper or look at some pictures.