#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 + Multi-Zitat Zitieren
#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). + Multi-Zitat Zitieren
#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? + Multi-Zitat Zitieren
#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 + Multi-Zitat Zitieren
#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); } } + Multi-Zitat Zitieren
#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 + Multi-Zitat Zitieren
#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); } } + Multi-Zitat Zitieren
#8 30. Juni 2009 AW: Verkettete Listen - Aufgabe UNd, hast du deine Klausur gut überstanden? + Multi-Zitat Zitieren