Gå til innhold

Dynamiske datastruktuter: pekerlister[LØST]


Anbefalte innlegg

#include <iostream>
#include <cstring>
using namespace std;
struct Node
 {
 char Navn[31];
 Node* Nestepk;
 };
 
int main()
 {
 Node* Pk1 = new Node;
 strcpy(Pk1->Navn, "KARI");
 Node* Pk2 = new Node;
 strcpy(Pk2->Navn, "OLA");
 Pk2->Nestepk = NULL;  //Disse skjønner jeg ikke helt poenget med
 Pk1->Nestepk = Pk2;  // Jeg prøvde å kjøre programmet uten dem, og det funka.
 cout << Pk1->Navn << endl;
 cout << Pk2->Navn;
 Pk2 = 0;
 cin.get();
 return 0; 
 }

Her har vi koden, og jeg trenger jo som vanlig litt hjelp :p .

Som sagt så har jeg prøvd å kjøre programmet uten de to linjene som jeg har satt komentarer til, og det gir samme utskrift: KARI

OLA

Kan noen forklare hvorfor vi setter Pk1 til NULL og Pk2 til samme verdi(er det NULL Pk2 blir satt til da? Og i så fall, ville det ikke vært enklere å bare sette verdien til NULL isteden for å (for meg) gjøre koden mye vanskligere?)

 

EDIT: En teit setning...

Endret av zirener
Lenke til kommentar
Videoannonse
Annonse

En linked list (slik som det der er en forholdsvis simpel utgave av) inneholder en peker til neste (og evt. forrige) element i listen. Noe som peker til 0 (en "nullpeker") peker ikke til noe. Det betyr altså at ingen av dem har noe neste element -- de er begge det eneste elementet i listen(e).

 

Bjarne Stroustrup anbefaler forresten å bruke 0 framfor NULL.

Lenke til kommentar

#include <iostream>

using namespace std;


struct Node {
char const* data;
Node* next;
}; // struct Node


void skrivUt(Node* node)
{
do {
 cout << node->data << endl;
} while((node = node->next));
} // skrivUt


int main()
{
Node* a = new Node;

a->data = "a";
a->next = 0;

cout << "Første:" << endl;
skrivUt(a);

Node* b = new Node;
a->next = b;
b->data = "b";
b->next = 0;

cout << endl << "Andre:" << endl;
skrivUt(a);	

Node* c = new Node;
b->next = c;
c->data = "c";
c->next = 0;

cout << endl << "Tredje:" << endl;
skrivUt(a);	

return(0);
} // main()

 

Blir kanskje lettere å skjønne når man ser det visuelt:

http://nostdal.net/lars/forumstuff/1.png

http://nostdal.net/lars/forumstuff/2.png

http://nostdal.net/lars/forumstuff/3.png

 

Hvert bilde viser programmet i et stoppet stadie .. den grønne pila viser hvor programmet er stoppet. (Eller hvor det kommer til å fortsette.)

 

Som du sikkert kan gjette deg til, så pakker man slikt inn i klasser som tar seg av dette med å legge til nye elementer og passe på 0 og stuff.

Endret av søppel
Lenke til kommentar
Bjarne Stroustrup anbefaler forresten å bruke 0 framfor NULL.

Hvorfor det? Jeg har lest at det er bedre å bruke NULL(men tror vel Bjarne Stroustrup har mest rett)

Personlig så foretrekker jeg NULL, da det er mer oversiktlig. Og NULL er så vidt jeg vet mer "godtatt" en 0.

Lenke til kommentar
Jepp, veldig delte meninger om dette, og egentlig ingen sterke argumenter noen veier. Derfor jeg skreiv at Bjarne anbefalte, framfor at det var den riktige måten :)

Du kan få et argument av meg: Flere andre programmeringsspråk har NULL som en del av språket, og det er derfor "naturlig" å bruke NULL i C++ også. ;)

Lenke til kommentar

Et argument for 0:

 

Man "venner seg til" at 0 er det samme som false i sammenheng med typer som int og char.

 

Dette virker kanskje (?) mer naturlig for en som har vennt seg til dette.

int i = 100;
while(i--) {}

 

Er NULL et tall? Er det false? Når det gjelder boolske verdier og sanninger er det for meg mer naturlig å snakke om 0 og 1 (for alt annet).

Endret av søppel
Lenke til kommentar
Er NULL et tall? Er det false? Når det gjelder boolske verdier og sanninger er det for meg mer naturlig å snakke om 1, og 0.

Når det gjelder C++, så er NULL lik 0. Men i andre programmeringsspråk så betyr NULL udefinert og jeg liker derfor å bruke NULL i C/C++ også.

 

I C++ så finnes typen BOOL (mulig at typen er definert av Visual C++), og jeg synes der er mer oversiktlig enn å bruke typer som int o.l.

Lenke til kommentar
og jeg synes den er mer oversiktlig enn å bruke typer som int o.l.

 

*doh* Du misser totalt pointet.

 

Ville du byttet ut int med bool her?

 

#include <iostream>

using namespace std;


int main(int argc, char *argv[])
{
int i = 10;

do
 cout << "i: " << i << endl; 
while(i--);
 
return(0);
} // main()

 

"Nedtellingsprogram lissom".

 

Forresten, det er bool, ikke BOOL.

Lenke til kommentar
og jeg synes den er mer oversiktlig enn å bruke typer som int o.l.

 

*doh* Du misser totalt pointet.

 

Ville du byttet ut int med bool her?

 

#include <iostream>

using namespace std;


int main(int argc, char *argv[])
{
int i = 10;

do
 cout << "i: " << i << endl; 
while(i--);
 
return(0);
} // main()

 

"Nedtellingsprogram lissom".

 

Forresten, det er bool, ikke BOOL.

Jeg bruker selvfølgelig BOOL (bool) hvis det bare er snakk om TRUE eller FALSE.

 

Men uansett så er dette smak og behag.

Lenke til kommentar

Det gjør seff. jeg også .. men når det ikke er snakk om "bare" true eller false da?

 

(bool, true og false ... ikke BOOL, TRUE og FALSE)

 

Edit:

Jeg tror vi snakker om-hverandre-hulte-ti-bulter egentlig.

Endret av søppel
Lenke til kommentar
Når det gjelder C++, så er NULL lik 0. Men i andre programmeringsspråk så betyr NULL udefinert og jeg liker derfor å bruke NULL i C/C++ også.

Dette er faktisk et bra argument mot å bruke NULL også! Siden NULL ikke er udefinert og faktisk bare betyr 0 i C++, så har det jo ikke samme betydning som i språk som behandler NULL som en egen udefinert type.

 

Men når det er sagt så klarer jeg ikke helt å engasjere meg så veldig i NULL vs. 0 debattene. Er ganske likegyldig for meg hva folk bruker. Selv bruker jeg utelukkende 0, men det er en ren vanesak.

 

Når det gjelder BOOL / bool derimot er saken en helt annen. Koder man C++ bruker man ganske enkelt bool og ikke BOOL!

Lenke til kommentar
BOOL er winapi's bool. Så enkelt er det. Forskjellen på det som ligger bak er litt annerledes, men den brukes på samme måte; BOOL noe = true;

Det forklarer saken...

 

Jeg vet at standard C++ har bool, men jeg kikker for tiden på en USB-driver skrevet i Visual C++ (DLL) og header-filen bruker BOOL. Da var jeg ikke på bærtur likevel da jeg brukte BOOL. :)

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...