Es ist schon eine Weile her, seit ich C benutzt habe, also entschuldige ich mich, wenn das etwas ist, was offensichtlich sein sollte und ich vergesse nur, wie Zeiger funktionieren. Grundsätzlich habe ich eine verkettete Listenstruktur, in der jeder Link eine Punktzahl hat. Ich versuche einen Algorithmus zu schreiben, der meine Liste durchläuft und den Link mit der niedrigsten Punktzahl entfernt. Meine Strukturen in etwa so aussehen:C - Zeiger auf Zeiger verstehen und Wert am Speicherplatz ändern
typedef struct linkedList_tag {
struct linkedList_tag *next;
int score;
} LinkedList;
typedef struct head_tag {
int size;
struct linkedList_tag *next;
} Head;
Wo Leiter ist der Standard erste Glied in der Liste. Mein aktueller Algorithmus sieht in etwa wie folgt aus:
void removeLowest(Head *head)
{
LinkedList** lowestPrev;
LinkedList* current;
int lowestScore;
if (head->next != NULL) {
head->size--;
lowestPrev = &head->next;
current = head->next;
lowestScore = current->score;
while (current != NULL) {
if (current->score < lowestScore) {
lowestPrev = ¤t;
lowestScore = current.score;
}
current = current->next;
}
*lowestPrev = (*lowestPrev)->next;
}
}
Nun, ich weiß, dieser Code wird nicht funktionieren und ich glaube, ich verstehe, was es tut. Was ich nicht verstehe, ist, wie man den Code ändert, um mein beabsichtigtes Ziel zu erreichen.
Meine Absicht war es, die Speicherstelle des Zeigers auf den Knoten mit der niedrigsten Bewertung in der Variablen "lowestPrev" zu speichern und dann den Zeigerwert des Knotens nach dem Knoten mit der niedrigsten Bewertung diesem Speicherort zuzuweisen. Also, jedes Mal wenn ich einen Knoten angetroffen, die niedriger als meine aktuelle niedrigste Punktzahl hat, würde ich den Speicherort es der Punkt in einer Variablen halten:
if (current->score < lowestScore) {
lowestPrev = ¤t;
lowestScore = current.score;
}
und am Ende, würde ich den Zeigerwert der zuweisen nächsten Link zu diesem Speicherplatz:
*lowestPrev = (*lowestPrev)->next;
es scheint jedoch, dass „lowestPrev“ (wenn ich zu verstehen, dies richtig) nicht einfach den Speicherplatz beibehalten wurde ursprünglich ihm zugewiesenen, aber aktualisieren sie es Wert ist jeder Zeit, auf die der Zeiger, auf den er zeigt, aktualisiert wird, hier:
current = current->next;
Verstehe ich dieses Verhalten richtig und, wenn ja, wie kann ich meinen Code ändern, um mein erklärtes Ziel zu erreichen?
Nicht in der Lage, eine vollständige Antwort zu schreiben, aber ein schneller Tipp - Sie 'n' nie den Knoten, der entfernt wird. Das ist ein Speicherleck – Fureeish
Sie brauchen nicht verschiedene Strukturen für Head und Liste, nur eine Struktur namens list_node zum Beispiel –
'lostestScore = current.score;' -> 'lowestScore = current-> score;' –