Verkette Liste
-
also ich hab ne liste und will ein Elemet vorn anhängen, dazu hab ich folgene Fkt.
int eingabe(struct ARTIKEL *liste){
struct ARTIKEL artneu;
artneu = malloc(sizeof(struct ARTIKEL));
printf("Bitte geben sie die Artikel-Bezeichnung ein.(Max 20 Zeichen!)\n");
scanf("%s",&artneu->Bezeichnung);
printf("Bitte geben sie den Preis des Artikels ein.\n");
scanf("%f",&artneu->Preis);
printf("Bitte geben sie die Anzahl der Artikel ein.\n");
scanf("%i",&artneu->Anzahl);
artneu->Summe=artneu->Preisartneu->Anzahl;
if (liste==NULL) artneu->next=NULL;
else artneu->next=liste;
liste=artneu;
return 0;
};eigentlich klappt auch alles (liste=artneu liste hat die adresse von artneu) aber nach verlassen der Funktion ist liste wider NULL, was ist zu tun.
-
Argumente werden in C "by-Value" übergeben, nicht "by-Reference", das heißt, die Funktion arbeitet mit Kopien der übergebenen Variablen. Beispiel:
[cpp]
void funktion(int a) {
a = 42;
}[/code]wer jetzt funktion(b) aufruft und erwartet, dass b wie magisch 42 geworden ist, wird enttäuscht. Es wird nur das lokale a der Funktion verändert, nicht b!
Bei deiner Funktion isses das gleiche, sieht nur komplizierter aus. Du übergibst einen Zeiger auf eine Liste. In der Funktion veränderst du den Zeiger. Aber die Welt ausserhalb der Funktion bekommt davon natürlich nichts mit.
Jetzt gibt es 2 Möglichkeiten. Zum einen könntest du call-by-referenze simulieren, indem du einen Zeiger auf die zu verändernde Variable übergibst.
[cpp]
void funktion(int *a) { *a = 42; }[/code]würde, wenn man sie mit funktion(&b); aufruft, den Wert von b ändern, da ein Zeiger auf b übergeben wird, und nicht b selbst. Genauso bei dir. Machen wir aus dem Listenzeiger einen Zeiger auf einen Listenzeiger (mag kompliziert klingen, aber da mußt du durch wenn du C programmierst):
[cpp]
int eingabe(struct ARTIKEL ** liste) {
...
*liste = artneu;
}
/* aufruf jetzt auch ändern: */
struct ARTIKEL * artikelliste;
eingabe(&artikelliste);[/code]die zweite Möglichkeit ist eine Rückgabe als Funktionsergebnis:
[cpp]
struct ARTIKEL * eingabe(struct ARTIKEL * liste) {
...
return artneu;
}/* aufruf */
...
struct ARTIKEL * neueliste = eingabe(alteliste);[/code]Übrigens: Der folgende Code
[cpp]
if (liste==NULL) artneu->next=NULL;
else artneu->next=liste;[/code]ist eine etwas komplizierte Ausdrucksweise für
[cpp]
artneu->next = liste;[/code]Und
...
-Tags machen den Code auch leichter lesbar
-
Danke, ja klar jetzt wo du´s sagst fällts mir wi schuppen von den augen (oder so. Wie konnte ich nur!!!
-
Hmm...
geht doch auch einfacher.Und zwar definiert (deklariert _) man den Zeiger außerhalb
von irgendeiner Funktion (global) und benutzt ihn dann.
Dann muss man ihn noch nicht einmal mehr als Parameter übergeben.
-
das ist eine wirklich schlechte Idee. Was machst du zB, wenn du mal mehrere verkettete Listen brauchst?
Du solltest globale Variablen meiden, da dadurch dein Code schlecht wartbar, schlecht wiederverwehrtbar und schlecht lesbar wird!