Anubis13 Δημοσ. 17 Σεπτεμβρίου 2009 Δημοσ. 17 Σεπτεμβρίου 2009 Θα ήθελα να με βοηθησετε στο παρακατω προβλημα: Εχουμε μία λίστα σε μία συναρτηση και ψάχνουμε ένα συγκεκριμένο αριθμό σε αυτή(πχ 9). Αν τον βρούμε τότε διαγράφουμε όλα τα στοιχεία μέχρι αυθτό τον αριθμό αλλιώς επιστρέφουμε την λίστα όπως ήταν
Technology fan Δημοσ. 17 Σεπτεμβρίου 2009 Δημοσ. 17 Σεπτεμβρίου 2009 Έκατσες να κάνεις τίποτα? πόσταρε ότι έχεις φτιάξει και όπου κολλας θα σε βοηθήσουμε. Λίστα να φανταστώ εννοείς πίνακα έτσι?
C6WGMN Δημοσ. 17 Σεπτεμβρίου 2009 Δημοσ. 17 Σεπτεμβρίου 2009 > for(ptr = list_head(list); ptr; ptr = list_next(ptr)) if(match(ptr, value) == 0) { while(list_head(list) != ptr) free(pop(list)); break; } Συγκεκριμένα: p είναι list node pointer list_head γυρνάει pointer στο αρχικό node τις λίστας match γυρνάει μηδέν αν το κριτήριο σύγκρισης είναι ευχαριστημένο pop γυρνάει το data που ήταν αποθηκευμένο στο αρχικό node, αφαιρώντας παράλληλα το node αυτό Ο κώδικας υποθέτει ότι όλα τα nodes τις λίστας κρατάνε allocated pointers (από malloc, calloc, realloc).
parsifal Δημοσ. 17 Σεπτεμβρίου 2009 Δημοσ. 17 Σεπτεμβρίου 2009 Ένας τρόπος είναι ο παρακάτω: Θα χρειαστείς δύο βοηθητικούς δείκτες, έστω p1 και p2. Στον p1, κρατάς τη διεύθυνση του πρώτου κόμβου. Ξεκινάς να κάνεις διάσχιση της λίστας ψάχνοντας για τον αριθμό που θες και κάθε φορά ενημερώνεις τον p2 με τη διεύθυνση του αμέσως προηγούμενου από τον τρέχοντα κόμβου. Αν βρεις τον αριθμό που ψάχνεις, τότε απλά μέσω του p2 «κόβεις» τη σύνδεση (κάνοντας π.χ. ΝULL το δείκτη next ή κάτι παρόμοιο, αναλόγως πώς έχεις υλοποιήσει τη λίστα) και κάνεις τον τρέχοντα δείκτη τον πρώτο κόμβο της νέας λίστας. Τώρα λοιπόν από τον δείκτη p1 ξεκινά μία λίστα που περιέχει τους κόμβους που θέλεις να ξεφορτωθείς. Άρα, αρκεί να κάνεις μία διάσχιση αυτής της λίστας, καλώντας free() όσο προχωράς για να αποδεσμεύσεις την αντίστοιχη μνήμη.
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.