I use home-made linked lists like that in my tile engine to store all objects that are on the same tile on the map. As an object moves from one tile to the other, it is removed from the list of the tile it left, and added to the list of the tile it moves to.
These lists are then used in collision detection. Suppose the player is on a given tile; in order to check for collisions with enemies you now only have to check the linked lists of enemies in that tile and the adjacent tiles (assuming no object is bigger than one tile), which is much better than checking for collisions with all enemies!
These lists can also be used for more efficient z-order drawing, drawing first the top row of tiles and the objects on those tiles, then the next row etc. All in all I can really recommend this way of doing a tile engine. There's of course a little bit of extra work involved in calls to functions for handling the lists, but, with things like collision detection, or for instance AI where the enemy has to look for nearby enemies, the amount of time saved is bigger as you avoid the quadratic aspect of checking everything with everything.
These lists are then used in collision detection. Suppose the player is on a given tile; in order to check for collisions with enemies you now only have to check the linked lists of enemies in that tile and the adjacent tiles (assuming no object is bigger than one tile), which is much better than checking for collisions with all enemies!
These lists can also be used for more efficient z-order drawing, drawing first the top row of tiles and the objects on those tiles, then the next row etc. All in all I can really recommend this way of doing a tile engine. There's of course a little bit of extra work involved in calls to functions for handling the lists, but, with things like collision detection, or for instance AI where the enemy has to look for nearby enemies, the amount of time saved is bigger as you avoid the quadratic aspect of checking everything with everything.