Ich lerne nur c und über verknüpfte Listen habe ich einige große Probleme.Probleme mit dem Entfernen des letzten Elements in einer verketteten Liste in c
Ich habe folgenden Code:
#include <stdio.h>
#include <stdlib.h>
struct people {
int age;
char *name;
struct people * next;
};
typedef struct people people;
void count(people array) {
people *current=malloc(sizeof(people));
current = &array;
int count = 0;
while(current){
count++;
printf("name %s\n",current->name);
printf("age %d\n",current->age);
current=current->next;
}
printf("%d\n", count);
free(current);
}
void push(people *array){
people * new=malloc(sizeof(people));
people *last=malloc(sizeof(people));
new->age=300;
new->name="baz";
new->next=NULL;
last=array;
while(last->next){
last=last->next;
}
last->next=new;
// free(new);
}
void pop(people *array){
people * last=malloc(sizeof(people));
last=array;
while(last->next){
//get the last element in the list
last=last->next;
}
// free the last element
free(last);
}
int main(int argc, char** argv) {
people person = {
.name = "foo",
.age = 25
};
person.next = malloc(sizeof (people));
person.next->age = 26;
person.next->name = "bar";
person.next->next = NULL;
//push into the list
push(&person);
//count after pushing
count(person);
//remove last
pop(&person);
//at this count i get just the age 0 but the name was not removed and still counts 3
count(person);
return 0;
}
Wenn ich Pop laufen es soll zu Array.prototype.pop
von Javascript ähnlich arbeiten.
Es verhält sich wirklich seltsam die letzten next
den Namen „baz“ und Alter hat 300. Nachdem ich diesen Code ausführen, anstatt diese letzte Struktur zu entfernen, es zeigt nur das Alter als 0
frei scheint, ist nicht wirklich um die Zeiger zu befreien zugewiesen mit malloc.
Das Vorletzte verweist immer noch auf ungültigen Speicher. free() gibt nur den angegebenen Speicherabschnitt zurück an den Speicherzuordner, setzt Ihre Zeiger nicht auf gültigen Speicher – GeorgeAl
Zusätzlich zu @GeorgeAl kommentieren Sie Tonnen von Speicher. Aktuelle und letzte erhalten ihren eigenen Speicher, dann löschen Sie sie einfach, indem Sie den/die Zeiger anderen Adressen zuweisen. – Andreas
@GeorgeAl wie kann ich ein zugewiesenes Speicherstück freigeben, wenn das freie nicht funktioniert? – nikoss