Generic Linked List
Learn to implement a generic linked list.
We'll cover the following
Introduction
Linked lists are one of the best examples of why void
pointers are useful.
Recall that our previous implementation of linked lists assumes that the values are integers.
typedef struct SList
{
int value;
struct SList* next;
} TList;
However, we may want a linked list of float
values or even strings. What would be the solution? Defining multiple structures like TListInteger
, TListFloat
, and TListString
isn’t ideal. We’d have to implement the list functions three times, once for each structure. They would be almost identical, with the only exception being the list’s type or perhaps how they handle the value
field.
Generic linked lists
The solution is to change the value
field from a value to a pointer. Then, we can turn this pointer into a void*
by making it accept any data type.
typedef struct SGenericList
{
void* value;
struct SGenericList* next;
} TGenericList;
Of course, there are also disadvantages. One of them is that the code becomes slightly harder to write and manage since not only do we have to allocate the next
field, but we’ll also have to allocate (and free) space for the value
field.
Note: Since C is not object-oriented, we don’t have other choices. We must use a
void*
and manually manage its memory.
Everything else except the management of the value
field remains the same for the linked lists with a concrete type as value
.
Notice the following memory drawing. The node itself no longer contains the value. It contains a pointer to a memory block that holds the value.
Get hands-on with 1400+ tech skills courses.