You could allocate a single novel struct containing
the structure of interest and any number of list elements that will contain it in a single malloc().
If the lists don’t need to know about each other, each novel struct could be different.
This would work, but it’s a bit exotic, so I’m not recommending it. But it addresses the locality and multiple allocation issues.