Если вы исходите из объектно-ориентированного фона (как показывают сигнатуры вашего метода).
Объектно-ориентированная идея -> хороший способ сделать это в C
Создание объекта -> malloc структура, а затем передать ее в функцию инициализации
struct queue* q = (struct queue*)malloc(sizeof(struct queue));
queue_initialize(q);
если хотите, можете обернуть это в функцию, например так:
struct queue* queue_construct() {
struct queue* q = (struct queue*)malloc(sizeof(struct queue));
queue_initialize(q);
return q;
}
Обратите внимание, что эти указатели не должны указывать на void *, пусть C выполнит хотя бы некоторую проверку типов для вас.
Реализуйте метод -> создайте функцию, которая получает указатель структуры на структуру "почти эта".
struct user* user = ... whatever we do here ...;
queue_add(q, (void*)user);
Что касается того, как на самом деле реализовать очередь, я предлагаю хорошую книгу о структурах данных или алгоритмах, поскольку есть много способов сделать это; и конкретные методы, которые вы выберете, будут по-разному влиять на производительность и надежность. Нет лучшего способа, он сильно зависит от того, как будет использоваться очередь, и какие аспекты производительности более важны.
Книга, которую я рекомендую: Введение в алгоритмы . Эта книга излишня для большинства ситуаций, с очень подробными списками почти всех основных структур данных, с которыми вы, вероятно, столкнетесь в первые несколько лет программирования. Как таковой, он делает отличную ссылку, несмотря на его попытку нейтрального подхода, который теперь выглядит странно по сравнению с обычными языками программирования.
Как только вы поймете, что происходит, вы можете сделать это практически на любом языке.