Avatar billede shj Nybegynder
01. oktober 1999 - 20:17 Der er 5 kommentarer og
1 løsning

linked list hvordan gør man?

Hej, jeg har fået til opgave at lave en hægtet liste, bestående af 5 elementer af et en klasse person. De skal allokeres i memory derefter udskrives på skærmen og slettes igen i meory med delete funktionen. Koden her er hvad jeg har gjort af overvejelser, men den opfører sig mærkeligt når jeg vil kompilere den.

Hilsen Simon


#include <iostream.h>
#include <string.h>
class person {
public:
person(char *navn,int elevnr);
person(void);
void vis(void);
person *pointer;
private:
char navn[30];
int elevnr;
};
person::person(char *navn,int elevnr)
{
  strcpy(person::navn, navn);
  person::elevnr=elevnr;
}
void person::vis(void)
{
cout <<person::navn<<endl;
cout <<person::elevnr<<endl;
}
void main (void)
{
person *p = new person("simon",23);
person *hj_p;
if(p)
{
hj_p=p;
  while(hj_p)hj_p=hj_p->pointer;
      p->vis();
    hj_p=new person;
}
else
{
p = new person;
}

}
Avatar billede bjarke Nybegynder
02. oktober 1999 - 20:48 #1
Hej Simon

Dit program er noget uklart, det er ikke helt til at se alle steder, hvad du vil have at det skal lave. Når du programmerer, så tænk på, at programmet stort set uden ændringer altid skal kunne udvides uden problemer (uanset hvilken type udvidelse det drejer sig om - nye funktioner, flere poster, andet).

Jeg har en idé til programopbygning:

struct link
{
  char navn[MAX];  // #define MAX 30
  int nr;
  link* next;
};

class linklist
{
  private:
    link* first;
  public:
    linklist()
      { first = NULL; }
    void add();
    void display();
};
void add()
  {
  char name[MAX];
  int n;

  cout << "\nIndtast navn  : "; cin >> name;
  cout << "Indtast nr      : "; cin >> n;

  link* newlink = new link;
  strcpy(newlink->navn, name);
  newlink->nr = n;
  first = newlink;
  }

void main()
{
  for(int i=0; i<ANTAL_POSTER; i++)
    linklist.add();

  for(int i=0; i<ANTAL_POSTER; i++)
    linklist.display();
}

Så langt for nu - jeg skal ud at vaske op. God fornøjelse!
Avatar billede bjarke Nybegynder
02. oktober 1999 - 20:49 #2
Og så skal display-metoden selvfølgelig udskrive hele listen, og du skal tilføje en destructor (eller en decideret slet-metode).
Avatar billede bjarke Nybegynder
03. oktober 1999 - 00:20 #3
S'il vous plait (eller hvad det nu hedder) - en opgave fix og færdig til at aflevere (bortset fra, at jeg kom til at kalde det for linklist i stedet for person :-)

#include <iostream.h>
#include <conio.h>

#define MAX          30
#define ANTAL_POSTER  5

struct link
{
  char navn[MAX];
  int nr;
  link* next;
};

class linklist
{
  private:
    link* first;
    static int antal;
  public:
    linklist()
        { first = NULL; }
    void add();
    void display();
    void slet();
    int antalposter()
        { return antal; }
    link* firstpointer()
        { return first; }
    ~linklist()
        // Blot til illustration
        { cout << "\n\nNu slettes listen, da programmet afsluttes."; }
                     
};

int linklist::antal = 0;

void linklist::add()
  {
  char name[MAX];
  int n;

  antal++;

  link* newlink = new link;
  cout << "\nIndtast navn  : "; cin >> newlink->navn;
  cout << "Indtast nr    : "; cin >> newlink->nr;
  newlink->next = first;
  first = newlink;  // Det nye link gemmes forrest i listen
  }

void linklist::display()
  {
  int i=0;

  cout << "\n\nAntal poster i listen er " << antal;  // antal = linklist::antal
  for( link* pointer=first; pointer; pointer = pointer->next )
      {
      i++;
      cout << endl << i << " " << "Navn: " << pointer->navn << ", " << "Nummer: " << pointer->nr;
      }
  }

void linklist::slet()
  {
  link* temp = first;  // husk posten, så den kan slettes
  cout << "\n\nNu slettes: " << first->navn << ", " << first->nr;
  cout << endl << "Der er " << --antal << " poster tilbage";
  first = first->next;
  delete temp;
  }

void main()
{
  linklist liste;
  int i; // t‘ller

  clrscr();
  for(i=0; i<ANTAL_POSTER; i++)
    liste.add();

  liste.display();

  for(i=0; i<ANTAL_POSTER; i++)
    {
    liste.slet();
    liste.display();  // blot for illustrationens skyld
    getch();
    }
}

Avatar billede bjarke Nybegynder
03. oktober 1999 - 00:21 #4
Jeg lavede også en udvidelse med overloading af << operatoren, men den blev lidt langthåret (og lidt spaghetti-agtig), men skriv hvis du vil have den.
Avatar billede shj Nybegynder
03. oktober 1999 - 22:24 #5
Hej Bjarke, hva kan jeg sige, du er simpelthen for sej i c++. Jeg er lige kommet tilbage fra Jylland her Søndag aften, nu vil jeg i ro og mag studere de svar ,du har lagt ind.

hmmm jeg tror du synes at programmering er rigtigt sjovt :-) og det er rigtigt godt for mig.
Hilsen Simon
Avatar billede bjarke Nybegynder
04. oktober 1999 - 09:42 #6
God morgen!

Så har vi lige fået installeret Office2000 Premium her på arbejde - og det virker tilsyneladende uden problemer :-/

1) Tak-tak :-)
2) Jeps, jeg synes, at det er sjovt (synes du ikke?)
3) Ja, det er jo bare heldigt for dig
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester