[C/C++] Verkettete Listen - Aufgabe

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von AfG-RnB, 24. Juni 2009 .

  1. 24. Juni 2009
    Verkettete Listen - Aufgabe

    Hi Leute, ich schreibe Morgen eine Klausur in Programmieren mit C.
    Ich bin mit einigen Themen mehr oder wenig durch - nur scheitere ich jedes Mal an den verketteten Listen. Habe eine Klausur vom letzten Semester mit folgender Aufgabe. Dafür gab es 20 Punkte von 90 insg.
    Irgendwie komme ich nicht auf die Lösung vllt. kennt sich jemand damit aus??
    Bitte um Hilfe BW geht raus ;-)




    Aufgabenstellung:

    Code:
    Aufgabe 6: Listen (20 Punkte) (von 90)
    Implementieren Sie im ADT liste aus der Vorlesung/ Übung (siehe unten) eine Funktion mit 
    folgendem Prototyp: 
    // teilt die liste li0 so, dass alle Elemente, die (lexikografisch) kleiner 
    // oder gleich dem ersten Element in li0 sind in li1 landen, alle anderen 
    // in li2; li0 ist danach leer 
    void teileListe (t_Listenkopf* li0, t_Listenkopf* li1, t_Listenkopf* li2) 
     
    Hinweis: Nutzen Sie wenn möglich vorhandene Funktionen. 
    ……………………………………………………………………………………………………………………… 
    Ausschnitt aus liste01.h: 
     
    #define LAENGE 80 
    typedef struct t_element 
    { 
     char inhalt[LAENGE]; // Inhalt als String fester Länge 
     struct t_element* next; // Zeiger auf den Nachfolger 
    }t_element; 
    typedef struct 
    { 
     struct t_element* erstesElement; 
     struct t_element* letztesElement; 
     int anzahlElemente; 
    }t_Listenkopf; 
     
    // besetzt li vor (NULL-Pointer, anzahlZeilen=0 ) 
    void initListe (t_Listenkopf* li); 
     
    // erzeugt ein neues Element und fuegt es vorne ein 
    void pushFront(t_Listenkopf* li, const char* s); 
     
    // gibt die Liste li am Bildschirm aus 
    void printListe(const t_Listenkopf* li); 
     
    // erzeugt ein neues Element und haengt es hinten an 
    void pushBack(t_Listenkopf* li, const char* s); 
     
    // gibt das erste Element zurück und entfernt es aus li 
    void popFront(t_Listenkopf* li, char* s); 
    
    void teileListe (t_Listenkopf * li0, t_Listenkopf* li1, t_Listenkopf* li2)


    Mein Lösungsansatz:

    Code:
    
    void teileListe(t_Listenkopf * li0, t_Listenkopf* li1, t_Listenkopf* li2)
    {
    
     if(li0 <= li0->erstesElement) 
     {
     popFront(li0, s);
     pushBack(li1, s);
     }
     else
     {
     popFront(li0, s);
     pushBack(li2, s);
     }
    }
    
    ich weiß dass es nicht richtig ist, bin nicht so fit in " verketteten listen"
    Als ich mir mein skript durchgelesen habe bin ich auf folgendes gestoßen, dass muss ich bestimmt auch mit
    einbauen - aber ich weiß nicht so recht wie:

    Code:
    
    strcat (s1,s2); // fügt string s2 an s1 an 
    strcpy (s1,s2); // kopiert string s2 in s1 
    i=strcmp (s1,s2); // vergleicht s1, s2 lexikografisch (ASCII) 
     == -1 falls s1 < s2 
     == 0 falls s1 = s2 
     == 1 falls s1 > s2
    
     
  2. 24. Juni 2009
    AW: Verkettete Listen - Aufgabe

    Ich versteh nicht wo dein Problem ist? Unten steht doch Quasi schon das Ergebnis.

    Wenn strcmp -1 zurückgibt ist das Objekt, mit dem verglichen wurde im Alphabet niedriger (a < b), bei 0 Gleich (a = a), und bei +1 Höher (b > a).
     
  3. 24. Juni 2009
    AW: Verkettete Listen - Aufgabe

    ja wie soll ich das aber einbauen in meinen Code?? stimmt mein Code überhaupt ansatzweise , was muss ich daran verändern?
     
  4. 24. Juni 2009
    AW: Verkettete Listen - Aufgabe

    jo der ansatz is grundsätzlich richtig ...

    ich schreib dir die ungefähre idee mal in pseudocode auf:

    liste durchlaufen
    aktuelles element in der liste mit erstem element aus liste0 vergleichen (lexikografisch bedeutet denke ich in dem fall dass A das größte element ist (64 im ascii code) und z das kleinste! du musst also den ascii-code der inhalte der listelemente vergleichen)
    ist das element kleiner hänge es an das letzte element der liste1 dran
    ist es größer hänge es an letztes element der liste2

    hoffe das hilft dir weiter
     
  5. 24. Juni 2009
    AW: Verkettete Listen - Aufgabe

    Meinst du so ??:

    Code:
    
    
    void teileListe(t_Listenkopf * li0, t_Listenkopf* li1, t_Listenkopf* li2)
    {
     int i;
     int anz = (li0->anzahlElemente);
     char s [LAENGE];
     for (i=0; i < anz; i++) 
     if (i=strcmp (erstesElement,letztesElement)==0||-1) //vergleicht 1.- 2. lexikografisch ?? 
     {
     popFront (li0, s);
     pushBack (li1, s);
     }
     else
     (i=strcmp (erstesElement,letztesElement)==1)
     {
     popFront (li0, s);
     pushBack (li2, s);
     }
    }
    
    
     
  6. 24. Juni 2009
    AW: Verkettete Listen - Aufgabe

    jo vom ansatz her richtig. aber warum vergleichst du i mit dem ergebnis des strcmp? strcmp gibt dir ja einen wert aus [-1, 0, 1] zurück wenn ich mich recht erinnere ...

    - am anfang erstmal das erste element aus l0 holen mit dem du vergleichen musst
    - du musst solange die schleife durchlaufen bis keine elemente mehr in der liste0 sind
    - und immer das aktuelle element mit dem vorhin herausgeholten element vergleichen und je nach dessen wert richtig einfügen
     
  7. 24. Juni 2009
    AW: Verkettete Listen - Aufgabe

    OK LEUTE THX, mein Prof is soeben vorbei gelaufen (bin grad in der Bibliothek) er hat mir bei der Lösung geholfen ^^

    BW is an euch raus

    Code:
    {
     int i;
     char s [LAENGE],vergleich[LAENGE];
     int anz = (li0->anzahlElemente);
     
     if (anz == 0)
     return;
     
     popFront(li0, vergleich);
     pushFront(li1.vergleich);
     
     for (i=0; i < anz; i++)
     popFront(li0,s);
     
     if (strcmp (s, vergleich)<0)
     {
     pushBack (li1, s);
     }
     else
     {
     pushBack (li2, s);
     }
    }
    
     
  8. 30. Juni 2009
    AW: Verkettete Listen - Aufgabe

    UNd, hast du deine Klausur gut überstanden?
     
  9. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.