Δημοσιεύτηκε: 21 Ιούλ 2011, 15:47
stamatiou έγραψε:
Πήγα να κάνω το del1st(χωρίς να χρησιμοποιήσω len) και μου έβγαλε ένα παράξενο error ο compiler.
Ο κώδικας είναι αυτός:
- Κώδικας: Επιλογή όλων
int del1st(List **list,int value)
{
Node *dummy;
dummy = *(list->head);
while(dummy->data != value)
{
dummy = dummy -> next;
}
dummy->data = 0;
return 0;
}
και το error:
- Κώδικας: Επιλογή όλων
error: request for member ‘head’ in something not a structure or union
Τι σημαίνει αυτό;
Άσε το βρήκα! Την ίδια κοτσάνα έκανα πάλι...
Πέρα από το error, που στο βγάζει γιατί κανονικά πρέπει να γράψεις:
- Κώδικας: Επιλογή όλων
dummy = (*list)->head;
υπάρχουν και λογικά σφάλματα στον παραπάνω κώδικα:
1. το while δεν ελέγχει αν ο dummy γίνεται NULL, οπότε μόλις γίνει NULL (από το: dummy = dummy->next) θα πάει μετά να ελέγξει το: dummy->data != value και θα βαρέσει segmentation fault, γιατί βασικά πάει να ελέγξει το: NULL->data != value ( !!BOOOM!! )
2. Για να διαγράψεις τον κόμβο που έχει data == value δεν μηδενίζεις το πεδίο data. Πρέπει πρώτα να βάλεις το πεδίο next του προηγούμενου κόμβου να δείχνει στον επόμενο κόμβο και μετά να καταστρέψεις τον τρέχων κόμβο (με free).
Αυτό προϋποθέτει πως μέσα στο loop εκτός από τον dummy που δείχνει στον τρέχων κόμβο, πρέπει να χρησιμοποιήσεις κι άλλον βοηθητικό δείκτη (π.χ. prev), που θα δείχνει στον προηγούμενο κόμβο (να είναι δηλαδή πάντα ένα βήμα πίσω από τον dummy). Έτσι ώστε όταν ο dummy βρεθεί στον κόμβο προς διαγραφή, να μπορείς να κάνεις ένα:
- Κώδικας: Επιλογή όλων
prev->next = dummy->next;
πριν καταστρέψεις τον κόμβο στον οποίον δείχνει ο dummy, με:
- Κώδικας: Επιλογή όλων
free(dummy);
Αν θέλεις να συνεχίσεις το ψάξιμο και για άλλον κόμβο με τιμή value στο πεδίο data, τότε μετά από το παραπάνω θα πρέπει να βάλεις τον dummy να δείχνει στον κόμβο prev->next
- Κώδικας: Επιλογή όλων
dummy = prev->next;