source: liacs/pm/oefpoint.cc@ 5

Last change on this file since 5 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.