Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » verkettete Liste

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ] [ 3 ] [ 4 ]
000
02.08.2004, 14:24 Uhr
~sebastian
Gast


Hallo!

ich bin C++ anfänger und soll eine verkettete Liste implementieren. Geht auch so weit. Nur das Einfügen an einer beliebeigen Stelle (also auch am Anfang und/oder Ende) bekomme ich nicht hin. Allgemein weiss ich wie das gehen sollte (Pointer verbiegen), aber die Syntax klappt nicht.
Hier der Code (wurde von anderen auch mit untertsützt):

C++:
#include <iostream>
using namespace std;

class Kette {

  private:
    int a,b,d;
    static int counter;
    static Kette* start;
    static Kette* ende;
    Kette* p;
    //Zeiger auf nächstes Element
    Kette* next;

  public:

    static void listeAusgeben() {
        Kette* p = start;
        while(p != NULL) {
            p->ausgabe();
            p = p->next;
        }
    }
    static void wertAusgeben(int n){
        Kette* p = start;
        while(n != 1) {
            p= p->next;
            n--;
        }
        p->ausgabe();
    }
    static void letztesAusgeben(){
        Kette* p = ende;
        p->ausgabe();
    }

    void ausgabe() {
        cout << "a: " << a << endl;
    }

    static void delAlles(){
        start = NULL;
    ende = NULL;
    counter = 0;
    }

    static void setCounter() {
        counter++;
    }

    void zaehler() {
        cout << "Anzahl der Objekte: " << counter << endl;
    }

    static void letztesLoeschen() {
       Kette* p = start;
       while(p->next->next != NULL) {
           p = p->next;};
       p->next = NULL;
       counter = counter-1;
    }

    static void erstesLoeschen() {
       Kette* p = start;
       start = p->next;
       counter = counter-1;
    }

    static void loesche(int index) {
        int i=2;
        Kette* p = start;
        if (index == 1) {erstesLoeschen();}
        if (index != 1) {
            while (i != index) {
                p= p->next;
            i++;
            };
            p->next = p->next->next;
        };
        counter = counter -1;
    }

    static void anfangEinf(int b) {
         // hier möchte ich einfügen?!?!?!?
    }

    //Konstruktor
    Kette(int werta) {
        counter++;
        a = werta;
        // Verkettete Liste
        if (start) {
            ende->next = this;
            ende = this;
        }
        else {
            start = this;
            ende = this;
        }
        this->next = NULL;
    }
};

//initialisieren der static Variablen
Kette* Kette::start = NULL;
Kette* Kette::ende = NULL;
int Kette::counter = 0;

int main() {
    int w,b,c,d,x;

// Liste aufbauen---------------------------------------------------
    Kette objekt1(3);
    Kette objekt2(4);
    Kette objekt3(8);
    Kette objekt4(9);
    Kette objekt5(10);
//------------------------------------------------------------------


// Ausgabe----------------------------------------------------------
    //komplette Liste ausgeben
    cout << "Liste ausgeben: " << endl;
    Kette::listeAusgeben();

    //Wert vom 1. Objekt ausgeben
    cout<<"Wert des 1. Objektes"<<endl;
    objekt1.ausgabe();

    //Wert eines beliebigen Elementes ausgeben
    cout<<"welches Element ausgeben? "; cin>>w;
    Kette::wertAusgeben(w);

    //letztes Element ausgeben
    cout<<"letztes Element: ";
    Kette::letztesAusgeben();
//------------------------------------------------------------------


// Größe der Liste--------------------------------------------------
    cout << "\nObjekte: ";
    objekt1.zaehler();
//------------------------------------------------------------------

// Werte Einfügen---------------------------------------------------

    // Wert am Ende einfügen
    //cout<<"Bitte Wert des neuen letzten Elementes eingeben ";cin>>c;
    //Kette end(c);

    // Wert am Anfang einfügen...
    cout<<"Bitte Wert des neuen ersten Elementes eingeben ";cin>>d;


    //komplette Liste ausgeben
    cout << "Liste ausgeben: " << endl;
    Kette::listeAusgeben();


//------------------------------------------------------------------

// Löschen----------------------------------------------------------
    //Element löschen
    cout<<"Welches Element soll gelöscht werden? ";cin>>b;
    cout<<"\nlösche jetzt Element"<<endl;
    Kette::loesche(b);

    //letztes Element löschen
    Kette::letztesLoeschen();

    //erstes Element löschen
    Kette::erstesLoeschen();

    //Liste komplett löschen
    Kette::delAlles();
    return 0;


//------------------------------------------------------------------


} ;



Ich hoffe Ihr könnt mir helfen!!
Danke

Sebastian
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
02.08.2004, 14:47 Uhr
Pablo
Supertux
(Operator)


Was genau geht nicht? Fehlermeldungen beim Ausführen oder Compilieren? An welcher Stelle?
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
02.08.2004, 15:02 Uhr
~Sebastian
Gast


Ich bekomme die Funktion:

C++:
static void anfangEinf(int b) {
}


nicht so definiert, so dass ich damit einer Wert (b) an den Anfang der Liste einfügen kann geschweige dann irgendwo anders einfügen kann. Allemeines Synthaxproblem!
Ich möchte diese dann mit:

C++:
cin>>d;
Kette::anfangEinf(d);


aus int main aufrufen und den Wert übergeben.

Sebastian
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
02.08.2004, 15:42 Uhr
Guybrush Threepwood
Gefürchteter Pirat
(Operator)


Wieso steckst du das in eine Klasse wenn du komplett alles statisch deklarierst?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
02.08.2004, 15:51 Uhr
~Sebastian
Gast


Meine Aufgabe war nur das erstellen einer Klasse für eine verkettete Liste mit mehereren Methoden zu erstellen. Diese möchte ich erstellen, habe dabei aber so meine oben genannten probleme. Wenn diese Funktion ohne static geht, bin ich auch sehr zufrieden. Ich kenne mich halt mit C++ nicht sonderlich aus.

Sebastian
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
03.08.2004, 12:37 Uhr
Zero



Schreibt erst mal nen gescheiten konstruktor, das heisst das beim Aufruf verschieden Sachen automatisch gesetzt oder initialisiert werden, wie z.B. der Pointer auf das neue Element. mit nem gescheiten Konstruktor sparste dir auch Arbeit. Der Konstruktor sieht bei mir so aus:


C++:

//-------------------------------default Konstruktor mit Initialisierungsliste

  Datenblock::Datenblock()
  : data(0), PointerNext(0)                     //ist das gleiche wie data = 0
{
  }


//-------------------------------------Konstruktor mit Parmameter


Datenblock::Datenblock(int datensatz)
: data(datensatz) , PointerNext(0)
{
   }


Helfen kann ich dir bei den Funktionen Append(anhängen von Datenblöcken), Remove,
first In,first out, Sortinsert, Ausgabe


Bei Interesse schicke ich dir meine ICQ No per email







Dieser Post wurde am 03.08.2004 um 12:40 Uhr von Zero editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
03.08.2004, 12:54 Uhr
~sebastian
Gast


@zero
Das etwas mit dem Konstruktor nicht stimmt habe ich mir fast gedacht. Ich werde das mal ausprobieren. Aber wenn ich das jetzt alles umändere weiß ich gar nicht mehr was zu tun ist. Der Code sah eigentlich recht einfach aus. ICQ geht bei mir nicht, bin auf Arbeit. für mich wäre jetzt am interessantesten, wie du mit diesen Konstruktoren die Kette aufbaust und dann Elemente an beliebiger Stelle anhängst.
Wenn per mail lieber als Forum kann ich dir eine Mail schreiben.

Gruß Sebastian
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
03.08.2004, 13:26 Uhr
Zero



Ahh noch einer der auf der Arbeit ist und mit einem Proxy zu kämpfen hat

Kannst dich ruhig hier Registrieren und dann die Seite in die Favoriten setzen



Ich klopp ein kleines Beispiel hier mal rein, hoffentlich hilfts dir und hoffentlich kannst du das alles Interpretieren:


Der Abschnitt wo ich für einen neuen Knoten Specher allokiere würde auch als Beispiel für RedDevil in Frage kommen weil er da sieht wie es verwendet wird.




C++:

//---------------------------------------------------------------------------

#pragma hdrstop
#include <iostream.h>
#include "File1.h"
//---------------------------------------------------------------------------

#pragma argsused
int main()
{
  Datenblock temp;
  Liste l;
  int i = 1;
  int trash;

  while ( i <= 10)
  {
  cin>>trash;
  l.sortinsert(trash);
  i++;
  }


  l.ausgabe();

  cin>>trash;
}
//---------------------------------------------------------------------------


Datenblock::Datenblock()     //Default Konstruktor mit Initialisierungsliste
: data(0),next(0)
{
}


Datenblock::Datenblock(int datensatz)      //Konstruktor mit Parameter
: data(datensatz),next(0)
{
  }

Datenblock::~Datenblock()
{
  //Destruktor der Klasse Knoten
}


void Datenblock::ausgabe()
{
cout<<"Daten: "<<data<<endl;
}



//************************************Funktionsdefinitionen Klasse Liste


Liste::Liste()
{
head = new Datenblock;   //Anlegen
tail = new Datenblock;


head->next = tail;
tail->next = tail; //Auf sich selbst zeigen da tail Listenende kennzeichnet
}


Liste::~Liste()
{
cout<<"Destruktor der Klasse Liste"<<endl;

while ( head != head->next)
{
  Datenblock *tempadresse = head; //eigentliche Adresse temporär speichern
  head = head->next;   //überschreibt head mit nächster Knotenadresse
  delete tempadresse;
}
delete head;
}
//******************************************************************


bool Liste::sortinsert(int datensatz)
{
static int i = 0;

Datenblock *tempblock;
tempblock = new Datenblock;  //Speicher für neuen Datenblock allokieren

tail->data = datensatz;

for ( ; a != b; a = a->next)
{
  if (a->data > datensatz)        //Sortieren
  {
   temp->data = datensatz;
      b->next = temp;
   temp->next = b;
   i++;
  }
  else  
  {
     //Abbruchbedingung  "head = head->next"

  tail->next = tempblock;
  tempblock->next = tempblock;
  tail = tempblock;
   i++;
// }
}
  cout<<"Index: "<< i <<endl;
  return true;
}




void Liste::ausgabe()
{
Datenblock *a;

a = head->next;

for (; a != a->next; a = a->next)
{
  a->ausgabe();
}
}




Dieser Post wurde am 03.08.2004 um 13:32 Uhr von Zero editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
03.08.2004, 13:35 Uhr
Zero



Wenn dir das nich hilft dann warte bis ich daheim bin, hab hier auf meinem laptop nur das nötigste, hab daheim sehr gute referenzen
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
03.08.2004, 13:42 Uhr
~sebastian
Gast


So langsam verstehe ich was du meinst, aber umgesetzt beziehungsweise angegliche an meine Listen-Klasse bekomme ich das nicht. Ich habe mich bis jetzt nicht ernsthaft mit C++ beschäftigt und bin somit ein richtiger Anfänger, was aber an meine Aufgabenstellung leider nichts ändert. Kannst du das auf meinen Fall ein enig spezifizieren?
Gruß

sebastian
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ] [ 3 ] [ 4 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: