Pointer und verkettete Listen
-
Hallo,
ich habe mal eine Frage zu einer Aufgabe. Die Aufgabe ist:Implementieren Sie eine Funktion ListElement* Append(ListElement *p, int v); die an das Ende der Liste, auf die p zeigt, ein neues Element anhängt und dort den Wert v speichert. Als Ergebnis liefert die Funktion einen Zeiger auf das erste Listenelement zurück.
Hier ist mal mein ganzes Programm, ich habe nur die eine Funktion neu geschrieben, also müsste der Fehler in der Funktion stecken:
#include<stdio.h> #include<stdlib.h> typedef struct listelement { int key; struct listelement *next; } ListElement; ListElement* Append(ListElement *p, int v); float MeanValue(ListElement *p); /* Funktion zum Ausgeben einer Liste */ void PrintList(ListElement *p) { printf("Liste: "); while ( p != NULL ) { printf("%4.0d ",p->key); p = p->next; } printf("\n"); return; } /*Funktion zum Loeschen einer Liste */ void DeleteList(ListElement *p) { ListElement *q = p; while (q != NULL) { p = q->next; free(q); /* Loeschen des Elementes auf das q zeigt. */ q = p; } return; } // Aufgabe 3 Punkt B float MeanValue(ListElement *p){ float mittelwert=0; int n=0; if (p == NULL){ exit(0); } else { while ( p != NULL ) { mittelwert = mittelwert + p->key; n++; p = p->next; } return(mittelwert/n); } }// Aufgabe 3 Punkt B int main ( void ) { int i, n, k; float mittelwert; ListElement *p = NULL; printf("Wieviele Zahlen sollen eingelesen werden?: "); scanf("%d",&n); /* Es werden n ganze Zahlen eingelesen und in einer Liste abgespeichert */ for(i=0; i<n; i++) { scanf("%d",&k); p = Append(p,k); } PrintList(p); mittelwert = MeanValue(p); printf("Mittelwert: %6.2f\n", mittelwert); DeleteList(p); return(0); } ListElement* Append(ListElement *p, int v){ ListElement *q,*r = NULL; q = (ListElement*) malloc(sizeof(ListElement)); strcpy(q->key,v); r=p; while ( p->next != NULL ) { p = p->next; } if (p->next == NULL) { p->next = q; } return(r); }
Ich bekomme aber eine Fehlermeldung von der Speicherverwaltung.
Was mache ich denn Falsch? DANKE!
-
Nur kurz überflogen aber:
strcpy(q->key,v);
macht nicht wirklich Sinn. schließlich handelt es sich beidesmal um int.
q->key = v;
sollte besser funktionieren
-
ja hatte ich auch zuerst, aber dadran liegts nicht
-
ListElement *p = NULL; ... for(i=0; i<n; i++) { scanf("%d",&k); p = Append(p,k); }
ListElement* Append(ListElement *p, int v){ ... while ( p->next != NULL ) { p = p->next; } if (p->next == NULL) { p->next = q; } ...
Wenn das erste element initialisiert wirde, wird als p NULL übergeben. Folge-> er betritt die SChleife nicht, und greift anschließend auf den NULL Zeiger zu.
-
Korrektur: Er wird gleich bei der while-Schleife steckenbleiben, da du durch den Ausdruck auch schon auf einen Nullzeiger versucht wird zu zugreifen.
-
danke das hatte ich nicht bedacht.
hier meine geänderte funktion:ListElement* Append(ListElement *p, int v){ ListElement *q,*r = NULL; q = (ListElement*) malloc(sizeof(ListElement)); q->key = v; r=p; if (p == NULL){ p = q; } else { while ( p->next != NULL ) { p = p->next; } if (p->next == NULL) { p->next = q; } } return(r); }