Ich habe das jetzt mal auf die Schnelle mit einer LinkedList implementiert.

Grundidee ist, dass man eine maximale Länge für einen Namen vorgibt und dann entsprechend Speicher reserviert: Anzahl der Namen * Maximale Länge pro Name

Die LinkedList speichert als Datenelement einen Zeicher auf einen char.
Jetzt liest man einen Namen in den reservierten Speicher ein, fügt die Adresse von dem Namen in die LinkedList ein und liest den nächsten Namen dort ein, wo der andere aufgehört hat.
Im Speicher sieht das also so aus:
Name1\x00Name2\x00Name3\x00...
Dabei gibt es so viele LinkedLists, wie Gruppen -- jede LinkedList stellt also eine Gruppe dar.
Die Einträge der LinkedLists zeigen dabei dann auf die Namen im Speicher.

Code:
#1182907 - Pastie