Archief - [PROG][C++] sorted linked list

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

keybern

Legacy Member
Code:
#include <iostream>
#include <string>
#include <sstream>
#include <math.h>

using namespace std;

template <class T>
struct element {
       T object;
       element *volg;
};

template <class T>
class Lijst {
    private:
             element<T> *top;
    public:
    Lijst() 
    {
             top = NULL;
    }
    ~Lijst()
    {
             element<T> *p;
             while (top != NULL){
                   p = top;
                   top = top->volg;
                   delete p;
             }
    }
    
    void voeggesorteerdtoe(T obj)
    {
             if (top == NULL || top->object > obj) {
                 element<T> *p = top;
                 top = new element<T>;
                 top->object = obj;
                 top->volg = p;
                 cout << "vooraan ";
             } else {
                 element<T> *plaats = top;
                 element<T> *vorige = top;
                 while (plaats != NULL && plaats->object < obj) {
                       vorige = plaats;
                       cout << "* " << plaats->object ;
                       plaats = plaats->volg;
                 }
                 
                 element<T> nieuw;
                 nieuw.object = obj;
                 nieuw.volg = plaats;
                 vorige->volg = &nieuw;
                 cout << " volgend element " << endl;
             }
             cout << obj << " toegevoegd!" << endl;
    }
    
    friend ostream& operator<<(ostream& os, const Lijst& l)
    {
            element<T> *t = l.top;
            while (t != NULL){
                   os << t->object << endl;
                   t = t->volg;
            }
            return os;
    }
    
};


int main() {
    Lijst<int> l1;
    l1.voeggesorteerdtoe(5); l1.voeggesorteerdtoe(3); l1.voeggesorteerdtoe(1); l1.voeggesorteerdtoe(10);
    l1.voeggesorteerdtoe(0); l1.voeggesorteerdtoe(4);
    cout << l1 << endl;

    system("PAUSE");
    return 0;
}

mijn bedoeling is wel duidelijk denk ik. Ik heb een linked list en wil deze gesorteerd houden. Vooraan toevoegen lijkt te lukken, maar het programma spuwt vreemde resultaten van zodra er een element tussenin of achteraan moet bijgevoegd worden...
Ik heb werkelijk geen idee waar de fout ligt. Alle hulp is welkom :crazy:

thx

Vich

Legacy Member
Maak best eerst een gewone templateized linked list met onder andere een Add() en Insert(). Daarna kan je een templatized linked list maken die Add() overschrijft en correct het element ergens insert.

Een voorbeeldje van een werkende list kan je hier vinden
http://opensource.lifeisdigital.net/COW-2006-10-25.zip
Open /Source/COW/List.h

Het systeem werkt in COW net zoals STL, met een iterator.
Een voorbeeld van hoe deze list te gebruiken vind je hier in /Demos/Source/UnitTests/TypesTest.cpp in de call "bool ListTest()"

killgore

Legacy Member
Hier zit (een) fout:

Code:
                 element<T> nieuw;
                 nieuw.object = obj;
                 nieuw.volg = plaats;
                 vorige->volg = &nieuw;
                 cout << " volgend element " << endl;

Immers, je maakt een lokaal object aan (lokaal voor die methode) en voegt deze toe aan de lijst via adres, dit lokaal object komt echter op de stack en wordt automatisch verwijdert bij het stoppen van de methode. Bijgevolg kom jij in je list met een pointer naar een niet bestaand object.

Werken zoals je in het begin doet: pointer aanmaken!

Vich

Legacy Member
Maareuh, even tussendoor: variabelen, klassenaamen en dergelijke in een andere taal dan Engels noteren is echt not done!

Hale

Legacy Member
waarom zou dat in godsnaam not done zijn? zolang er alleen nederlandstalige mensen naar die code kijken, zie ik niet in wat het probleem is. Zeker niet voor een eigen amateur applicatietje.

Vich

Legacy Member
Hale zei:
waarom zou dat in godsnaam not done zijn? zolang er alleen nederlandstalige mensen naar die code kijken, zie ik niet in wat het probleem is. Zeker niet voor een eigen amateur applicatietje.

Het is een slechte gewoonte, omdat mensen wel eens de neiging hebben om het later ook zo te doen voor bedrijfsapplicaties "omdat ze het zo gewend zijn".
Je kan er nooit van uit gaan dat je code niet (nu of later) wordt gelezen door anderstalige mensen.
Zelfs in dit geval: Als iemand via Google Code search deze pagina vindt, dan is het veel moeilijker om de code te begrijpen.
Sowieso is de programmeertaal syntax ook in het Engels en staat het bijgevolg ook stom om 2 talen te mixen. "Like wanneer ik this way aan't speaken ben".

keybern

Legacy Member
Vich, je hebt absoluut geen idee van wat ik 'geneigd ben later te doen voor bedrijfsapps'. Zo ook niet van wat ik 'gewend ben'.
Je mag je pro voelen omdat je engelstalige variabelen en klassenamen gebruikt, maar ik geef er voor schooloefeningetjes eerlijk gezegd geen moer om.
Miss maal je ook te hard op futiliteiten. Killgore heeft me met z'n simpele reply perfect verdergeholpen. No links to voorbeeldjes, no veel gespeak om nothing te zeggen.

Vich

Legacy Member
keybern zei:
Vich, je hebt absoluut geen idee van wat ik 'geneigd ben later te doen voor bedrijfsapps'. Zo ook niet van wat ik 'gewend ben'.
Mijn punt was dat het altijd handig is om je code te voorzien op hergebruik, juist omdat je niet weet wat je later van plan bent met die code.
[edit] Wat ik zei was:
Het is een slechte gewoonte, omdat mensen wel eens de neiging hebben om het later ook zo te doen voor bedrijfsapplicaties "omdat ze het zo gewend zijn".
Ik had het hier over "mensen" in het algemeen, niet specifiek over jou. Ik zei ook "wel eens", waarmee ik niet iedereen die dat doet over dezelfde kam wil scheren.
Als jij je persoonlijk aangesproken voelt, dan is dat jouw probleem, niet het mijne. Die reactie was trouwens aan Hale gericht, vandaar dat ik hem quotte, om dat duidelijk te maken.

Je mag je pro voelen omdat je engelstalige variabelen en klassenamen gebruikt,
Je mag je iets minder op je tenen getrapt voelen. Engels gebruiken heeft niks te maken met "pro voelen", maar wel met een standaard volgen. Programmeren heeft alles te maken met standaarden volgen.

maar ik geef er voor schooloefeningetjes eerlijk gezegd geen moer om.
Dat is natuurlijk dé attitude, die moet je vooral aanhouden als je goed wil programmeren :niceone:

Miss maal je ook te hard op futiliteiten. Killgore heeft me met z'n simpele reply perfect verdergeholpen. No links to voorbeeldjes, no veel gespeak om nothing te zeggen.
Dit is een forum, als je geen kritiek kan verdragen, dan moet je maar gewoon niet posten. Als je denkt dat ik kritiek post om mensen te pesten dan heb je wel een heel verkeerd beeld van mij.

Verder was dat linkje enkel gepost om jou verder te helpen, omdat je daar een werkend voorbeeld kon terugvinden(met andere dingen in die linked list klasse die je zouden kunnen interesseren als je ook nog maar ietwat passie hebt voor het vak).

killgore

Legacy Member
Vich heeft wel degelijk gelijk ivm engelse termen te gebruiken. Ik zou zelfs zeggen dat het in het "amateurleven" even belangrijk of belangrijker is dan in het bedrijfsleven.

Een ander punt is simpelweg omdat het beter leest. Als ik nl code of en code voor mij krijg om te verbeteren vind ik persoonlijk zelfs de engelse eenvoudiger om te verbeteren. C++ (en vele andere talen) heeft enkel keywords in het engels, ga daar dan in voort.

KeaTs

Legacy Member
Vich heeft gelijk, en ik zou nog verder gaan. Engels gebruiken is evident, maar belangrijker nog: een goed ontworpen coding standard volgen kan de kwaliteit van uw code immens doen toenemen. Natuurlijk geeft niemand erom als je enkel voor jezelf werkt, maar het is een gewoonte die je veel kan opleveren. Besides, het feit alleen al dat je hier post annuleert je enige argument, want hoewel dit een nederlandstalig forum is zijn bijna alle programmeurs hier gewend in t engels te werken ;)

wlibaers

Legacy Member
killgore zei:
Een ander punt is simpelweg omdat het beter leest. Als ik nl code of en code voor mij krijg om te verbeteren vind ik persoonlijk zelfs de engelse eenvoudiger om te verbeteren. C++ (en vele andere talen) heeft enkel keywords in het engels, ga daar dan in voort.

Daar is natuurlijk wel een oplossing voor...

Code:
#define als if
#define zolang while
#define geval case
...

:evil:

(en nee, ik doe dat niet in mijn code)

Gelijkaardige toepassingen zijn bijvoorbeeld C op ALGOL68 doen lijken
http://minnie.tuhs.org/UnixTree/V7/usr/src/cmd/sh/mac.h.html
of Perl in het Latijn: http://www.csse.monash.edu.au/~damian/papers/HTML/Perligata.html
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan