source: liacs/pm/backup/sorteren.cc@ 9

Last change on this file since 9 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: 8.7 KB
Line 
1#include <iostream>
2#include <ctime>
3using namespace std;
4
5//Het maken van een random getal
6int randomgetal () { // tussen 0 en 999
7 static int getal = time (NULL) % 1000;
8 getal = ( 621 * getal + 1 ) % 1000;
9 return getal;
10}
11
12//Een list bestaat uit allemaal vakjes.
13class Vakje {
14 public:
15 int Getal_int; //Waarde van het vakje
16 Vakje * Volgende_Vakje_pt; //Zijn 'rechterbuur'
17 Vakje * Vorige_Vakje_pt; //Zijn 'linkbuur'
18};
19
20class listvak {
21 public:
22 //default constuctor (NULL pointers)
23 listvak( );
24 //destructor: niks doen
25 ~listvak( ) { };
26 //creer de list van random lengte met randomgetallen
27 void randomlist();
28 //druk de list van links naar rechts af
29 void drukaf_l_r();
30 //druk de list van recht naar links af
31 void drukaf_r_l();
32 //sorteer de list, volgens bubblesort methode
33 int sorteren();
34 //merge L1 en L2 met opvolgend principe
35 void merge(listvak * L1, listvak * L2);
36 //vernietig de list.
37 void vernietig();
38 private:
39 Vakje * Eerste_Vakje_pt; //pointer naar het eerste vakje
40 Vakje * Laatste_Vakje_pt; //pointer naar het laatste vakje
41};
42
43listvak::listvak( ) {
44 Eerste_Vakje_pt = NULL;
45 Laatste_Vakje_pt = NULL;
46}
47
48//voeg een AantalGetallen_int getallen toe aan de List die door Lbgin wordt gepointerd.
49void listvak::randomlist() {
50 Vakje * VakjeNew_Vakje_pt;
51
52 for (int i = 0; i < randomgetal(); i++) {
53 VakjeNew_Vakje_pt = new Vakje;
54 VakjeNew_Vakje_pt->Getal_int = randomgetal();
55 if (Eerste_Vakje_pt != NULL) {
56 VakjeNew_Vakje_pt->Volgende_Vakje_pt = Eerste_Vakje_pt;
57 VakjeNew_Vakje_pt->Volgende_Vakje_pt->Vorige_Vakje_pt = VakjeNew_Vakje_pt;
58 }
59 else {
60 Laatste_Vakje_pt = VakjeNew_Vakje_pt;
61 } //end if
62
63 Eerste_Vakje_pt = VakjeNew_Vakje_pt;
64 } //end for
65} //end listvak::randomlist
66
67//druk de list af van links naar rechts
68void listvak::drukaf_l_r() {
69 Vakje * Hulp_Vakje_pt = Eerste_Vakje_pt;
70 while (Hulp_Vakje_pt != NULL) {
71 cout << Hulp_Vakje_pt->Getal_int << " ";
72 Hulp_Vakje_pt = Hulp_Vakje_pt->Volgende_Vakje_pt;
73 } //end while
74} //end listvak::drukaf_lr
75
76//druk de list af van rechts naar links
77void listvak::drukaf_r_l() {
78 Vakje * Hulp_Vakje_pt = Laatste_Vakje_pt;
79 while (Hulp_Vakje_pt != NULL) {
80 cout << Hulp_Vakje_pt->Getal_int << " ";
81 Hulp_Vakje_pt = Hulp_Vakje_pt->Vorige_Vakje_pt;
82 } //end while
83} //end listvak::drukaf_rl
84
85//sorteren volgens de bubblesort methode (grootste getal achteraan)
86//uitvoer: aantal verwisselingen die plaatsgevonden hebben.
87int listvak::sorteren() {
88 int Verwisselingen_int = 0;
89 Vakje * BubbleHulp_Vakje_pt = Eerste_Vakje_pt; //Dit is het vakje dat gechecked wordt
90 Vakje * BubbleStop_Vakje_pt = Laatste_Vakje_pt; //Hierna hoeft niet meer gechecked worden
91 Vakje * BubbleVakA_Vakje_pt;
92 Vakje * BubbleVakB_Vakje_pt;
93 Vakje * BubbleVakC_Vakje_pt;
94 Vakje * BubbleVakD_Vakje_pt;
95
96 while (BubbleStop_Vakje_pt->Vorige_Vakje_pt != NULL) {
97 while ( BubbleHulp_Vakje_pt != BubbleStop_Vakje_pt ) {
98 if (BubbleHulp_Vakje_pt->Getal_int > BubbleHulp_Vakje_pt->Volgende_Vakje_pt->Getal_int) {
99 /* Methode voor het omwisselen van vak B en C
100 * Oude situtatie
101 * ___________________________________
102 * | Vorige | Vak Nummer | Volgende |
103 * |========|=============|===========|
104 * | | A | 1->B |
105 * | 2->A | B | 3->C |
106 * | 4->B | C | 5->D |
107 * | 6->C | D | |
108 * ------------------------------------
109 *
110 * Nieuwe situatie
111 * ___________________________________
112 * | Vorige | Vak Nummer | Volgende |
113 * |========|=============|===========|
114 * | | A | 1->C |
115 * | 2->C | B | 3->D |
116 * | 4->A | C | 5->B |
117 * | 6->B | D | |
118 * ------------------------------------
119 *
120 * Uitzondering betreft als A de pointer in het begin is of als
121 * D de eind pointer is.
122 */
123 BubbleVakA_Vakje_pt = BubbleHulp_Vakje_pt->Vorige_Vakje_pt;
124 BubbleVakB_Vakje_pt = BubbleHulp_Vakje_pt;
125 BubbleVakC_Vakje_pt = BubbleHulp_Vakje_pt->Volgende_Vakje_pt;
126 BubbleVakD_Vakje_pt = BubbleHulp_Vakje_pt->Volgende_Vakje_pt->Volgende_Vakje_pt;
127
128 //Pointer 1,2
129 if (BubbleVakA_Vakje_pt == NULL) {
130 Eerste_Vakje_pt = BubbleVakC_Vakje_pt;
131 BubbleVakC_Vakje_pt->Vorige_Vakje_pt = NULL;
132 }
133 else {
134 BubbleVakA_Vakje_pt->Volgende_Vakje_pt = BubbleVakC_Vakje_pt;
135 BubbleVakC_Vakje_pt->Vorige_Vakje_pt = BubbleVakA_Vakje_pt;
136 } //end if
137
138 //Pointer 3,4
139 BubbleVakB_Vakje_pt->Vorige_Vakje_pt = BubbleVakC_Vakje_pt;
140 BubbleVakC_Vakje_pt->Volgende_Vakje_pt = BubbleVakB_Vakje_pt;
141
142 //Pointer 5,6
143 if (BubbleVakD_Vakje_pt == NULL) {
144 Laatste_Vakje_pt = BubbleVakB_Vakje_pt;
145 BubbleVakB_Vakje_pt->Volgende_Vakje_pt = NULL;
146 BubbleStop_Vakje_pt = BubbleVakB_Vakje_pt;
147 }
148 else {
149 BubbleVakD_Vakje_pt->Vorige_Vakje_pt = BubbleVakB_Vakje_pt;
150 BubbleVakB_Vakje_pt->Volgende_Vakje_pt = BubbleVakD_Vakje_pt;
151 } //end if
152
153 //In het geval dat het vakje van de stop pointer kleiner is als het vakje ervoor,
154 //zal de stop pointer over het nieuwe vakje moeten vallen, anders komt hij het stop
155 //teken nooit tegen.
156 // A B C D
157 // 5 9 7 10
158 // ^ ^
159 // | |Stop pointer
160 // | Huidige Waarde
161 //
162 // ZONDER AANPASSING MET AANPASSING
163 //
164 // A C B D A C B D
165 // 5 7 9 10 5 7 9 10
166 // ^ ^ ^ ^
167 // | |Huidige Waarde | |Huidige Waarde + Stop Pointer
168 // | Stop Pointer |
169 //
170 if (BubbleStop_Vakje_pt == BubbleVakC_Vakje_pt) {
171 BubbleStop_Vakje_pt = BubbleVakB_Vakje_pt;
172 } //end if
173
174 Verwisselingen_int++;
175 }
176 else {
177 BubbleHulp_Vakje_pt = BubbleHulp_Vakje_pt->Volgende_Vakje_pt;
178 } //end if
179 } //end while
180 BubbleHulp_Vakje_pt = Eerste_Vakje_pt;
181 BubbleStop_Vakje_pt = BubbleStop_Vakje_pt->Vorige_Vakje_pt;
182 } //end while
183 return (Verwisselingen_int);
184} //end listvak::sorteren
185
186void listvak::merge(listvak * L1, listvak * L2) {
187 bool Toevoegen_bool = true; //zolang true bestaan er nog waardes die toegevoegd moeten worden
188
189 Vakje * HulpL1_Vakje_pt = L1->Laatste_Vakje_pt; //pointer die bijhoudt waar we in L1 zijn
190 Vakje * HulpL2_Vakje_pt = L2->Laatste_Vakje_pt; //pointer die bijhoudt waar we in L2 zijn
191
192 Vakje * VakjeNew_Vakje_pt; //pointer bij gebruikt wordt bij het maken van nieuwe vakjes
193
194 while (Toevoegen_bool) {
195 VakjeNew_Vakje_pt = new Vakje;
196 if (Eerste_Vakje_pt != NULL) {
197 VakjeNew_Vakje_pt->Volgende_Vakje_pt = Eerste_Vakje_pt;
198 VakjeNew_Vakje_pt->Volgende_Vakje_pt->Vorige_Vakje_pt = VakjeNew_Vakje_pt;
199 }
200 else {
201 Laatste_Vakje_pt = VakjeNew_Vakje_pt;
202 } //end if
203 Eerste_Vakje_pt = VakjeNew_Vakje_pt;
204
205 if ((HulpL1_Vakje_pt != NULL) && (HulpL2_Vakje_pt != NULL)) { //beiden bevatten nog een getal
206 if (HulpL1_Vakje_pt->Getal_int > HulpL2_Vakje_pt->Getal_int) {
207 VakjeNew_Vakje_pt->Getal_int = HulpL1_Vakje_pt->Getal_int;
208 HulpL1_Vakje_pt = HulpL1_Vakje_pt->Vorige_Vakje_pt;
209 }
210 else {
211 VakjeNew_Vakje_pt->Getal_int = HulpL2_Vakje_pt->Getal_int;
212 HulpL2_Vakje_pt = HulpL2_Vakje_pt->Vorige_Vakje_pt;
213 } //end if
214 }
215 else if (HulpL1_Vakje_pt != NULL) { //L2 leeg, enkel waardes uit L1 plakken
216 VakjeNew_Vakje_pt->Getal_int = HulpL1_Vakje_pt->Getal_int;
217 HulpL1_Vakje_pt = HulpL1_Vakje_pt->Vorige_Vakje_pt;
218 }
219 else if (HulpL2_Vakje_pt != NULL) { //L1 leeg, enkel waardes uit L2 plakken
220 VakjeNew_Vakje_pt->Getal_int = HulpL2_Vakje_pt->Getal_int;
221 HulpL2_Vakje_pt = HulpL2_Vakje_pt->Vorige_Vakje_pt;
222 }
223 else { //alles leeg, 'over en sluiten'
224 Toevoegen_bool = false;
225 } //end if
226 } //end while
227} //end listvak::merge
228
229//vernietig de list
230void listvak::vernietig() {
231 Vakje * Hulp_Vakje_pt;
232 while (Eerste_Vakje_pt != NULL) {
233 Hulp_Vakje_pt = Eerste_Vakje_pt->Volgende_Vakje_pt;
234 delete Eerste_Vakje_pt;
235 Eerste_Vakje_pt = Hulp_Vakje_pt;
236 } //end while;
237 Laatste_Vakje_pt = NULL;
238} //end listvak::vernietig
239
240int main() {
241 listvak L1;
242 listvak L2;
243 listvak L3;
244 L1.randomlist();
245 L2.randomlist();
246 L1.sorteren();
247 L2.sorteren();
248 L1.drukaf_l_r();
249 cout << endl << endl;
250 L2.drukaf_l_r();
251 cout << endl << endl;
252 L3.merge(&L1,&L2);
253 cout << endl << endl;
254 L3.drukaf_l_r();
255 cout << endl;
256
257}
Note: See TracBrowser for help on using the repository browser.