source: liacs/pm/backup/sorteren.cc.bak@ 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.0 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
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.