🎓 Δυναμικές Δομές Δεδομένων – Θεωρία & Εφαρμογή

Θεωρία: Συνδεδεμένες Λίστες

💡 Η Λίστα στην καθημερινή ζωή

Η έννοια της λίστας συναντάται πολύ συχνά στην καθημερινότητά μας. Σκεφτείτε πόσες φορές έχετε φτιάξει:

  • Μια λίστα με τα αγαπημένα σας τραγούδια στο κινητό.
  • Μια λίστα με τις επαφές σας.
  • Μια λίστα με τα ψώνια του σούπερ μάρκετ.
  • Μια λίστα με επιθυμίες και όνειρα (bucket list).

Η λίστα στην πληροφορική δεν είναι τίποτα άλλο παρά μια συλλογή από αντικείμενα (δεδομένα) του ίδιου τύπου, οργανωμένα σε μια σειρά.

1. Τι είναι η Συνδεδεμένη Λίστα;

Η συνδεδεμένη λίστα είναι μια δυναμική δομή δεδομένων. Σε αντίθεση με τους πίνακες, όπου τα στοιχεία πρέπει να βρίσκονται σε συνεχόμενες θέσεις μνήμης (σαν σπίτια σε έναν δρόμο), στη λίστα τα στοιχεία (που ονομάζονται κόμβοι) μπορεί να είναι διασκορπισμένα οπουδήποτε στη μνήμη.

Κάθε κόμβος αποτελείται από δύο μέρη:

  • Δεδομένα: Η πληροφορία που θέλουμε να αποθηκεύσουμε (π.χ. αριθμός, όνομα).
  • Δείκτης (Pointer): Η διεύθυνση του επόμενου κόμβου στη σειρά. Έτσι ξέρουμε πού να πάμε μετά.
Δεδομένα Δείκτης (προς επόμενο) Δομή ενός Κόμβου

Η λίστα συνοδεύεται πάντα από έναν ειδικό δείκτη, την Κεφαλή (Head), που μας λέει πού βρίσκεται ο πρώτος κόμβος. Ο τελευταίος κόμβος δείχνει στο NULL (κενό), που σημαίνει "τέλος της λίστας".

2. Κατηγορίες Λιστών

Α. Απλά Συνδεδεμένη Λίστα

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

HEAD 10 20 30 40 NULL

Β. Διπλά Συνδεδεμένη Λίστα

Εδώ, κάθε κόμβος έχει δύο δείκτες: έναν για τον επόμενο και έναν για τον προηγούμενο κόμβο. Αυτό μας επιτρέπει να κινούμαστε και προς τις δύο κατευθύνσεις.

HEAD 100 NULL 200 300 400 NULL TAIL

3. Βασικές Πράξεις Λιστών

Σε μια λίστα μπορούμε να κάνουμε τις εξής βασικές λειτουργίες:

  1. Εισαγωγή: Προσθήκη νέου κόμβου (στην αρχή, στο τέλος ή ενδιάμεσα).
  2. Διαγραφή: Αφαίρεση ενός κόμβου.
  3. Έλεγχος Κενού: Να δούμε αν η λίστα είναι άδεια (αν η Κεφαλή είναι NULL).
  4. Αναζήτηση: Να ψάξουμε αν υπάρχει ένα στοιχείο στη λίστα.
  5. Διάσχιση: Να περάσουμε από όλους τους κόμβους (π.χ. για να τους τυπώσουμε).

4. Πώς γίνεται η Εισαγωγή και η Διαγραφή;

Η Λειτουργία της Εισαγωγής

Ας υποθέσουμε ότι σχεδιάζουμε ένα ταξίδι: Αθήνα → Λαμία → Λάρισα. Ξαφνικά, αποφασίζουμε να επισκεφθούμε τον Βόλο μετά τη Λαμία και πριν τη Λάρισα. Για να το κάνουμε αυτό στη λίστα, δεν χρειάζεται να μετακινήσουμε τίποτα. Απλώς αλλάζουμε τους δείκτες:

  • Ο δείκτης της Λαμίας (που έδειχνε Λάρισα) τώρα θα δείχνει τον Βόλο.
  • Ο δείκτης του Βόλου θα δείχνει τη Λάρισα.
Λαμία Λάρισα Βόλος Διακοπή παλιάς σύνδεσης

Η Λειτουργία της Διαγραφής

Αν τελικά αποφασίσουμε να μην πάμε στη Λαμία (Αθήνα → Λαμία → Λάρισα), πρέπει να τη διαγράψουμε. Τότε, αλλάζουμε τον δείκτη της Αθήνας (προηγούμενος κόμβος) ώστε να δείχνει κατευθείαν στη Λάρισα, παρακάμπτοντας τη Λαμία. Η Λαμία αποσυνδέεται από τη λίστα.

Αθήνα Λαμία Λάρισα Νέα σύνδεση

5. Σύγκριση: Πίνακες vs Λίστες

Χαρακτηριστικό Πίνακας (Στατική Δομή) Λίστα (Δυναμική Δομή)
Μνήμη Συνεχόμενες θέσεις (σαν σπίτια στη σειρά) Μη συνεχόμενες (διάσπαρτες)
Μέγεθος Σταθερό (το δηλώνουμε στην αρχή) Μεταβλητό (αυξομειώνεται δυναμικά)
Προσπέλαση Τυχαία / Άμεση (μπορώ να πάω κατευθείαν στο 5ο στοιχείο) Σειριακή (πρέπει να περάσω από όλα τα προηγούμενα)

6. Πλεονεκτήματα & Μειονεκτήματα

✅ Πλεονεκτήματα Λιστών
  • Δυναμικό μέγεθος: Δεν δεσμεύουμε περιττή μνήμη και δεν μας "τελειώνει" ο χώρος.
  • Εύκολη εισαγωγή/διαγραφή: Αλλάζουμε απλώς τους δείκτες, χωρίς να χρειάζεται να μετακινήσουμε όλα τα άλλα στοιχεία (όπως θα κάναμε σε έναν πίνακα).
⚠️ Μειονεκτήματα Λιστών
  • Αργή προσπέλαση: Δεν μπορούμε να πάμε κατευθείαν στο 100ο στοιχείο. Πρέπει να περάσουμε από τα 99 προηγούμενα.
  • Δεν γίνεται Δυαδική Αναζήτηση: Λόγω της σειριακής προσπέλασης.
  • Επιπλέον Μνήμη: Κάθε κόμβος απαιτεί έξτρα χώρο για να αποθηκεύει τον δείκτη.

Απλά συνδεδεμένη λίστα (μέχρι 10 κόμβους)

Εισαγωγή & διαγραφή κόμβου με αναπαράσταση της RAM.
Γραφική αναπαράσταση απλά συνδεδεμένης λίστας
Head: NULL
💡 Επιλεγμένος κόμβος: κανένας
Μνήμη RAM (πλέγμα 5x6)
Τα γαλάζια κελιά είναι δεσμευμένα από κόμβους της λίστας.
Λειτουργίες λίστας
Πλήθος κόμβων:
Τιμή: Θέση:
Κάνε κλικ σε έναν κόμβο για να τον επιλέξεις. Ο τελευταίος κόμβος έχει next = NULL.
Οδηγίες: Διάλεξε πόσους κόμβους θέλεις (1–10), δημιούργησε τη λίστα και μετά κάνε εισαγωγές / διαγραφές επιλέγοντας κόμβους.

Διπλά συνδεδεμένη λίστα (μέχρι 10 κόμβους)

Εισαγωγή & διαγραφή κόμβου.
Γραφική αναπαράσταση διπλά συνδεδεμένης λίστας
Head: NULL • Ουρά (Tail): NULL
💡 Επιλεγμένος κόμβος: κανένας
Μνήμη RAM (πλέγμα 5x6)
Κάθε κόμβος κρατάει prev (προηγούμενο) και next (επόμενο).
Λειτουργίες διπλά συνδεδεμένης λίστας
Πλήθος κόμβων:
Τιμή: Θέση:
Κάνε κλικ σε κόμβο για επιλογή. Η λίστα διαβάζεται από Head προς Tail και αντίστροφα.
Οδηγίες: Διάλεξε πόσους κόμβους θέλεις (1–10), δημιούργησε τη λίστα και παρατήρησε πώς αλλάζουν prev/next όταν εισάγεις ή διαγράφεις κόμβους.

Άσκηση: Στοίβα με απλά συνδεδεμένη λίστα (4 στοιχεία)

Ώθηση (push) και απώθηση (pop) σε δυναμική υλοποίηση στοίβας.
Γραφική αναπαράσταση στοίβας
Top: NULL
Μνήμη RAM της στοίβας (πλέγμα 5x6)
Η στοίβα χρησιμοποιεί κόμβους διάσπαρτους στη μνήμη. Ο δείκτης Top κρατάει την κορυφή.
Λειτουργίες στοίβας (LIFO)
Νέα τιμή:
Στη στοίβα προσθέτουμε και αφαιρούμε στοιχεία μόνο από την κορυφή (Top).
Εξήγηση: Εφάρμοσε push και pop και διάβασε τα βήματα που εμφανίζονται εδώ για κάθε λειτουργία.

Άσκηση: Ουρά με διπλά συνδεδεμένη λίστα

Εισαγωγή (enqueue) στο πίσω άκρο και εξαγωγή (dequeue) από το μπροστινό άκρο.
Γραφική αναπαράσταση ουράς
Front (Head): NULL • Rear (Tail): NULL
Μνήμη RAM της ουράς (πλέγμα 5x6)
Χρησιμοποιούνται δύο δείκτες: Head/Front (μπροστινό άκρο) και Rear (ουρά).
Λειτουργίες ουράς (FIFO)
Νέα τιμή:
Στην ουρά μπαίνουμε από το πίσω άκρο (Rear) και βγαίνουμε από το μπροστινό (Head/Front).
Εξήγηση: Κάνε εισαγωγή και εξαγωγή στοιχείων και παρατήρησε πώς αλλάζουν οι δείκτες Head/Front – Rear και τα πεδία prev/next στη μνήμη.

Ερωτήσεις Αυτοαξιολόγησης (Σωστό/Λάθος)

Επίλεξε τη σωστή απάντηση για κάθε ερώτηση.