1 |
|
---|
2 | //
|
---|
3 | // Programmeermethoden 2004
|
---|
4 | //
|
---|
5 | // http://www.liacs.nl/home/kosters/pm/oefpoint.cc
|
---|
6 | // C++-programma om te oefenen in het gebruik van pointers.
|
---|
7 | // Er moet een enkelverbonden pointerlijst gefabriceerd worden,
|
---|
8 | // waarbij de vakjes die met elkaar verbonden worden bestaan uit
|
---|
9 | // 1. Een int(eger)
|
---|
10 | // 2. Een pointer naar het volgende vakje (of NULL)
|
---|
11 | // 3. Een pointer naar een int(eger) (of NULL)
|
---|
12 | // Schrijf de functies Afdrukken, MaakVakje, Toevoegen, Verwijderen
|
---|
13 | // en tot slot GesorteerdToevoegen - in deze volgorde.
|
---|
14 | // Er is ook een uitwerking van dit programma beschikbaar:
|
---|
15 | // http://www.liacs.nl/home/kosters/pm/pointer.cc
|
---|
16 | //
|
---|
17 | // Compiler: GNU g++ / Borland C++ / Visual C++
|
---|
18 | // Datum: 24 okt 1995, 29 okt 1996, 15 nov 1999, 17 nov 2000, 22 okt 2001
|
---|
19 | // Auteur: Walter Kosters, Informatica Universiteit Leiden
|
---|
20 | // email kosters@liacs.nl, telefoon 071-5277059
|
---|
21 | //
|
---|
22 |
|
---|
23 | #include <iostream>
|
---|
24 | using namespace std;
|
---|
25 |
|
---|
26 | // het soort vakje waar het om draait:
|
---|
27 |
|
---|
28 | class vakje { // een struct mag ook
|
---|
29 | public:
|
---|
30 | int info;
|
---|
31 | vakje* volgende;
|
---|
32 | int* andere;
|
---|
33 | }; // vakje
|
---|
34 |
|
---|
35 | //
|
---|
36 | // +-----+ +----+----+-----+ +----+----+-----+
|
---|
37 | // | --+------> | 34 | | | --+------> | 56 | | | NULL|
|
---|
38 | // +-----+ +----+--+-+-----+ +----+--+-+-----+
|
---|
39 | // ingang | |
|
---|
40 | // V V
|
---|
41 | // +----+ +----+
|
---|
42 | // | 23 | | 18 |
|
---|
43 | // +----+ +----+
|
---|
44 | //
|
---|
45 | // ingang wijst dus een vakje uit een lijst vakjes aan
|
---|
46 | // waarbij ieder vakje informatie bevat (het info-veld),
|
---|
47 | // een pointer naar het volgende vakje, en ook nog een
|
---|
48 | // pointer naar een int(eger) (het andere-veld); om zulke
|
---|
49 | // structuurtjes te maken is doorgaans in totaal steeds
|
---|
50 | // twee maal new nodig, voor het voorbeeld hierboven in
|
---|
51 | // totaal vier
|
---|
52 | // Een voorbeeld: het getal 34 wordt afgedrukt via:
|
---|
53 | // cout << ingang->info << endl;
|
---|
54 | // En het getal 18 via:
|
---|
55 | // cout << *(ingang->volgende->andere) << endl;
|
---|
56 | // En een pointer hulp (vakje* hulp) gaat naar het vakje
|
---|
57 | // met onder andere 56 erin wijzen via:
|
---|
58 | // hulp = ingang->volgende;
|
---|
59 | //
|
---|
60 |
|
---|
61 | // ************************************************************************
|
---|
62 |
|
---|
63 | void Afdrukken (vakje* ingang) {
|
---|
64 | // druk lijst met ingang als ingang af
|
---|
65 | cout << "Lijst afdrukken ..." << endl;
|
---|
66 | vakje* hulp = ingang;
|
---|
67 | while ( hulp != NULL ){
|
---|
68 | cout << hulp->info << endl;
|
---|
69 | hulp = hulp->volgende;
|
---|
70 | }
|
---|
71 |
|
---|
72 | //
|
---|
73 | // XXXXXX
|
---|
74 | // XX
|
---|
75 | // XX
|
---|
76 | // XXXXXX
|
---|
77 | //
|
---|
78 |
|
---|
79 | } // Afdrukken
|
---|
80 |
|
---|
81 | void MaakVakje (vakje* & p, int een, int twee) {
|
---|
82 | // laat p naar nieuw vakje met een, twee erin wijzen;
|
---|
83 | // preciezer: nieuw vakje met getal een en een POINTER naar een
|
---|
84 | // nieuwe int met getal twee erin
|
---|
85 | // mooier: als bijvoorbeeld twee = -1, dan p->andere NULL maken
|
---|
86 | cout << "Maak een nieuw vakje ..." << endl;
|
---|
87 | p = new vakje;
|
---|
88 | p->info = een;
|
---|
89 | if (twee > 0){
|
---|
90 | p->andere = new int;
|
---|
91 | *(p->andere) = twee;
|
---|
92 | }
|
---|
93 | else {
|
---|
94 | p->andere = NULL;
|
---|
95 | }
|
---|
96 | } // MaakVakje
|
---|
97 |
|
---|
98 | void Toevoegen (vakje* & ingang, int een, int twee) {
|
---|
99 | // voeg vakje met getallen een en twee erin vooraan lijst ingang toe
|
---|
100 | // gebruik MaakVakje
|
---|
101 | cout << "Voeg een nieuw vakje toe ..." << endl;
|
---|
102 | vakje* hulp = ingang;
|
---|
103 |
|
---|
104 | MaakVakje (ingang,een,twee);
|
---|
105 | ingang->volgende = hulp;
|
---|
106 |
|
---|
107 | } // Toevoegen
|
---|
108 |
|
---|
109 | void Verwijderen (vakje*& ingang) {
|
---|
110 | // gooi eerste vakje van lijst ingang weg als ingang niet NULL is
|
---|
111 | cout << "Verwijder een vakje ..." << endl;
|
---|
112 |
|
---|
113 | if (ingang != NULL){
|
---|
114 | vakje* hulp = ingang;
|
---|
115 | ingang = ingang->volgende;
|
---|
116 | delete hulp->andere;
|
---|
117 | delete hulp;
|
---|
118 | }
|
---|
119 |
|
---|
120 | } // Verwijderen
|
---|
121 |
|
---|
122 | void GesorteerdToevoegen (vakje* & ingang, int een, int twee) {
|
---|
123 | // voeg vakje met getallen een en twee erin toe aan lijst ingang,
|
---|
124 | // en wel voor het eerste grotere getal (als dat er is),
|
---|
125 | // dus gesorteerd op info-velden
|
---|
126 | // gebruikt TWEE pointertjes om door de lijst te lopen, en berg
|
---|
127 | // het nieuwe vakje "tussen" deze twee op
|
---|
128 | cout << "Voeg een nieuw vakje gesorteerd toe (lastig) ..." << endl;
|
---|
129 |
|
---|
130 | vakje* hulp1 = ingang;
|
---|
131 | vakje* hulp2 = ingang->volgende;
|
---|
132 | while (hulp2 != NULL)
|
---|
133 | if(een > hulp2->info){
|
---|
134 | vakje nieuw;
|
---|
135 | nieuw-
|
---|
136 | }
|
---|
137 | hulp1 = hulp2;
|
---|
138 | hulp2 = hulp2->volgende;
|
---|
139 | }
|
---|
140 | //
|
---|
141 | // XX XX
|
---|
142 | // XX XX
|
---|
143 | // XX XX
|
---|
144 | // XXX
|
---|
145 | //
|
---|
146 |
|
---|
147 | } // GesorteerdToevoegen
|
---|
148 |
|
---|
149 | void LeesInGetallen (int & een, int & twee) {
|
---|
150 | // lees integers een en twee in
|
---|
151 | cout << "Eerste getal svp .. ";
|
---|
152 | cin >> een;
|
---|
153 | cout << "Tweede getal svp .. ";
|
---|
154 | cin >> twee;
|
---|
155 | } // LeesInGetallen
|
---|
156 |
|
---|
157 | // *********************************************************************
|
---|
158 |
|
---|
159 | int main ( ) {
|
---|
160 |
|
---|
161 | vakje* ingang = NULL; // ingang van de op te bouwen lijst (nu nog leeg)
|
---|
162 | char keuze; // wat wil de gebruiker?
|
---|
163 | int een, twee; // toe te voegen getallen
|
---|
164 |
|
---|
165 | do {
|
---|
166 | cout << "Kies uit: [s]toppen, [g]esorteerd [t]oevoegen," << endl
|
---|
167 | << " [a]fdrukken, [v]erwijderen " << endl
|
---|
168 | << "Uw keuze: ";
|
---|
169 | cin >> keuze;
|
---|
170 | switch (keuze) {
|
---|
171 | case 's': case 'S':
|
---|
172 | cout << "Dat was het dan ..." << endl;
|
---|
173 | break;
|
---|
174 | case 't': case 'T':
|
---|
175 | LeesInGetallen (een,twee);
|
---|
176 | Toevoegen (ingang,een,twee);
|
---|
177 | break;
|
---|
178 | case 'a': case 'A':
|
---|
179 | Afdrukken (ingang);
|
---|
180 | break;
|
---|
181 | case 'v': case 'V':
|
---|
182 | Verwijderen (ingang);
|
---|
183 | break;
|
---|
184 | case 'g': case 'G':
|
---|
185 | LeesInGetallen (een,twee);
|
---|
186 | GesorteerdToevoegen (ingang,een,twee);
|
---|
187 | break;
|
---|
188 | default:
|
---|
189 | cout << "Niet toegestane menukeuze ..." << endl;
|
---|
190 | } // switch
|
---|
191 | } // do
|
---|
192 | while ( ! ( keuze == 's' ) && ! ( keuze == 'S' ) );
|
---|
193 |
|
---|
194 | // while ( ingang != NULL ) // netjes opruimen
|
---|
195 | // Verwijderen (ingang);
|
---|
196 |
|
---|
197 | return 0;
|
---|
198 |
|
---|
199 | } // main
|
---|