C - verkettete Liste - diverse Fragen

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • C - verkettete Liste - diverse Fragen

    Hallo Zusammen,

    habe schon viele Threads zu dem Thema durchforstet, aber keiner beantwortet mir meine realtiv grundlegenden Fragen.

    ich schreibe zur Zeit ein Programm, in dem ich meine Ausgaben für Benzin archivieren möchte. Dazu nehme ich eine einfach verkettete Liste. Eine Struktur liefert die benötigten Variablen wie z.b. eine fortlaufende ID für jede Tankfüllung, den Namen der Tankstelle usw.

    Ich erstelle noch eine 2. Struktur, von der ich aber nur ein Objekt ableiten muss, da diese nur 3 Zeiger enthält. Einer zeigt auf das erste Element der Liste, einer dient als "cursor", einer zeigt auf das letzte Element der Liste.

    Ich habe bisher kein Problem mit der Definition der Strukturen.

    Jetz soll das Programm natürlich eine Funktion bieten, die einen neuen Datensatz mit den Benutzer eingaben erstellt.

    Frage1: Welchen Datentyp muss diese Funktion zurückliefern? Wie sieht die allgemeine Funktionsdefinition aus, wenn diese mit Strings und Strukturen umgehen soll.

    Frage2: Ich habe in vielen Programmen gesehen dass eine neu deklarierte Variable einer struktur (also ein neues Element in diesem Fall) = malloc(sizeof(name der struktur) gesetzt wird. Angeblich zur dynamischen Speicherallokation. Ich habe doch aber schon in der Struktur festgelegt, wie groß der Platz für die einzelnen Datenfelder eines Elements sein soll. Warum braucht man malloc, wenn zu dem Zeitpunkt, wo malloc benutzt wird, keine anderen Informationen über den Speicherbedarf vorliegen, als die, die in der Struktur hinterlegt sind? (Also keine Benutzereingaben vorhanden)

    Frage 3: Ich habe in vielen Programmen gesehen,dass neue Objekte einer Struktur als Zeiger, und nicht als einfache Variable des Strukurtyps deklariert werden. Warum?



    Zur Sicherheit anbei nochmal meine Strukturen:

    Quellcode

    1. struct Auftanken {
    2. int nr; //Platz für die ID
    3. char Tankst[30];
    4. char Datum[8];
    5. double Preis;
    6. struct Auftanken *next;
    7. }
    8. struct Liste {
    9. struct Auftanken *cursor;
    10. struct Liste *first,*last; //von welchem Typ müssen die Zeiger sein? alle sollen ja irgendwo auf ein "Auftanken" Element zeigen
    11. }
    Alles anzeigen


    vielenvielenDank im vorraus und schöne Grüße
  • Frage 3:
    Ganz einfach, weil nur zur Laufzeit festegesteltl werden kann wieviel Elemente der Struktur benötigt werden.
    Wenn du es als ienfache Variable machst dann hast du die Struktur genau einmal im Speicher.

    Frage 2:
    Dies wird genau aus dem obigen Grund verwendet. Um zur Laufzeit eine unterschiedliche Anzahl an der benötgit Strukturen, ich nenns mal Variablen, zu erhalten die durch den Benutzer bestimmt werden.

    Frage 1:
    Die Funktion muss dynamisch Speicher für die neue Variable vom Betriebsystem anforden (malloc), diese mit den Benutzerwerten füllen und schliesslich an die Liste anfügen.

    Wie du Liste gestalltest ist dir überlassen, normalerwesse wird in jedem Eintrag der vorherige Eintrag ung Nachfolgende Eintrag gespeichert.
    ->

    Quellcode

    1. struct Liste {
    2. struct Auftanken *cursor;
    3. struct Liste *prev,*next;
    4. }


    Wenn du die möglichkeit hast C++ zu benutzen, würd ich dir das vector template empfehlen.

    Mfg Rushh0ur
  • Ein Vektor muss nicht unbedingt 3D oder 2D sein.
    Er kann beliebig viele Elemente beinhalten (meistens des selben Types).

    -> C++ : Reference : STL Containers : vector

    Syntax:
    vector<Typ> Variablenname;

    Beispiel:

    Quellcode

    1. std::vector<int> IntegerList;
    2. //Element hinzufügen
    3. IntegerList.push_back(5);
    4. IntegerList.push_back(7);
    5. // Anzahl der Elemente
    6. int Anzahl = IntegerList.size(); // -> 2
    7. // Element zugriff
    8. int Wert = IntegerList.at(0); // -> 5
    9. Wert = IntegerList.at(1); // -> 7
    10. // Pointer des ersten Elementes (0)
    11. std::vector<int>::iterator it = IntegerList.begin();
    12. Wert = *it; // -> 5
    13. // Element löschen
    14. IntegerList.erase(it+1); // 7 wird entfernt (Element 1)
    Alles anzeigen


    Mfg Rushh0ur