Er zijn talloze geschikte datastructuren. Met een linked list kun je makkelijk queues en stacks implementeren en daarom worden ze in besturingssystemen veel gebruikt, maar er zijn meer opties; denk aan allerei boomstructuren, gesorteerde lijsten, hash tables, dynamische arrays enzovoorts.
Een dynamische array is naar mijn mening ongeveer net zo simpel als een linked list: je houdt simpelweg de grootte en de capaciteit van je datastructuur bij en alloceert om de zoveel tijd een groetere array:
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
| // Declaratie
typedef struct data {
int foo, bar;
} data_t; // type van de elementen in de array
struct array {
unsigned size, capacity;
data_t *elements;
} array;
// Initialisatie
array.size = 0;
array.capacity = 16; // willekeurige zinnige waarde
array.elements = (data_t*)mallloc(array.capacity * sizeof(data_t));
void add_element(data_t *data)
{
if(array.size == array.capacity) {
array.capacity *= 2;
array.elements = (data_t*)realloc(array.capacity * sizeof(data_t));
}
array.elements[array.size] = *data;
++array.size;
} |
Andere operaties worden op vergelijkbare wijze geimplementeerd. Een dynamische array heeft een aantal voordelen ten opzichte van linked lists:
• array.elements is een array, waar je dus op kunt indexeren;
• een dynamische array is vaak efficienter in geheugengebruik dan een linked list, ook al alloceer je maximaal twee keer (en gemiddeld anderhalf keer) zoveel elementen als je daadwerkelijk gebruikt;
• een dynamische array hoeft maar een logaritmisch aantal allocaties uit te voeren, terwijl een linked list lineaire aantal allocaties uitvoert;
• een dynamische array is vaak sneller, zeker als je 'm lineair doorloopt, omdat je dan geen pointers hoeft te volgen en opvolgende elementen naast elkaar in het geheugen staan, waardoor de efficiëntie van de cache (erg belangrijk op moderne processoren) aanzienlijk groter is.
Nadelen zijn dat het toevoegen en verwijderen van elementen in het midden van een grote array kostbaar is (en daarom doe je dat ook meestal niet).
of je moet gaan vloeken in de kerk door realloc() te gebruiken op zulke kleine data-strukturen..
Wat is daar vloeken in de kerk aan? Waarom zou je beter 1000 keer malloc kunnen aanroepen dan 10 keer realloc?
edit:
Meer voordelen en nadelen van linked lists ten op zichte van arrays zijn te vinden op
Wikipedia: Linked lists vs. arrays.
[
Voor 13% gewijzigd door
Soultaker op 04-01-2005 16:20
]