Gå til innhold

SOLVED Struck,pekere,linkede kjeder i c++


Anbefalte innlegg

Hei,

Sliter litt med en oppgave etter en lang sommerferie, virker som om skallen har fått noen bad sectors i området hvor c++ kunnskapene lå lagret.

 

Mange av dere ser sikkert ut ifra koden hva som skal utføres, men jeg skal prøve å forklare oppgaven kort:

 

Jeg skal lage en struct med følgende egenskaper: navn,type og verdi.

Denne første variabelen skal kalles v og være første noden i en linket kjede.

 

Så skal jeg komponere en menyliste med følgende alternativer:

 

/*

1. Legg til nytt element i lista

2. List ut alle elementer i lista

*/

 

Skal da forhåpentligvis få ut noe slikt:

 

/*

x er av typen int og har verdien 3

y er av typen double og har verdien 3,14

d er av typen int og har verdien 18

End of list.

*/

 

Til slutt skal jeg legge inn et tredje menyvalg som gjør at jeg kan endre de forksjellige verdiene i de forskjellige nodene, men så langt har jeg ikke kommet enda.

 

Så langt har jeg kommet, fikk kompilert hele programmet i stad uten errors men av en eller annen grunn så krasjet programmet hver gang. Så når har jeg tuklet litt til og endt opp med noen errors igjen.

 

 

#include <iostream.h>

 

struct node

{

char navn [15];

char type [6];

double verdi;

node *nxt;

};

 

node *start_v = NULL;

 

void main(void)

{

 

int choice;

 

 

cout << "Tast inn navn på variabel: " ;

cin >> start_v->navn;

cout << "Bestem typen variabel (int/double): " ;

cin >> start_v->type;

cout << "Tast inn verdien til variabelen: " ;

cin >> start_v->verdi;

start_v->nxt = NULL;

 

cout << " "<< endl;

cout << "1. Legg til et nytt element i lista " << endl;

cout << "2. List ut alle elementer i lista " << endl;

cin >> choice;

cout << " "<< endl;

 

if(choice = 1)

void add_node_at_end ();

 

else

{

void viewList ();

}

 

 

 

}

 

void add_node_at_end ()

{

node *temp, *temp2; //midlertidige pekere

 

//reserverer space til ny node og fyller inn med data

temp = new node;

cout << "Tast inn navn på variabel: " ;

cin >> temp->navn;

cout << "Bestem typen variabel (int/double): " ;

cin >> temp->type;

cout << "Tast inn verdien til variabelen: " ;

cin >> temp->verdi;

temp->nxt = NULL;

 

//setter opp link til denne noden

if (start_v == NULL)

start_v = temp;

 

else

{

temp2 = start_v; //Vi vet at denne ikke er null, listen er ikke tom da brukeren må ha tastet inn v data-verdier for å komme til menyen.

 

while (temp2->nxt!= NULL)

{

temp2 = temp2-> nxt; //Flytter til neste link i kjeden

}

 

temp2->nxt = temp;

}

 

}

 

void viewList ()

{

temp = start_v;

do

{

if (temp == NULL)

cout << "End of list" << endl;

else

{ // Viser detaljer for hva temp peker til

cout << "Navn : " << temp->navn << "Type : " << temp->type << "Verdi : " << temp->verdi << endl;

cout << endl; // Blank line

 

// Flytter til neste node (om den eksitserer)

temp = temp->nxt;

}

}

while (temp != NULL);

}

 

Endret av Desses
Lenke til kommentar
Videoannonse
Annonse

Det du skriver her går vel bare såvidt i C++ :p

 

Du burde lage en egen klasse som heter linkedlist eller noe, og legge til noder i den, gjør koden mye enklere å skrive, forstå og endre ved et senere tidspunkt

 

 

LinkedList.h

class LinkedList
{
private:
   Node *fnode;
   Node *lnode;
   Node *current;

public:
   LinkedList();
   Node *Neste();
   void Reset();
   void SettInn(Node *);
};

class Node
{
public:
   char navn[15];
   char type[6];
   double verdi;
   Node *neste;
   Node();
   Node(char* nvn, char* typ, double v);
};

 

LinkedList.cpp

#include "linkedlist.h"

LinkedList::LinkedList()
{
   fnode = NULL;
   current = NULL;
   lnode = NULL;
}

void LinkedList::SettInn(Node *n)
{
   if(fnode == NULL)
   {
       fnode = n;
       lnode = n;
   }
   else
   {
       lnode->neste = n;
       lnode = n;
   }
}

Node *LinkedList::Neste()
{
   if(current == NULL)
       return (current = fnode);
   else
       return (current = current->neste);
}

void LinkedList::Reset()
{
   current = NULL;
}

Node::Node()
{
   navn = "";
   type = "";
   verdi = 0;
}

Node::Node(char *nvn, char *typ, double v)
{
   navn = nvn;
   type = typ;
   verdi = v;
}

 

I hovedfila di da :

 


#include "linkedlist.h"

Node *n = NULL;

LinkedList *a = new LinkedList();

a->SettInn(new Node("test1", "test", 5.2f));
etc etc

while((n = a->Neste()) != NULL)
{
   printf("%s er av typen %s, og har verdien %f\n", n->navn, n->type, n->verdi);
}

 

Eller noe i den duren...

Du kan også bruke struct i node, istedenfor å bruke class, men vil ha liten betydning ;)

 

(Jeg garanterer ikke at denne koden fungerer, men da ser du noe i hvilken dur det skal gjøres)

Endret av CronoMan
Lenke til kommentar

Har funnet noen enkle feil som å glemt å declarere temp i viewList funksjonen, og brukt enkelt = tegn i menyvalget. Sånne slurvefeil gjør mye skade :)

 

CronoMan: Klasser er nok den beste løsningen her i grunn, men i og med at vi ikke var bedt om å bruke det, valgte jeg å følge oppgaveteksten.

Snakket med noen med litt mer erfaring enn meg og de forklarte på samme måte som deg, ved å bruke eksisterende lister osv..

 

Her er en fungerende Adder,viewer,editor og front deleter:

 

#include <iostream.h>  //cout << "\x91 æ\x92 Æ \x9B ø\x9D Ø\x86 å\x8F Å";


struct node
{
char navn [15];
char type [6];
double verdi;
node *nxt;
};

static void add_node_at_end();
static void viewList();
static void deleteFrontNode();
node *finnIndex(int index);

node *start_v = NULL;

void main(void)
{

int choice;
int indexNr;
int endreEgenskap;
node *pNode;

do
{
 cout << "****************************************** "<< endl;
 cout << "1. Legg til et nytt element i lista " << endl;
 cout << "2. List ut alle elementer i lista " << endl;
 cout << "3. Slett f\x9Brste node i lista" << endl;
 cout << "4. Endre egenskap p\x86 variabel" << endl;
 cout << "5. Avslutt" << endl;
 cin >> choice;
 cout << "****************************************** "<< endl;
 
 if(choice == 1)//Bruk aldri enkelt = tegn her, det fører til store problemer. Leste inn 1 som verdi og løkken kom aldri til valg 3, derfor fikk du aldri avsluttet programmet.
 	
 	add_node_at_end ();

 else if(choice == 2)
 {
 	viewList ();
 }
 
 else if(choice == 3)
 {
 	deleteFrontNode ();
 }

 else if(choice == 4)
 {
 	viewList ();
 	cout << "Hvilken variabel vil du endre? (tast inn index nr.) "<< endl;
 	cin >> indexNr;
 	pNode = finnIndex(indexNr);
 	if (pNode != NULL) {
   cout <<"Hvilken egenskap vil du endre p\x86 variabel nr " << indexNr <<" ?"<<endl;
   cout <<"(Tast 1 for NAVN | Tast2 for TYPE | Tast 3 for VERDI) "<<endl;
   cin >> endreEgenskap;
   cout << "Tast inn data for \x9Bnsket egenskap:" <<endl;
 	
   if (endreEgenskap == 1)
   {
   	cin >> pNode->navn;
   	cout <<"Egenskapen er endret"<<endl;
   }
   else if (endreEgenskap == 2)
   {
   	cin >> pNode->type;
   	cout <<"Egenskapen er endret"<<endl;
   }

   else if(endreEgenskap == 3) 
   {
   	cin >> pNode->verdi; //Dårlig funksjonalitet i cin gjør at programmet går i en evig løkke om man taster inn bokstaver for verdi som er definert char.
   	cout <<"Egenskapen er endret"<<endl;
   }
 	}
 	else
 	{
   cout << "Fant ingen variabler med dette index nummeret"<<endl;
 	}


 }

 else if(choice != 5)//Mens choice er ulik 5, dvs ALT untatt 5.
 {
 	cout << " Ugyldig menyvalg! "<<endl;
 }

}
while (choice != 5); 

}

static void add_node_at_end ()
{
node *temp, *temp2; //midlertidige pekere

//reserverer space til ny node og fyller inn med data
temp = new node;
cout << "Tast inn navn p\x86 variabel: ";
cin >> temp->navn;
cout << "Bestem typen variabel (int/double): "; 
cin >> temp->type;
cout << "Tast inn verdien til variabelen: ";
cin >> temp->verdi;
temp->nxt = NULL;

//setter opp link til denne noden
if (start_v == NULL)
 start_v = temp;

else
{
 temp2 = start_v; //Vi vet at denne ikke er null, listen er ikke tom.
 
 while (temp2->nxt!= NULL)
 {
 	temp2 = temp2-> nxt; //Flytter til neste link i kjeden
 }

 temp2->nxt = temp;
}

}

static void viewList ()
{
node *temp;
temp = start_v;
int index = 0;
do
{  
 if (temp == NULL)
 cout << "End of list" << endl;
 else
 {  // Viser detaljer for hva temp peker til
 	cout << ++index <<": " << temp->navn << " er av typen " << temp->type << " og har verdien " << temp->verdi << endl;
 	cout << endl;       // Blank line

     // Flytter til neste node (om den eksitserer)
 	temp = temp->nxt;
 }
}
while (temp != NULL);//så lenge temp er alt annent enn NULL.(Ulik NULL)
}

static void deleteFrontNode() //Å slette på slutten, eller midten, er mye vanskeligere.
{

node *temp;
temp = start_v;
start_v = start_v->nxt;
delete temp;

cout <<" F\x9Brste node i listen er slettet!"<<endl;
cout <<" Velg 2 for \x86 se den oppdaterte listen."<<endl;
}

node *finnIndex(int index)
{
node *ret = NULL;
node *pNode = start_v;
int i = 1;

while (pNode != NULL && i <= index)
{
 if (i == index)
 {
 	ret = pNode;
 }
 pNode = pNode->nxt;
 i++;
}

return ret;
}

Endret av Desses
Lenke til kommentar

Jeg har bare noen kommentarer:

I henhold til standard C++, SKAL main returnere en int, dvs int main(int argc, char** argv).

 

Hvis du har mange if (variabel == en numerisk verdi) else if ... er det lettere å bruke en

switch statement.

 

Prøv for all del å unngå å bruke mange globale variabler. Det kan fort bli rot.

 

I følge standard er inklude filen iostream og ikke iostream.h.

 

Hvis læreboka di har mange eksempler med void main, iostream.h, iomanip.h, bør man kanskje gå til anskaffelse av en mer oppdatert bok.

 

Jeg antar at du bruker en litt eldre utgave av Microsoft Visual Studio, som er like kompatibel til ansi C++ standarden, som sukker i en motor.

 

Det her høres kanskje litt bryskt ut, men det er bedre å lære seg noe riktig med en gang, enn å lære av seg uvanene.

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...