Да, но есть некоторые предостережения, связанные с разыменованием вашего пустого указателя для доступа к данным внутри.
По сути, скажем, у вас есть узел:
Node *node;
И у вас есть некоторая структура Point:
typedef struct Point {
int x;
int y;
} Point;
И вы помещаете точку в узел:
Point *p = malloc(sizeof(Point));
p->x = 0;
p->y = 3;
node->data = p;
Чтобы получить доступ к членам этой точки, вы должны использовать тип:
printf("%d\n", ((Point *)node->data)->x);
Или вы можете назначить указатель правильного типа и скопировать указатель void:
Point *p = node->data;
printf("%d\n", p->x);
Потому что это не сработает:
printf("%d\n", node->data->x);
Это потому, что указатель voidне содержит информации о типах для компилятора, чтобы понять, на что указывает указатель void.
И это почти все, что вам нужно знать о том, как использовать указатели void.