Einfach verkettete Liste
-
Ja, eigentlich ganz einfach. Ich sehe da aber einfach Sachen falsch.
Erstmal:
In main sage ich: Liste list = NULL;
Das ist doch ein Zeiger auf einen Knoten. Der wird auf NULL gesetzt. Aber ich habe ja noch keinen Knoten "erschaffen".
Jetzt übergebe ich diese Adresse an einfuegen. Da die Adresse NULL ist, geht es jetzt los. Ich fordere Platz für einen Knoten an, trage k ein. Der Zeiger dieses Knotens muss doch jetzt erstmal auf NULL zeigen, also list, oder? Es gibt ja keinen Nachfolger.
Bei den nächsten durchläufen fordere ich dann immer wieder Platz für Knoten an und trage k ein, setzte den Zeiger auf das element, das vorher da war.
Also so "denke" ich. Da sind bestimmt ne Menge Denkfehler drin. Deswegen bin ich aber hier.
Zu guter Letzt verstehe ich auch nicht den Unterschierd zwischen diesen beiden Sachen:
typedef struct Knot { int k; Liste rest; } Knoten;
typedef struct { int k; Liste rest; } Knoten;
Das zweite ist doch einfach ein struct vom Typ Knoten. Ich könnte dann sowas deklarieren:
Knoten Neu
Aber was ist das da drüber? Was macht das Knot noch?
-
HighLigerBiMBam schrieb:
Das hat dann aber vergessen die ganzen Leerzeilen zu entfernen. Oder hast du schon mal ein Buch mit 3 Leerzeilen mehrfach hintereinander gesehen? Der Verlag würde daran pleite gehen.
Ich werde jetzt auf jeden Fall mehr drauf achten. Aber findest du nicht, dass es ohne Leerzeilen ein total unübersichlticher "Block" ist?
-
Nicht alle Leerzeichen weglassen, sondern diese sinnvoll verwenden und vor allem nicht mehrfach hintereinander und bei jeder Gelegenheit.
-
Ok Ok. Ich werde wirklich drauf achten ^^
-
psigh schrieb:
Danke für den Hinweis. Also ich sehe nur 000000000. So richtig weiter weiß ich noch nicht.
printf("list: %p :\n", list);
Soll das den Pointer wert anzeigen?
Ja. Das entspricht NULL.
Wie du siehst kommt der neue Wert für list nicht zurück an main.
Dazu gibt es zwei Möglichkeiten:
1. Die Funktion gibt die neue Adresse zurück und du musst in main list den neuen Wert zuweisen oder
2. Du übergibst an einfuegen() die Adresse von list.Dein else Zweig macht eine Endlosschleife mit
list_neu->rest = list_neu;
Achso, du darfst ruhig selber printf an alle Möglichen Stellen schreiben. Dadurch kannst du dann feststellen ob die Funktion überhaupt durch die Bereiche durchläuft
Z.B.:printf("einfuegen: if : list %p ; neu %p ;%d\n", list, list_neu, a); ... printf("einfuegen: else : list %p ; neu %p ;%d\n", list, list_neu, a);
usw.. Die Stellen findest du schon.
-
psigh schrieb:
Zu guter Letzt verstehe ich auch nicht den Unterschierd zwischen diesen beiden Sachen:
typedef struct Knot { int k; Liste rest; } Knoten;
typedef struct { int k; Liste rest; } Knoten;
Lies mal das hier: http://c-faq.com/struct/typedef.html
Den Link zur Hauptseite der C FAQ solltest du eh bookmarken, die ist wirklich gut.Du hast da ein paar grundsätzliche Probleme mit der Programmierung im Allgemeinen und mit Pointern im Besonderen. Das ist nicht groß schlimm, denn Pointer sind eine knackige Sache und viele Leute checken die erst nach 'ner ganzen Weile... oder nie
Allerdings wäre es gut für dich, wenn du die Pointer so lange wie möglich umschiffst, bis du ein bisschen mehr Gefühl entwickelt hast für Sachen wie.. "Wie übergebe ich die Parameter am geschicktesten?" oder "Wo werden meine Objekte erstellt?". In C ist das Umgehen von Pointern zugegebenermaßen nicht so einfach, da sie ein bedeutender Teil von C sind. Musst du wirklich schon als Anfänger verkettete Listen schreiben?
-
Ein paar Probleme ist gut...
C ist ja total menscheinfeindlich. In Matlab geht vieles so schön leicht und einfach (-:
Aber ich werd mich schon dran gewöhnen
-
psigh schrieb:
C ist ja total menscheinfeindlich.
Es ist halt sehr low level und man muss vieles selbst machen. Das ist auch so gewollt. Das macht es allerdings nicht gerade zu einer idealen Einsteigersprache, besonders wenn man keinen Mentor oder ein gutes Buch hat
Mit Python ist das Programmieren für Anfänger idR angenehmer und man lernt viel über das grundsätzliche (Programmaufbau etc) dabei
-
Hast Du denn einen Tip für ein didaktisch wirklich gutes Buch mit Übungen, dass man ca. innerhalb von 4 Wochen durcharbeiten kann?
-
Hm, tjo, ich hab schon lang kein Buch mehr zu C gelesen. Ich würde an deiner Stelle mal in die Unibibliothek oder Bücherei gehen und dort ein bisschen rumstöbern. Wenn's dir gefällt, kannst du es ja kaufen