Way back at the start of this chapter, I mentioned arrays and their problems. Well, combining an array with a linked list could be useful - but remember, the array is limited by the fact that you have to pre-define the number of entries.
Bearing this in mind, you could allocate an array of, say 1000 entries of 4 bytes each. Each entry in the array holds the address of an individual node, not the actual data stored there. Our address book system of 100 byte strings (not much of an address book I admit !) will now only need about 4Kb plus 102 bytes per used node - including the string length word for each entry. Using a plain array it would need almost 102Kb even for a blank address book.
Now you have compromised on memory needs as you don't allocate the space required to store your data until you need to, and you do allocate a much smaller amount to hold the 'contents table'. As you create new nodes, add their address to the array. You can still use the single or double linked lists if you wish, but there is no need. The array holds all the locations of each node in the order that they were created and you can navigate forwards, backwards and even access nodes at random using this method because the formula to find a given node is once more usable.
Have fun trying that out !