source: liacs/pm/oefpoint.cc@ 225

Last change on this file since 225 was 2, checked in by Rick van der Zwet, 15 years ago

Initial import of data of old repository ('data') worth keeping (e.g. tracking
means of URL access statistics)

  • Property svn:executable set to *
File size: 5.8 KB
Line 
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>
24using namespace std;
25
26// het soort vakje waar het om draait:
27
28class 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
63void 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
81void 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
98void 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
109void 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
122void 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
149void 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
159int 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
Note: See TracBrowser for help on using the repository browser.