source: liacs/pm/backup/sorteren.cc.bak@ 339

Last change on this file since 339 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.0 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
51 for (int i = 0; i < randomgetal(); i++) {
52 Vakje * VakjeNew_Vakje_pt;
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->Eerste_Vakje_pt; //pointer die bijhoudt waar we in L1 zijn
190 Vakje * HulpL2_Vakje_pt = L2->Eerste_Vakje_pt; //pointer die bijhoudt waar we in L2 zijn
191
192
193 while (Toevoegen_bool)
194
195 if ((HulpL1_Vakje_pt != NULL) && (HulpL2_Vakje_pt != NULL)) { //beiden kunnen geschikt getal bevatten
196 if (HulpL2_Vakje_pt->Getal_int < HulpL2_Vakje_pt->Getal_int) {
197
198 Vakje * VakjeNew_Vakje_pt;
199 VakjeNew_Vakje_pt = new Vakje;
200 VakjeNew_Vakje_pt->Getal_int = randomgetal();
201 if (Eerste_Vakje_pt != NULL) {
202 VakjeNew_Vakje_pt->Volgende_Vakje_pt = Eerste_Vakje_pt;
203 VakjeNew_Vakje_pt->Volgende_Vakje_pt->Vorige_Vakje_pt = VakjeNew_Vakje_pt;
204 }
205 else {
206 Laatste_Vakje_pt = VakjeNew_Vakje_pt;
207 } //end if
208 }
209 else if (HulpL1_Vakje_pt != NULL) { //L2 leeg, enkel waardes uit L1 plakken
210
211 }
212 else if (HulpL2_Vakje_pt != NULL) { //L1 leeg, enkel waardes uit L2 plakken
213
214 }
215 else { //alles leeg, over en sluiten
216 Toevoegen_bool = false;
217 }
218 }
219}
220
221//vernietig de list
222void listvak::vernietig() {
223 Vakje * Hulp_Vakje_pt;
224 while (Eerste_Vakje_pt != NULL) {
225 Hulp_Vakje_pt = Eerste_Vakje_pt->Volgende_Vakje_pt;
226 delete Eerste_Vakje_pt;
227 Eerste_Vakje_pt = Hulp_Vakje_pt;
228 } //end while;
229 Laatste_Vakje_pt = NULL;
230} //end listvak::vernietig
231
232int main() {
233 listvak L1;
234 listvak L2;
235 listvak L3;
236 L1.randomlist();
237 L2.randomlist();
238
239 L1.drukaf_l_r();
240 cout << endl;
241 L2.drukaf_l_r();
242 cout << endl;
243 L3.merge(&L1,&L2);
244}
Note: See TracBrowser for help on using the repository browser.