Fragen zu verketteten Listen



  • Hi

    Kann mir jemand zu folgenden Zeilen schreiben was genau gemacht wird?

    struct knoten {int wert; struct knoten *next;};
    
    struct knoten *neuelement, *head1, *hilf1;
    

    Wieso ist unten keine Klammer?

    ...
    scanf("%i", &neuzahl);
    neuelement=(struct knoten*) malloc(sizeof(*neuelement));
    neuelement->wert=neuzahl;
    neuelement->next=head1;
    head1=neuelement;}
    

    Warum liest man es in neuzahl ein, reserviert dann aber für neuelement Speicher. Und weshalb schreibt man neuelement= und nicht *neuelement=? Neuelement wird anfangs auch gar nicht deklariert.



  • Wieso ist unten keine Klammer?

    Was meinsts du damit?

    Warum liest man es in neuzahl ein, reserviert dann aber für neuelement Speicher.

    neuzahl ist wahrscheinlich die anzahl der neuen Knöten. Das ist dynamisch gemacht, also man muss malloc benutzen, um den Speicher zu reservieren.

    Und weshalb schreibt man neuelement= und nicht *neuelement=

    Weil malloc ein void* zurückliefert. Es handelt sich hier um Adressezuweisung und nicht Wertzuweiseung. *neuelement= heißt, ändere den Wert an der Stelle, auf die neuelement zeigt. neuelement= heißt, zeige auf diese Stelle. malloc liefert die Adresse zurück, wo der neue Speicher reserviert wurde.

    Neuelement wird anfangs auch gar nicht deklariert.

    doch, oben.



  • coolio schrieb:

    Hi

    Kann mir jemand zu folgenden Zeilen schreiben was genau gemacht wird?

    struct knoten {int wert; struct knoten *next;};
    
    struct knoten *neuelement, *head1, *hilf1;
    

    Hier wird die Struktur knotne, bestehend aus einem int und einem Zeiger auf den nächsten Knoten, definiert.
    In der nächsten Zeile werden 3 Zeiger auf knoten definiert.

    ...
    scanf("%i", &neuzahl);
    neuelement=(struct knoten*) malloc(sizeof(*neuelement));
    neuelement->wert=neuzahl;
    neuelement->next=head1;
    head1=neuelement;}
    

    Warum liest man es in neuzahl ein, reserviert dann aber für neuelement Speicher. Und weshalb schreibt man neuelement= und nicht *neuelement=? Neuelement wird anfangs auch gar nicht deklariert.

    neuelement wurde doch oben bereits definiert. waren die 3 Variablen global?
    Das passiert: Neuzahl wird eingegeben, SPeicher für einen Knoden wird allokiert (neuelement muss bereits auf einen knoten zeigen). Dann wird der gerade allokierte knoten gefüllt und anschließend zeigt headl auf den neuen knoten.



  • coolio schrieb:

    struct knoten {int wert; struct knoten *next;};
    
    struct knoten *neuelement, *head1, *hilf1;
    

    Erste Zeile definiert einen Strukturtyp namens 'struct knoten', der als Elemente einen int und einen Zeiger auf 'struct knoten' enthält.

    Zweite Zeile definiert drei Variablen vom Typ 'Zeiger auf struct knoten'.

    Wieso ist unten keine Klammer?

    Wozu?

    ...
    scanf("%i", &neuzahl);
    neuelement=(struct knoten*) malloc(sizeof(*neuelement));
    neuelement->wert=neuzahl;
    neuelement->next=head1;
    head1=neuelement;}
    

    Warum liest man es in neuzahl ein, reserviert dann aber für neuelement Speicher.

    Weil man neuzahl einlesen möchte, und weil man einen neuen Knoten (der sizeof(struct knoten), oder gleichbedeutend, sizeof(*neuelement) Bytes groß ist) allozieren will. Das eine hat mit dem anderen überhaupt nichts zu tun.

    Und weshalb schreibt man neuelement= und nicht *neuelement=?

    Weil man dem Zeiger neuelement etwas zuweisen möchte, und nicht der Struktur, auf die er gerade zeigt. Das wär auch blöd, weil der Zeiger noch gar nicht initialisiert ist, und somit nicht auf ein gültiges 'struct knoten'-Objekt verweist.

    Neuelement wird anfangs auch gar nicht deklariert.

    Doch, oben in der Zeile, in der du dich über fehlende Klammern gewundert hast.



  • supertux schrieb:

    neuzahl ist wahrscheinlich die anzahl der neuen Knöten. Das ist dynamisch gemacht, also man muss malloc benutzen, um den Speicher zu reservieren.

    Nein, neuzahl ist nur der Wert, der im Knoten gespeichert werden soll.



  • interpreter schrieb:

    supertux schrieb:

    neuzahl ist wahrscheinlich die anzahl der neuen Knöten. Das ist dynamisch gemacht, also man muss malloc benutzen, um den Speicher zu reservieren.

    Nein, neuzahl ist nur der Wert, der im Knoten gespeichert werden soll.

    Ach ja, falsch gelesen, dachte, ich hätte sizeof(*neuelement)*neuzahl gelesen bzw. so habe ich das interpretiert 😃



  • danke für infos



  • noch ne kurze frage.
    wenn ich jetzt ne structure hab:

    struct knoten {int kontonummer; double ktostand; struct knoten *next;};
    

    wie lese ich das dann ein? habe ja anstatt einem wert in der struct nun zwei.
    also wie stelle ich da speicherplatz zur verfügung?



  • coolio schrieb:

    struct knoten {int kontonummer; double ktostand; struct knoten *next;};
    

    wie lese ich das dann ein? habe ja anstatt einem wert in der struct nun zwei.
    also wie stelle ich da speicherplatz zur verfügung?

    Ordne mal deine Gedanken. Möchtest du einlesen (was auch immer du damit meinst) oder Speicherplatz bereitstellen? Letzteres wird in deinem Programm doch gemacht (siehe malloc).



  • das obige hat mit dem unteren 0 zu tun.

    struct knoten {int wert; struct knoten *next;};
    
    struct knoten *neuelement, *head1, *hilf1;
    
    for (i = 1; i < 6; i++) {
    printf("Zahl eingeben: ");
    scanf("%i", &neuzahl);
    neuelement=(struct knoten*) malloc(sizeof(*neuelement));
    neuelement->wert=neuzahl;
    neuelement->next=head1;
    head1=neuelement;}
    

    und wie mache ich das jetzt mit zwei variablen in der struct??
    also mit kontonummer und ktostand?



  • Du kannst den Kontostand doch genauso einfach füllen wie in deinem Beispiel die Variable wert:
    scanf("%lf", &kontostand);
    //...
    neuelement->ktostand = kontostand;



  • und die kontonummer?? muss ich 2 printf/scanf anweisungen hintereindander machen?
    muss ich die zahlen in 2 versch. variablen einlesen?



  • coolio schrieb:

    und die kontonummer?? muss ich 2 printf/scanf anweisungen hintereindander machen?
    muss ich die zahlen in 2 versch. variablen einlesen?

    Genau!



  • also

    int eingabe1;
    float eingabe2;
    
    struct knoten {int kontonummer; float kontostand; struct knoten *next;}; 
    
    struct knoten *neuelement, *head1, *head2, *head3, *hilf1, *hilf2, *hilf3; 
    
    for (i = 1; i < 6; i++) { 
    printf("Kontonummer eingeben: "); 
    scanf("%i", &eingabe1); 
    neuelement=(struct knoten*) malloc(sizeof(*neuelement)); 
    neuelement->kontonummer=eingabe1; 
    neuelement->next=head1; 
    head1=neuelement;
    printf("Kontonummer eingeben: "); 
    scanf("%f", &eingabe2); 
    neuelement=(struct knoten*) malloc(sizeof(*neuelement)); 
    neuelement->kontostand=eingabe2; 
    neuelement->next=head2; 
    head2=neuelement;
    

    kann ich beides in head1 einlesen, oder muss ich das so machen wie oben?
    ist eine for-schleife überhaupt sinnvoll dort, oder soll man eine while (janein = 'j') oder so machen. keine bank der welt weiß ja wieviele nummern und kontostände sie eingeben will.



  • das zweite sollte natürlich kontostand heißen. kann ja als gast net editieren ^^



  • Aus dem hier

    coolio schrieb:

    und die kontonummer?? muss ich 2 printf/scanf anweisungen hintereindander machen?
    muss ich die zahlen in 2 versch. variablen einlesen?

    kann ich leider nicht auf das hier

    coolio schrieb:

    printf("Kontonummer eingeben: "); 
    scanf("%i", &eingabe1); 
    neuelement=(struct knoten*) malloc(sizeof(*neuelement)); 
    neuelement->kontonummer=eingabe1; 
    neuelement->next=head1; 
    head1=neuelement;
    printf("Kontonummer eingeben: "); 
    scanf("%f", &eingabe2); 
    neuelement=(struct knoten*) malloc(sizeof(*neuelement)); 
    neuelement->kontostand=eingabe2; 
    neuelement->next=head2; 
    head2=neuelement;
    

    schließen. Du schreibst doch selber, dass du nur die printf()/scanf() Anweisung zu wiederholen brauchst mit entsprechender Abänderung. Warum machst du das dann nicht??
    So wie du es nämlich jetzt hast, ist es falsch und deine zusätzlichen Heads und Hilfs kannst du dir auch sparen.

    Bevor du da jetzt groß weitermachst, solltest du erstmal verstehen was Strukturen sind und wie man sie handhabt, dann was dynamische Speicherreservierung ist und wie man diese handhabt und zu guter letzt solltest du verstehen was verkettete Listen sind. Dass du wissen solltest wie Zeiger funktionieren, setze ich jetzt auch mal voraus.



  • das alles zu verstehen ist für einen studenten nicht gerade einfach, wenn er alles nur so ein bisschen erklärt bekommt.
    das ist die aufgabe einer klausur.
    es wurde explizit gesagt, dass man kein komplettes programm schreiben soll, sondern nur ausschnitte.
    also soweit ich mich erinnern kann war gefragt wie man kontonummmer und kontostand einliest. dann müsste ja mein beispiel stimmen...

    in der schule haben wie das erste beispiel mit nur einem wert (int wert) gelernt. in der klausur kam dann eine aufgabe mit kontonummer und kontostand dran. in der klausur ist es dann schwierig von einer variablen auf 2 zu schließen, wenn der dozent selber meint es wäre schwierig malloc zu verstehen, und wir es in nur 2 doppelstunden behandelt haben.

    was eine structure ist, das sollte ich wissen. es ist wie ein array nur mit verschiedenen datentypen. was gibt es da mehr zu verstehen?



  • coolio schrieb:

    also soweit ich mich erinnern kann war gefragt wie man kontonummmer und kontostand einliest. dann müsste ja mein beispiel stimmen...

    Ansichtssache. Einfach betrachtet ja. Komplex betrachtet nein. Und komplexes Denken setze ich bei einem Studenten voraus.
    Kennst du dich mit Datenbanken aus? Wenn ja, dann ist es etwas leichter zu erklären. Ich geh einfach mal davon aus (wenn nicht, dann versuch ich es anders, aber vielleicht wirds ja trotzdem klar):
    Eine Struktur musst du dir vorstellen wie einen Datensatz in einer Datenbank. In deinem Fall sind das Kontodaten. Nun willst du 5 neue Konten anlegen, jeweils mit Kontonummer und Kontostand. Allerdings macht dein Programm was anderes. Es legt 10 Konten an und zwar 5 nur mit Kontonummer und keinem Kontostand und die anderen 5 mit Kontostand, aber keiner Kontonummer.

    Dann noch zu deinen 3 head variablen. Das wäre vergleichbar mit 3 absolut gleichen Datenbanktabellen, die sich nicht unterscheiden (nur vom Namen natürlich). Macht es wirklich sinn 3 Tabellen zu haben, wenn es auch eine tut?

    Stimmt malloc() ist schwierig zu verstehen, besonders wenn man noch am Anfang steht mit dem Programmieren. Allerdings fällt es einem um einiges leichter, wenn man sich ein wenig in die Sache reinkniet und selber ein wenig Zeit aufwendet um es richtig zu erlernen (wobei natürlich Hilfe von außen, wie hier, nicht verkehrt ist ;)).

    So jetzt überleg dir nochmal genau was dein Programm(ausschnitt) können soll und was auch Sinn macht ;). Und dann mach dich nochmal dran es auszuprogrammieren. Wenn du fertig bist, schau dir nochmal den Code an und überlege, ob er wirklich das erwünschte Resultat bringt. Zur Not kannst du den Quellcode auch einfach mal compilieren, ausführen und überprüfen, ob er auch wirklich das macht, was du erwartest (schau dir dazu aber auch den Inhalt deiner Variablen an).



  • Mit Datenbanken hatte ich noch nichts zu tun. Habe ich im nächsten Semester.

    Also, da ich momentan keine Möglichkeit habe den Code auszuprobieren, schreibe ich einmal den Code hin, der vielleicht funktionieren könnte.

    struct knoten {int kontonummer, float kontostand; struct knoten *next;};
    
    struct knoten *neuelement, *head1, *head2;
    
    printf("Kontonummer eingeben: "); 
    scanf("%i", &eingabe1); 
    printf("Kontostand eingeben: "); 
    scanf("%f", &eingabe2); 
    neuelement=(struct knoten*) malloc(sizeof(*neuelement)); 
    neuelement->kontonummer=eingabe1; 
    neuelement->next=head1; 
    head1=neuelement; 
    neuelement->kontostand=eingabe2; 
    neuelement->next=head2; 
    head2=neuelement;
    

    naja, wenn das nicht gehen sollte, dann weiß ich auch nicht weiter 😃

    und komplexes Denken bei Studenten??? 😃


Anmelden zum Antworten