Почему не использовать такой вариант
## Код:
```
TYPE 
      ListItem = POINTER TO RECORD
         next: ListItem
      END;

   PROCEDURE AddToList (VAR head: ListItem; List: ListItem);
   BEGIN
      elem.next := head;
                head := elem;      
   END AddToList;
```

и не наследовать свои типы от ListItem?