Verkettete Listen, Zeiger und delete



  • Hallo zusammen!

    ich habe zwei Fragen:

    1. Ich erstelle eine einfach verkettete Liste um Punkdaten zu speichern wie folgt:

    struct vertex {
      float x;
      float y;
      vertex* next;
    };
    
    struct vertex* first_vertex = NULL;
    struct vertex* last_vertex  = NULL;
    struct vertex* temp_vertex;
    
    void append_vertex (float x, float y)
    {
      temp_vertex = new vertex;
    
      temp_vertex->x = x;
      temp_vertex->y = y;
      temp_vertex->next = NULL;
    
      cout << "x : " << temp_vertex->x << " y: " << temp_vertex->y << endl;
    
      if (first_vertex == NULL) first_vertex = temp_vertex;
      else last_vertex->next = temp_vertex;
    
      last_vertex = temp_vertex;
    }
    

    Leider hat mir die Suchfunktion im Bezug auf das Löschen der ganzen Liste
    nicht geholfen. Kann mir jemand einen Ansatz nennen? Das Löschen von
    "temp_vertex" kann wohl kaum ausreichend sein, was ist mit den andern Zeigern
    in der Liste?

    2. ich lege Speicherplatz für ein zweidimensionales Array an:

    float (*mesh)[2] = new float [numofverts][2];
    

    wobei die Variable 'numofverts' bereits einen Wert hat. Wie muß dieser Speicherplatz jetzt freigegeben werden?

    Hoffe Ihr könnt mir weiterhelfen

    GreetZ

    ReSeT



  • ReSeT schrieb:

    Leider hat mir die Suchfunktion im Bezug auf das Löschen der ganzen Liste
    nicht geholfen. Kann mir jemand einen Ansatz nennen?

    Schreibe doch einen Destruktor von vertex, der next löscht.
    Warum nimmst du eigentlich nicht std::list<>?



  • // Löschen der Liste ist einfach: Eine Liste lösche ich, indem ich die Restliste lösche und dann den Kopfknoten.
    // Eine leere Liste hat keine Restliste, aber auch keinen Kopfknoten, muß daher nicht gelöscht werden.
    void delete_list(vertex* v) {
      if (v) {
        delete_list(v->next);
        delete v;
      }
    }
    

    Als Übung kannste das ja in eine Iteration überführen



  • Als Übung kannste das ja in eine Iteration überführen.

    lol, ich versuche seit einiger Zeit, Listen und Rekursion zu verstehen,
    kann auch nicht nachvollziehen, was Dein Code macht und da sagst Du mir sowas.

    Wie kann überhaupt die Zeile "delete v" ausgeführt werden, wenn die Funktion sich
    bis zum Listenende immer selbst aufruft und dann abbricht?

    GreetZ

    ReSeT <--- bittet um Erklärung



  • ReSeT schrieb:

    Wie kann überhaupt die Zeile "delete v" ausgeführt werden, wenn die Funktion sich
    bis zum Listenende immer selbst aufruft und dann abbricht?

    Das ist gar nicht so schwer

    void delete_list(vertex* v) 
    { 
      //hier wird gefragt ob v leer ist
      if (v) 
      { 
        //ist dem nicht so, ruft delete_list sich wieder selber auf
        delete_list(v->next); 
        //wenn die Rekusion am ende der liste ist, also v->next leer ist,
        //dann wird das erste mal delete ausgeführt
        delete v; 
        //die Funktion ist beendet und springt wieder in die vorher aufgerufene
        //zurück usw.
      } 
    }
    

    Hoffe das war verständlich 🙂



  • Da ich jetzt keine Lust habe, Rekursion zu erklären schieb ich einfach die iterative Version nach:

    void delete_list(vertex *v) {
      while (v) {
        vertex *temp = v->next;
        delete v;
        v = temp;
      }
    }
    

    (rekursiv wäre hier auch unangebracht)


Anmelden zum Antworten