Προς το περιεχόμενο

[C] - Μικρό πρόβλημα με λίστες


Anubis13

Προτεινόμενες αναρτήσεις

Θα ήθελα να με βοηθησετε στο παρακατω προβλημα:

Εχουμε μία λίστα σε μία συναρτηση και ψάχνουμε ένα συγκεκριμένο αριθμό σε αυτή(πχ 9). Αν τον βρούμε τότε διαγράφουμε όλα τα στοιχεία μέχρι αυθτό τον αριθμό αλλιώς επιστρέφουμε την λίστα όπως ήταν

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Έκατσες να κάνεις τίποτα? πόσταρε ότι έχεις φτιάξει και όπου κολλας θα σε βοηθήσουμε. Λίστα να φανταστώ εννοείς πίνακα έτσι?

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

>
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).

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Ένας τρόπος είναι ο παρακάτω:

 

Θα χρειαστείς δύο βοηθητικούς δείκτες, έστω p1 και p2. Στον p1, κρατάς τη διεύθυνση του πρώτου κόμβου. Ξεκινάς να κάνεις διάσχιση της λίστας ψάχνοντας για τον αριθμό που θες και κάθε φορά ενημερώνεις τον p2 με τη διεύθυνση του αμέσως προηγούμενου από τον τρέχοντα κόμβου. Αν βρεις τον αριθμό που ψάχνεις, τότε απλά μέσω του p2 «κόβεις» τη σύνδεση (κάνοντας π.χ. ΝULL το δείκτη next ή κάτι παρόμοιο, αναλόγως πώς έχεις υλοποιήσει τη λίστα) και κάνεις τον τρέχοντα δείκτη τον πρώτο κόμβο της νέας λίστας. Τώρα λοιπόν από τον δείκτη p1 ξεκινά μία λίστα που περιέχει τους κόμβους που θέλεις να ξεφορτωθείς. Άρα, αρκεί να κάνεις μία διάσχιση αυτής της λίστας, καλώντας free() όσο προχωράς για να αποδεσμεύσεις την αντίστοιχη μνήμη.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...