Я реализую общий двусвязный список в C, и я написал функции для прямого и обратного обхода. В рамках этих функций я хотел бы распечатать данные, содержащиеся в списке, но поскольку это общий характер, мне трудно понять, как это можно сделать. Очевидно, я не могу просто printf
использовать %d
или что-то, потому что список может содержать любой тип данных. Любые предложения, чтобы подойти к этому по-другому, были бы оценены, потому что я думал об этом в течение довольно долгого времени, и я в недоумении. Благодаря!Элементы печати связанного списка, содержащие void *
ответ
Вы можете многое сделать.
Например, вы можете хранить структуры, которые не только содержат данные void *
, но также указывают на возможный тип данных или даже строку формата, необходимую для объекта printf
.
Вы также можете подумать о структуре, содержащей void *
, к вашим данным и указателю функции, который позволит вам преобразовать ваши данные в строку. Это в основном минимально эмулирует полиморфизм C++ в C.
EDIT: Как указал wickstopher, вы просто не получаете безопасность типа компиляции. Разгрузите указатель на функцию, и у вас будет неподходящая функция, работающая с вашими данными, что может привести к тому, что ваша программа будет segfault, запустите вашего котенка, сжечь вашу квартиру, убежать с вашим младшим ребенком или дымовой трещиной на вашей кухне.
Спасибо.Мне нравится ваше второе предложение, но разве я не столкнулся бы с той же проблемой при написании функции, которая преобразует и неизвестный тип данных в строку? Я не знаю, как это сделать. – user2901181
вы должны написать функцию для каждого типа данных, которую вы планируете добавить в свой список, а затем использовать указатель на функцию, добавляя элементы в свой список. –
Вам необходимо указать поле тега в объявлении struct
. Определить enum
для типов данных, как
enum {INT_TYPE, FLOAT_TYPE, DOUBLE_TYPE, CHAR_TYPE} type;
Для каждого типа данных необходимо назначить type
с соответствующей константой перечисления. В функции печати вам нужно будет проверить значение type
, а затем использовать соответствующий спецификатор.
C не поддерживает проверку типов во время выполнения, поэтому это невозможно. См. runtime determine type for C (аналогичный вопрос).
Если вы хотите поддерживать ограниченный диапазон типов данных, вы можете подумать о добавлении перечисления в структуру узла, но это не даст вам настоящих общих функций и не будет применяться во время компиляции.
Если предположить, что узел имеет void *
указатель на узел содержимого, среди указателей для ссылки на следующие и предыдущие элементы в списке, обеспечить функцию для печати узла, такие как
void PrintNode (Node_t *node, void (*fprint)(void *));
Эта функция получит элементы узла, а затем вызвать функцию, предоставленную пользователем, чтобы фактически распечатать содержимое узла.
typedef struct stNode {
void *NodeContents;
struct stNode *prev;
struct stNode *next;
} Node_t;
void PrintNode (Node_t *node, void (*print)(void *))
{
if (node && node->NodeContents && print)
print(node->NodeContents);
}
- 1. Элементы связанного списка исчезли?
- 2. краха после печати связанного списка
- 3. Структура связанного списка печати C
- 4. подкачка элементы внутри связанного списка
- 5. Элементы печати из списка
- 6. Различные функции для печати связанного списка
- 7. Ошибка печати связанного списка. Что не так?
- 8. Реализация ToString для печати содержимого связанного списка
- 9. Как распечатать элементы связанного списка?
- 10. Каков наиболее эффективный способ печати связанного списка?
- 11. Ошибка сегментации при печати связанного списка
- 12. Ошибка сегментации при печати связанного списка
- 13. Элементы печати списка в C
- 14. Удалить те же элементы из связанного списка
- 15. Как добавить элементы в конец связанного списка
- 16. Функция связанного списка?
- 17. Удалите повторяющиеся элементы из отсортированного связанного списка
- 18. Как правильно напечатать элементы связанного списка
- 19. Segfault при печати связанного списка после удаления стека
- 20. C++ Ошибка сегментации при попытке печати строки узла связанного списка
- 21. Перегрузка C++ [] для печати n-го элемента связанного списка
- 22. Деструктор связанного списка
- 23. Программа вылетает при печати связанного списка на экране
- 24. Почему эта функция связанного списка печати не работает?
- 25. Элементы списка печати с пониманием (python)
- 26. Элементы списка печати на новой строке
- 27. Элементы печати из списка указателей классов C++
- 28. Реализация связанного списка (java)
- 29. Распечатайте раздел связанного списка
- 30. java - итерирование связанного списка
Если вы не говорите о * очень * современных расширениях C, в C нет никаких дженериков; Прочтите определение тега (щелкните по тегу «generics») и решите, хотите ли вы сохранить тег. –
@ MarcusMüller Извините, что я имел в виду, что данные передаются в список с помощью указателей void. – user2901181
Функция обратного вызова, переданная (как указатель) в качестве аргумента функции перехвата списка? – wildplasser