Instructie Programmeren
Task 85JJ70
PAGE 2
Task 8: Double Linked List
• Het doel van deze opdracht is:• Het opbouwen van een tweetal klassen, die samen een linked list
implementeren.• De opdracht begeleid je door alle stappen die je moet nemen, probeer dus
niet te veel in 1x te implementeren. Gebruik de opdracht om in kleine stapjes naar een oplossing toe te werken.
• Stap 1 tot 5 zijn al gedaan in het skeleton! Natuurlijk kan het geen kwaad om even te kijken hoe het in elkaar zit, voor je met stap 6 verder gaat.
Task 8: Double Linked List: Id counter
• Een variabele met het keyword static heeft de volgende eigenschappen:• De variabele wordt 1x geïnitialiseerd:
• Als er een static variabele in een memberfunctie van een klasse voorkomt, wordt deze gedeeld door alle initializaties van de klasse.
PAGE 3
void myTest(void){ static int myStatic = 0; printf("myStatic: %d\n", myStatic); myStatic++;}void main(void) { for(int i=0; i<10; i++) myTest();}
Task 8: Double Linked List: Stack objecten
• Objecten die op de stack staan, roepen automatisch hun destructor aan wanneer hun stuk van de stack wordt opgeruimd:
PAGE 4
void main(void) {MyClass myObject;MyClass* myObject2 = new MyClass;
// Do stuff here
// Cleanup:delete myObject2;// End of main function, implicitly calls myObject.~MyClass(), so// the destructor function is run
}
Task 8: Double Linked List: Items itereren
• Door de items in je lijst lopen kan je handig doen met een do…while loop:
PAGE 5
Item* ptr = _top_of_ring;if(ptr){
// If we get here, the list is not emptydo {
// Do stuff with you Item pointer here// Advance to next itemptr = ptr->_next;
} while(ptr != _top_of_ring);}
Task 8: Double Linked List: Append/Insert
• Bedenk goed met welke verschillende situaties je rekening moet houden:• Een lege lijst
• Een lijst met 1 of meer items
• Maak tekeningen, dit levert vaak veel duidelijkheid op• Wanneer er maar 1 item in de lijst zit, wijzen de _next en _prev
van dat item naar zichzelf!
• (Hint: Is het nodig om Append en Insert allebei “volledig” te implementeren?)
PAGE 6
Item
_next
_prev
_top_of_ring
Task 8: Double Linked List: Delete
• Het deleten van een item kun je zien als het “doorknippen” van de ring bij de stippellijnen:
Er zijn dus 4 pointers die je moet aanpassen• Wat gebeurt er als je het _top_of_ring item weggooit?• De procedure die je bij het deleten gebruikt om een item los te
koppelen, is ook nuttig bij het verplaatsen van items in de ring
PAGE 7
Item Item_next
_prev
_next
_prev
_top_of_ringItem
_prev
_next
Task 8: Double Linked List: Inheritance
• De printfunctie uit de opdracht print het _id van je item vanuit de Person klasse, dat kan alleen als je van _id een protected variabele maakt:• Een protected variabele kan worden benaderd vanuit de klasse
zelf, en alle klassen die erven van deze klasse
PAGE 8
Task 8: Double Linked List: Inheritance
• Als je de opdracht letterlijk volgt, zul je merken dat er iets niet kan:• De append functie van je Dlist klasse maakt een nieuw Item object, terwijl je
een Person object nodig hebt• Je ontkomt er dus niet aan om iets aan te passen aan de originele Dlist klasse• Maak bijvoorbeeld een versie van de append functie die een pointer naar het
toe te voegen Item als argument heeft:
In de append functie van je boek kun je een nieuw Person object maken (en de naam doorgeven aan de constructor van Person)
• Vervolgens geef je het nieuwe Person object vanuit je Book append functie door aan de append functie van Dlist
• Dit kan door specifiek te vragen naar de append functie van Dlist:
PAGE 9
void Dlist::append(Item* newitem);void Book::append(char* name);
Dlist::append(myNewPerson);