Ga naar inhoud

C Inlezen dubbelgelinkte lineaire lijst


anoniem

Aanbevolen berichten

Ik ben bezig een programma te schrijven voor school, maar nu het af is krijg ik de opmerking van de leraar dat het anders moet. Opm:Een lineaire lijst is een POINTER naar het eerste element. Het is NIET een element met twee pointers, een naar het begin en een naar het eind. Is er iemand die mij een beetje de goede richting in kan sturen zodat ik de lijst wel goed inlees want ik weet niet hoe dit op te lossen en ik kan pas over drie weken (na de tentamens) weer bij de leraar terecht. Hieronder het stuk code dat ik heb geschreven over het inlezen vd lijst. [code:1:25c5ca5976]void main(void) { char lijst[200], Bal2LinLijst[200]; int lengte, i; char Stop; TREE Begin, Eind, Nieuw, Oorspr; // lees in printf("\nGeef een lijst in:"); scanf("%s",&lijst); lengte = strlen(lijst); if (lengte == 0) return; Begin = NULL; Eind = NULL; // Een lineaire lijst is een POINTER naar het eerste element. // Het is NIET een element met twee pointers, een naar het begin // en een naar het eind. i=0; while(lijst[i] != '\0') { Nieuw = (TREE)malloc(sizeof(TREL)); Nieuw -> w = lijst[i++]; Nieuw -> r = NULL; if (Begin == NULL) { Begin = Nieuw; Nieuw -> l = NULL; } else { Eind -> r = Nieuw; Nieuw -> l = Eind; } Eind = Nieuw; } [/code:1:25c5ca5976] Als jullie meer willen weten over de opdracht of de overige code ook willen hebben laat het maar weten dan post ik er die ook bij.
Link naar reactie
Ik ken de term "lineaire lijst" niet, maar als ik zo naar je code kijk heb je het over een "Linked List". Een Linked List is een ketting van elementen ("Nodes"). Iedere Node heeft een (of meer) data velden een een pointer naar het volgende element in de ketting. De pointer in de laatste node in de lijst heeft als waarde NULL zodat je weet dat je het einde van de ketting hebt bereikt. Wat jij gemaakt heb is een "double linked list". Iedere node in jouw voorbeeld heeft 2 pointers, eentje die verwijst naar de volgende node en eentje die terugwijst naar de vorige. Wat je leeraar bedoelt is denk ik dat je een "single linked list" moet maken, dus alleen gebruik maken van de "r" pointer en de "l" pointer niet gebruiken.
Link naar reactie
[quote:3ab1bebf4f] Ik ken de term "lineaire lijst" niet, maar als ik zo naar je code kijk heb je het over een "Linked List". Een Linked List is een ketting van elementen ("Nodes"). Iedere Node heeft een (of meer) data velden een een pointer naar het volgende element in de ketting. De pointer in de laatste node in de lijst heeft als waarde NULL zodat je weet dat je het einde van de ketting hebt bereikt. Wat jij gemaakt heb is een "double linked list". Iedere node in jouw voorbeeld heeft 2 pointers, eentje die verwijst naar de volgende node en eentje die terugwijst naar de vorige. Wat je leeraar bedoelt is denk ik dat je een "single linked list" moet maken, dus alleen gebruik maken van de "r" pointer en de "l" pointer niet gebruiken. [/quote:3ab1bebf4f] De opdracht is: schrijf een programma dat: a) lees een dubbelgelinkte lineaire lijst in b) converteer deze lijst naar een binaire boom c) converteer deze binaire boom weer terug naar een lineaire lijst d) breek de lijst af en toon aan dat er 0 bytes verloren zijn gegaan. en daarvoor moet ik dit datatype gebruiken: [code:1:3ab1bebf4f]typedef struct kn { struct kn *l,*r; int w; }TREL, *TREE;[/code:1:3ab1bebf4f] Wat ik hierboven liet zien was dus puur het inlezen, maar ik dacht dat dit toch dubbelgelinkt is maar volgens de leraar is dat dus niet goed. Als ik het goed begrijp moet ik dan compleet nieuwe code schrijven
Link naar reactie
Probeer dit eens:[code:1:00e7af8da2]struct node { char letter; node *prevnode, *nextnode; }; void main(void) { node *firstnode, *lastnode, *newnode; char lijst[200]; int i; printf("\nGeef een lijst in:"); scanf("%s", &lijst); if (strlen(lijst) == 0) { return; } firstnode = NULL; lastnode = NULL; i = 0; while (lijst[i] != '\0') { newnode = new node; newnode -> letter = lijst[i]; newnode -> prevnode = lastnode; newnode -> nextnode = NULL; if (firstnode == NULL) { firstnode = newnode; } lastnode = newnode; i = i + 1; } }[/code:1:00e7af8da2]Ik heb t niet zelf gecompileerd dus typfoutjes moet je er zelf nog even uithalen.
Link naar reactie
Ik hoop niet dat je tentamen over C++ gaat, want dan heb je denk ik een probleem: [quote:d1a92bf128] [code:1:d1a92bf128] void main(void) ..... if (lengte == 0) return; [/code:1:d1a92bf128] [/quote:d1a92bf128] [i:d1a92bf128]void main()[/i:d1a92bf128] mag nooit, het is [b:d1a92bf128]int main()[/b:d1a92bf128]. [i:d1a92bf128]return;[/i:d1a92bf128] moet dan ook zijn [b:d1a92bf128]return 0;[/b:d1a92bf128](of elke andere exit-code). Overigens is de code die je geeft meer C code dan C++, aangezien je de gebruikte variabelen aan het begin van de functie declareert en niet wanneer je ze nodig hebt, je printf() etc gebruikt ipv std::cout en je malloc() gebruikt ipv new. Als dit echt in C++ moet worden gemaakt, dan zou ik templates gebruiken ipv structs :)
Link naar reactie
Afgezien van het feit dat je natuurlijk helemaal gelijk hebt, als ik kijk naar de opdracht zit hij nog redelijk aan het begin van de cursus en begint hij nou aan het onderdeel data structures. Ik kan me best voorstellen dat zo´n cursus begint op de meest eenvoudige manier en dat de aandacht vooral gaat naar het gestructureerd gebruik van data en minder naar de compiler specieke implementatie. Ik vermoed ook dat templates verderop in de cursus wel aan bod zullen komen.
Link naar reactie
[quote:1d5c097605] Afgezien van het feit dat je natuurlijk helemaal gelijk hebt [/quote:1d5c097605] 8) :wink: Om toch even serieus te blijven, als dit een cursus C++ is, dan is het geen goede cursus. Veel wordt nog op de C-manier gedaan (variabelen declareren aan het begin van een functie, etc). Ook het gebruik van structs is niet aan te raden in C++. Okee, een struct is gelijk aan een class, behalve dat de default-access public is ipv private, maar zo leer je toch een IMHO foute methode aan. De access zou eigenlijk altijd moeten worden opgegeven. Hetzelfde met het gebruik van printf() en scanf(). Het kan wel, maar c++ heeft hiervoor veel betere (lees typesafe) methodes. Ook dat void main() is een doodzonde eigenlijk :)
Link naar reactie
[quote:cfb60e5212="AndreasV"]Ook dat void main() is een doodzonde eigenlijk :)[/quote:cfb60e5212] Hehehe, volg je de nieuwsgroep "comp.lang.c" wel eens? Daar zijn zeer regelmatig ellenlange discussies over precies dit onderwerp. Er zijn duidelijk 2 kampen met beide hun eigen argumenten. Er is echter nog nooit een eindconclusie getrokken. Een van de oorzaken dat dit onderwerp steeds weer de kop op steeks is het feit dat er een aanzienlijke hoeveelheid studieboeken in omloop is die void main() gebruiken in hun voorbeelden. Er groeien dus hele volkstammen programmeurs op met het idee dat dat mag. Roei dat dus maar weer eens uit :wink:
Link naar reactie
Jeps daar lurk in zo af en toe eens. In C is het ook nog steeds een punt van discussie of void main() mag, want ik geloof dat er ooit een standaard in omloop is geweest waarin stond dat main() een returntype moest hebben die het systeem verlangt (erg vrij vertaald :)). De C++ standaard is trouwens erg duidelijk hierover, alleen [b:0c0366c880]int main()[/b:0c0366c880] is toegestaan. Aangezien de topic-titel duidelijk [b:0c0366c880]C++[/b:0c0366c880] zei, dacht ik het maar even te zeggen :).
Link naar reactie
Dit is het eerste semester dat ik bezig ben met c++, verder altijd c gehad. Maar wij leren het op school toch echt zo, void main() is zelfs door de leraar aangeraden te gebruiken, en wat betref variabele declaratie dat is wel verteld dat het mag op het moment dat het nodig is maar dat het vaak toch overzichtelijker is om het vooraf te doen en dus alle declaraties bij elkaar te houden. Ik weet niet of dit een slechte manier van programmeren is? Maar als jullie suggesties hebben hoie ik het beter kan doen dan graag. Maar om even on topic te komen, klopt het verder allemaal wel wat ik aan het doen ben?
Link naar reactie
[quote:3abb136309="AndreasV"] Overigens is de code die je geeft meer C code dan C++, aangezien je de gebruikte variabelen aan het begin van de functie declareert en niet wanneer je ze nodig hebt, je printf() etc gebruikt ipv std::cout en je malloc() gebruikt ipv new. Als dit echt in C++ moet worden gemaakt, dan zou ik templates gebruiken ipv structs :)[/quote:3abb136309] Ik moet deze struct gebruiken want die is gegeven! En dat de code meer op c lijkt dan op c++ komt denk ik doordat dit pas de tweede c++ opdracht is die ik aan het maken ben.
Link naar reactie
[quote:cf8803630a="rrrrob"]Dit is het eerste semester dat ik bezig ben met c++, verder altijd c gehad. ... en wat betref variabele declaratie dat is wel verteld dat het mag op het moment dat het nodig is maar dat het vaak toch overzichtelijker is om het vooraf te doen en dus alle declaraties bij elkaar te houden. Ik weet niet of dit een slechte manier van programmeren is? Maar als jullie suggesties hebben hoie ik het beter kan doen dan graag.[/quote:cf8803630a] Variabelen kun je in C++ het beste declaren binnen de scope waarin je ze nodig hebt. Eenvoudig gezegd komt dit neer op declaratie tussen {} waarbinnen je de variabelen nodig hebt. Wat je verder zou kunnen doen om het geheel wat overzichtelijker te houden is het volgende: beschouw de Linked List als een zogenaamd Abstract Data Type (ADT). Zoek hier maar eens naar met Google. Mag je trouwens classes gebruiken of moet je eigenlijk C programmeren met C++ taalelementen?
Link naar reactie
[quote:891fc1a463="Kamikaasje"][quote:891fc1a463]Maar om even on topic te komen, klopt het verder allemaal wel wat ik aan het doen ben?[/quote:891fc1a463]Had je de code nog bekeken die ik gepost had? De opmerking van je leeraar was dat hij wilde dat je een pointer gebruikte naar de list. Die code doet dat. Misschien is dat dus wat hij wil.[/quote:891fc1a463] Ja,en het werkt ook nog, ik ga dr morgen mee verder. om nog even terug te komen op c / c++ Ik heb net ff zitten msn'en met een klasgenoot en die zegt dat er een fout in de studiehandleiding zit en dat er daardoor twee c opdrachten tussen de c++ opdrachten zijn gekomen (dat was in de les verteld, zat ik zeker te slapen ofzo want ik heb het niet meegekregen :oops: ). Maar het is dus de bedoeling dat opdracht 2 (deze dus) en opdracht 7 gewoon in c worden geschreven en niet in c++. Dus de lessen zijn nog niet zo slecht als jullie dachten, alleen de voorbereiding vd leraar is wat minder :wink: Ik heb ook maar meteen de titel veranderd dan is dat ook weer duidelijk voor iedereen.
Link naar reactie
  • 4 weken later...
Om nog even terug te komen op deze opdracht, ik heb nu aan de leraar gevraagd wat nu het precieze probleem was, en hij gaf als antwoord: Jij denkt dat een Lineaire Lijst een Blokje is met twee pointers, een naar het eerste en een naar het laatste element. Echter, een ll. is een pointer naar het eerste element. Vandaar gaat er een right pointer naar het tweede element en zo verder. Bij een dubbellink (in deze opdracht dus ook) gaat er dan ook elke keer een pointer naar links. Ik ga vanmiddag hier mee aan de gang, zijn er nog mensen die tips hebben hoe ik dit het gemakkelijkste kan om / her schrijven?
Link naar reactie

Om een reactie te plaatsen, moet je eerst inloggen

Gast
Reageer op dit topic

×   Geplakt als verrijkte tekst.   Herstel opmaak

  Er zijn maximaal 75 emoji toegestaan.

×   Je link werd automatisch ingevoegd.   Tonen als normale link

×   Je vorige inhoud werd hersteld.   Leeg de tekstverwerker

×   Je kunt afbeeldingen niet direct plakken. Upload of voeg afbeeldingen vanaf een URL in

  • Populaire leden

    Er is nog niemand die deze week reputatie heeft ontvangen.

  • Leden

    Geen leden om te tonen

×
×
  • Nieuwe aanmaken...