Кажется, тут термин "обобщенный" не относится к языку. Просто по примеру сделать такой же список, но для любых данных.
Например, вот такой элемент списка:
struct List
{
struct List * next;
struct List * prev;
void * data;
int dataType;
};
способен хранить данные любого типа (в зависимости от dataType, указатель data будет интерпретироваться по-разному)