beenden von zwei verschachtelten Schleifen - Alternative zu goto



  • Hallo, wir haben von der Uni die Aufgabe gestellt bekommen eine Tiefensuch Algorithmus zu entwickeln für ungerichtete Graphen. Dabei bin ich auf das Problem gestoßen, das ich inerhalb einer for schleife, mittels einer if-Bedingung, die Schleife verlassen möchte.

      do{
        jump: 
        s = stack_node.top();
        stack_node.pop();
        
        for (int j : g.get_edges (s)) {
           
          if(p.at(j)<0){                //kontrolliert ob in vector p (Speicherung der Vorknoten) schon ein Wert geschrieben ist
            p.at(j) = s;                //ordnet dem Knoten j, s als Vorknoten in vector p zu
            stack_node.push(s);         //um später noch mal abzufragen, ob noch übrige Nachbarknoten nicht abgefahren wurden
            stack_node.push(j);         //nun ist j oberstes Element im Stack und wird als nächstes auf Nachbarknoten überprüft
            goto jump;      
          }
          
        }
       
    
          //hier kommt allerdings auch eine Fehlermeldung noch: expected primary-expression before '}' token
          	
      }  
      while (!stack_node.empty());
    

    Wir haben exterenen Code vorgeschrieben bekommen. get_edges returnt: list<int>.
    Deswegen hat bei mir folgendes Schema nicht wirklich funktioniert

    for(int i=0; i<n && bedingung, i++){
      if(...){
        bedingung = false;
      }
    }
    

    Nun zu meiner Frage. Gibt es hier eine bessere Lösung als goto bzw. wie verwende ich goto richtig?



  • @niklas_13 Das Keyword, dass du suchst ist: break

    Es gibt eigentlich immer eine bessere Alternative zu goto.



  • @Schlangenmensch
    also wenn ich das so programmiere:

      for (int j : g.get_edges (s)) {
           
          if(p.at(j)<0){                //kontrolliert ob in vector p (Speicherung der Vorknoten) schon ein Wert geschrieben ist
            p.at(j) = s;                //ordnet dem Knoten j, s als Vorknoten in vector p zu
            stack_node.push(s);         //um später noch mal abzufragen, ob noch übrige Nachbarknoten nicht abgefahren wurden
            stack_node.push(j);         //nun ist j oberstes Element im Stack und wird als nächstes auf Nachbarknoten überprüft
            break;      
          }
          
        }
    

    dann geh ich nicht aus dem if statment mit break, sondern aus der gesamten for Schleife
    Vielen Dank, stand da wohl grad auf dem Schlauch😅