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

Last change on this file since 108 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
RevLine 
[2]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.