// // Programmeermethoden 2004 // // http://www.liacs.nl/home/kosters/pm/oefpoint.cc // C++-programma om te oefenen in het gebruik van pointers. // Er moet een enkelverbonden pointerlijst gefabriceerd worden, // waarbij de vakjes die met elkaar verbonden worden bestaan uit // 1. Een int(eger) // 2. Een pointer naar het volgende vakje (of NULL) // 3. Een pointer naar een int(eger) (of NULL) // Schrijf de functies Afdrukken, MaakVakje, Toevoegen, Verwijderen // en tot slot GesorteerdToevoegen - in deze volgorde. // Er is ook een uitwerking van dit programma beschikbaar: // http://www.liacs.nl/home/kosters/pm/pointer.cc // // Compiler: GNU g++ / Borland C++ / Visual C++ // Datum: 24 okt 1995, 29 okt 1996, 15 nov 1999, 17 nov 2000, 22 okt 2001 // Auteur: Walter Kosters, Informatica Universiteit Leiden // email kosters@liacs.nl, telefoon 071-5277059 // #include using namespace std; // het soort vakje waar het om draait: class vakje { // een struct mag ook public: int info; vakje* volgende; int* andere; }; // vakje // // +-----+ +----+----+-----+ +----+----+-----+ // | --+------> | 34 | | | --+------> | 56 | | | NULL| // +-----+ +----+--+-+-----+ +----+--+-+-----+ // ingang | | // V V // +----+ +----+ // | 23 | | 18 | // +----+ +----+ // // ingang wijst dus een vakje uit een lijst vakjes aan // waarbij ieder vakje informatie bevat (het info-veld), // een pointer naar het volgende vakje, en ook nog een // pointer naar een int(eger) (het andere-veld); om zulke // structuurtjes te maken is doorgaans in totaal steeds // twee maal new nodig, voor het voorbeeld hierboven in // totaal vier // Een voorbeeld: het getal 34 wordt afgedrukt via: // cout << ingang->info << endl; // En het getal 18 via: // cout << *(ingang->volgende->andere) << endl; // En een pointer hulp (vakje* hulp) gaat naar het vakje // met onder andere 56 erin wijzen via: // hulp = ingang->volgende; // // ************************************************************************ void Afdrukken (vakje* ingang) { // druk lijst met ingang als ingang af cout << "Lijst afdrukken ..." << endl; vakje* hulp = ingang; while ( hulp != NULL ){ cout << hulp->info << endl; hulp = hulp->volgende; } // // XXXXXX // XX // XX // XXXXXX // } // Afdrukken void MaakVakje (vakje* & p, int een, int twee) { // laat p naar nieuw vakje met een, twee erin wijzen; // preciezer: nieuw vakje met getal een en een POINTER naar een // nieuwe int met getal twee erin // mooier: als bijvoorbeeld twee = -1, dan p->andere NULL maken cout << "Maak een nieuw vakje ..." << endl; p = new vakje; p->info = een; if (twee > 0){ p->andere = new int; *(p->andere) = twee; } else { p->andere = NULL; } } // MaakVakje void Toevoegen (vakje* & ingang, int een, int twee) { // voeg vakje met getallen een en twee erin vooraan lijst ingang toe // gebruik MaakVakje cout << "Voeg een nieuw vakje toe ..." << endl; vakje* hulp = ingang; MaakVakje (ingang,een,twee); ingang->volgende = hulp; } // Toevoegen void Verwijderen (vakje*& ingang) { // gooi eerste vakje van lijst ingang weg als ingang niet NULL is cout << "Verwijder een vakje ..." << endl; if (ingang != NULL){ vakje* hulp = ingang; ingang = ingang->volgende; delete hulp->andere; delete hulp; } } // Verwijderen void GesorteerdToevoegen (vakje* & ingang, int een, int twee) { // voeg vakje met getallen een en twee erin toe aan lijst ingang, // en wel voor het eerste grotere getal (als dat er is), // dus gesorteerd op info-velden // gebruikt TWEE pointertjes om door de lijst te lopen, en berg // het nieuwe vakje "tussen" deze twee op cout << "Voeg een nieuw vakje gesorteerd toe (lastig) ..." << endl; vakje* hulp1 = ingang; vakje* hulp2 = ingang->volgende; while (hulp2 != NULL) if(een > hulp2->info){ vakje nieuw; nieuw- } hulp1 = hulp2; hulp2 = hulp2->volgende; } // // XX XX // XX XX // XX XX // XXX // } // GesorteerdToevoegen void LeesInGetallen (int & een, int & twee) { // lees integers een en twee in cout << "Eerste getal svp .. "; cin >> een; cout << "Tweede getal svp .. "; cin >> twee; } // LeesInGetallen // ********************************************************************* int main ( ) { vakje* ingang = NULL; // ingang van de op te bouwen lijst (nu nog leeg) char keuze; // wat wil de gebruiker? int een, twee; // toe te voegen getallen do { cout << "Kies uit: [s]toppen, [g]esorteerd [t]oevoegen," << endl << " [a]fdrukken, [v]erwijderen " << endl << "Uw keuze: "; cin >> keuze; switch (keuze) { case 's': case 'S': cout << "Dat was het dan ..." << endl; break; case 't': case 'T': LeesInGetallen (een,twee); Toevoegen (ingang,een,twee); break; case 'a': case 'A': Afdrukken (ingang); break; case 'v': case 'V': Verwijderen (ingang); break; case 'g': case 'G': LeesInGetallen (een,twee); GesorteerdToevoegen (ingang,een,twee); break; default: cout << "Niet toegestane menukeuze ..." << endl; } // switch } // do while ( ! ( keuze == 's' ) && ! ( keuze == 'S' ) ); // while ( ingang != NULL ) // netjes opruimen // Verwijderen (ingang); return 0; } // main