Δομές Δεδομένων. Ενότητα 7: Άλλες παραλλαγές Συνδεδεμένων Λιστών-Παράσταση Αραιού Πολυωνύμου με Συνδεδεμένη Λίστα. Καθηγήτρια Μαρία Σατρατζέμη

Σχετικά έγγραφα
Δομές Δεδομένων. Καθηγήτρια Μαρία Σατρατζέμη. Τμήμα Εφαρμοσμένης Πληροφορικής. Δομές Δεδομένων. Τμήμα Εφαρμοσμένης Πληροφορικής

Δομές Δεδομένων. Ενότητα 4: Ο ΑΤΔ Λίστα & Υλοποίηση Λίστας με σειριακή αποθήκευση- Ο ΑΤΔ Συνδεδεμένη Λίστα- Υλοποίηση ΑΤΔ Συνδεδεμένη Λίστα με πίνακα

Δομές Δεδομένων. Ενότητα 6: Εφαρμογή Συνδεδεμένων Λιστών: Αλφαβητικό ευρετήριο κειμένου- Υλοποίηση ΑΤΔ Στοίβα και Ουρά με δείκτες

Δομές Δεδομένων. Ενότητα 2: Στοίβες Εισαγωγή-Υλοποίηση ΑΤΔ Στοίβα με Πίνακα-Εφαρμογή Στοίβας: Αντίστροφη Πολωνική Γραφή. Καθηγήτρια Μαρία Σατρατζέμη

Δομές Δεδομένων. Ενότητα 3: Ουρές Εισαγωγή-Υλοποίηση ΑΤΔ Ουρά με πίνακα. Καθηγήτρια Μαρία Σατρατζέμη. Τμήμα Εφαρμοσμένης Πληροφορικής.

Δομές Δεδομένων. Ενότητα 10: Πλήρη Δυαδικά Δέντρα, Μέγιστα/Ελάχιστα Δέντρα & Εισαγωγή στο Σωρό- Ο ΑΤΔ Μέγιστος Σωρός. Καθηγήτρια Μαρία Σατρατζέμη

Δομές Δεδομένων. Καθηγήτρια Μαρία Σατρατζέμη. Τμήμα Εφαρμοσμένης Πληροφορικής. Δομές Δεδομένων. Τμήμα Εφαρμοσμένης Πληροφορικής

Δομές Δεδομένων. Ενότητα 12: Κατακερματισμός: Χειρισμός Συγκρούσεων. Καθηγήτρια Μαρία Σατρατζέμη. Τμήμα Εφαρμοσμένης Πληροφορικής.

Δομές Δεδομένων. Ενότητα 1: Εισαγωγή-Υλοποίηση του ΑΤΔ Σύνολο με Πίνακα. Καθηγήτρια Μαρία Σατρατζέμη. Τμήμα Εφαρμοσμένης Πληροφορικής.

Υλοποίηση Λιστών. Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα:

Διάλεξη 21η: Απλά Συνδεδεμένες Λίστες

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα. Συστήματα Αυτομάτου Ελέγχου. Ενότητα Α: Γραμμικά Συστήματα

Τίτλος Μαθήματος: ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΑΝΑΛΥΣΗ ΑΛΓΟΡΙΘΜΩΝ

Διαδικαστικός Προγραμματισμός

Δομημένος Προγραμματισμός

Δομές Δεδομένων. Ενότητα 11: Τεχνικές Κατακερματισμού. Καθηγήτρια Μαρία Σατρατζέμη. Τμήμα Εφαρμοσμένης Πληροφορικής.

Μαθηματικά. Ενότητα 9: Όριο Συνάρτησης στο Διηνεκές. Σαριαννίδης Νικόλαος Τμήμα Λογιστικής και Χρηματοοικονομικής

Κατ οίκον Εργασία 2 Σκελετοί Λύσεων

Διάλεξη 22: Δυαδικά Δέντρα. Διδάσκων: Παναγιώτης Ανδρέου

Διάλεξη 07: Λίστες Ι Υλοποίηση & Εφαρμογές

ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΑΝΑΛΥΣΗ ΑΛΓΟΡΙΘΜΩΝ

ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΑΝΑΛΥΣΗ ΑΛΓΟΡΙΘΜΩΝ

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ. Δομές Δεδομένων. Ιωάννης Γ. Τόλλης Τμήμα Επιστήμης Υπολογιστών Πανεπιστήμιο Κρήτης

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ

Προγραμματισμός Η/Υ. 4 η ενότητα: Δομές Δεδομένων. Τμήμα. Τεχνολόγων Περιβάλλοντος. ΤΕΙ Ιονίων Νήσων. Ανοικτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Ιονίων Νήσων

Ηλεκτρονικοί Υπολογιστές

Οργάνωση Υπολογιστών ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ. Ασκήσεις 7: Πρόγραμμα Συνδεδεμένης Λίστας και Διαδικασιών. Μανόλης Γ.Η.

#include <stdlib.h> Α. [-128,127] Β. [-127,128] Γ. [-128,128]

Οντοκεντρικός Προγραμματισμός

Δομές Δεδομένων. Ενότητα 9: Τα ΔΔΑ ως Αναδρομικές Δομές Δεδομένων-Εφαρμογή Δυαδικών Δέντρων: Κωδικοί Huffman. Καθηγήτρια Μαρία Σατρατζέμη

Συλλογές, Στοίβες και Ουρές

ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΑΝΑΛΥΣΗ ΑΛΓΟΡΙΘΜΩΝ

Διάλεξη 17: Δυαδικά Δέντρα. Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

ΓΡΑΜΜΙΚΟΣ & ΔΙΚΤΥΑΚΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ

Οι λίστες, χάνοντας τα πλεονεκτήματα των πινάκων, λύνουν προβλήματα που παρουσιάζουν οι πίνακες

Προγραμματισμός Η/Υ 1 (Εργαστήριο)

Κεφάλαιο 10 Ψηφιακά Λεξικά

Εργαστήριο 4: Υλοποίηση Αφηρημένου Τύπου Δεδομένων: Ταξινομημένη Λίστα

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ. Ενότητα: ΔΟΜΕΣ ΕΠΑΝΑΛΗΨΗΣ ΚΥΡΟΠΟΥΛΟΣ ΚΩΝΣΤΑΝΤΙΝΟΣ. Τμήμα Διοίκηση Επιχειρήσεων (Κοζάνη)

Θερμοδυναμική - Εργαστήριο

Δομημένος Προγραμματισμός

Επιλογές και Κριτήρια Σχεδιασμού ΑΤΔ Ανεξαρτήτως από Γλώσσα Υλοποίησης 24/4/2012

ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΠΛΗΡΟΦΟΡΙΚΗ

Στοίβες με Δυναμική Δέσμευση Μνήμης

Πληροφορική. Εργαστηριακή Ενότητα 3 η : Επεξεργασία Κελιών Γραμμών & Στηλών. Ι. Ψαρομήλιγκος Τμήμα Λογιστικής & Χρηματοοικονομικής

Διάλεξη 12: Λίστες Υλοποίηση & Εφαρμογές. Διδάσκων: Παναγιώτης Ανδρέου

Εισαγωγή στον δομημένο προγραμματισμό

Διάλεξη 08: Λίστες ΙΙ Κυκλικές Λίστες

Τμήμα Μηχανικών Πληροφορικής και Τηλεπικοινωνιών

Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης Creative Commons. Για εκπαιδευτικό υλικό, όπως εικόνες, που υπόκειται σε άλλου τύ

ΒΟΗΘΗΤΙΚΕΣ ΣΗΜΕΙΩΣΕΙΣ

Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης Creative Commons. Για εκπαιδευτικό υλικό, όπως εικόνες, που υπόκειται σε άλλου τύ

Μοντελοποίηση Λογικών Κυκλωμάτων

Θεωρία Πιθανοτήτων & Στατιστική

1 η ΑΣΚΗΣΗ ΣΤΗΝ ΑΡΧΙΤΕΚΤΟΝΙΚΗ ΥΠΟΛΟΓΙΣΤΩΝ. Ακ. έτος , 5ο Εξάμηνο, Σχολή ΗΜ&ΜΥ

Υπολογιστικά Συστήματα

Λογική Δημήτρης Πλεξουσάκης Φροντιστήριο 6: Προτασιακός Λογισμός: Μέθοδος Επίλυσης Τμήμα Επιστήμης Υπολογιστών

Μαθηματικά. Ενότητα 3: Ολοκληρωτικός Λογισμός Σαριαννίδης Νικόλαος Τμήμα Διοίκησης Επιχειρήσεων (Κοζάνη)

Ψευδοκώδικας. November 7, 2011

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα ΕΠΕΞΕΡΓΑΣΙΑ ΕΙΚΟΝΑΣ. Ενότητα 3: Αποκατάσταση Εικόνας.

Δομές Δεδομένων. Ενότητα 13: B-Δέντρα/AVL-Δέντρα. Καθηγήτρια Μαρία Σατρατζέμη. Τμήμα Εφαρμοσμένης Πληροφορικής. Δομές Δεδομένων

Θεωρητικό Μέρος. int rec(int n) { int n1, n2; if (n <= 5) then return n; else { n1 = rec(n-5); n2 = rec(n-3); return (n1+n2); } }

Μαθηματικά. Ενότητα 2: Δεκαδικοί αριθμοί, κλάσματα, δυνάμεις, ρίζες και ποσοστά. Σαριαννίδης Νικόλαος Τμήμα Λογιστικής και Χρηματοοικονομικής

ΓΡΑΜΜΙΚΟΣ & ΔΙΚΤΥΑΚΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ

ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΑΝΑΛΥΣΗ ΑΛΓΟΡΙΘΜΩΝ

ΣΤΑΤΙΣΤΙΚΗ ΑΝΑΛΥΣΗ ΜΕ ΧΡΗΣΗ Η/Υ

Δομές Δεδομένων Ενότητα 4

Προγραμματισμός Υπολογιστών & Υπολογιστική Φυσική

ΘΕΩΡΙΑ ΠΑΙΓΝΙΩΝ. Ενότητα 7: Τέλεια ισορροπία Nash για υποπαίγνια. Ρεφανίδης Ιωάννης Τμήμα Εφαρμοσμένης Πληροφορικής

ΜΑΘΗΜΑ: ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΠΛΗΡΟΦΟΡΙΚΗ

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης Creative Commons. Για εκπαιδευτικό υλικό, όπως εικόνες, που υπόκειται σε άλλου τύ

ΘΕΩΡΙΑ ΥΠΟΛΟΓΙΣΜΩΝ ΚΑΙ ΑΥΤΟΜΑΤΩΝ

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ

Βασικές Δομές Δεδομένων

Ενότητα 2: Στοίβες Ουρές - Λίστες Ασκήσεις και Λύσεις

Διάλεξη 08: Λίστες ΙΙ Κυκλικές Λίστες

Διδάσκων: Παναγιώτης Ανδρέου

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ. ΘΕΩΡΗΤΙΚΗ ΑΣΚΗΣΗ 2 ΛΥΣΕΙΣ Γραμμικές Δομές Δεδομένων, Ταξινόμηση

Μεταγλωττιστές. Ενότητα 4: Τυπικές γλώσσες (Μέρος 3 ο ) Αγγελική Σγώρα Τμήμα Μηχανικών Πληροφορικής ΤΕ

Τμήμα Μηχανικών Πληροφορικής και Τηλεπικοινωνιών

Αρχιτεκτονική Υπολογιστών Ασκήσεις Εργαστηρίου

Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης Creative Commons. Για εκπαιδευτικό υλικό, όπως εικόνες, που υπόκειται σε άλλου τύ

Προγραμματισμός Η/Υ 1 (Εργαστήριο)

Διάλεξη 15: Δομές Δεδομένων IV (Διπλά Συνδεδεμένες Λίστες)

ΓΡΑΜΜΙΚΗ ΑΛΓΕΒΡΑ. ΕΝΟΤΗΤΑ: Διανυσματικοί Χώροι (1) ΔΙΔΑΣΚΩΝ: Βλάμος Παναγιώτης ΙΟΝΙΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ

ιαφάνειες παρουσίασης #11

Πληροφορική II. Ενότητα 5 : Δομές Δεδομένων και αφηρημένοι. τύποι δεδομένων. Δρ. Γκόγκος Χρήστος

ΔΙΔΑΣΚΩΝ: Δρ. Στυλιανός Τσίτσος

Το Πρόβλημα του Περιοδεύοντος Πωλητή - The Travelling Salesman Problem

Πληροφορική ΙΙ Θεματική Ενότητα 5

Κατ οίκον Εργασία 2 Σκελετοί Λύσεων

Οικονομικά Μαθηματικά

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

Τεχνικές Προγραμματισμού και Χρήση Λογισμικού Η/Υ στις Κατασκευές

Ηλεκτρονικοί Υπολογιστές

Πληροφορική ΙΙ Θεματική Ενότητα 7

ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΑΝΑΛΥΣΗ ΑΛΓΟΡΙΘΜΩΝ

ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΑΝΑΛΥΣΗ ΑΛΓΟΡΙΘΜΩΝ

Προγραμματισμός Υπολογιστών & Υπολογιστική Φυσική

Transcript:

Ενότητα 7: Άλλες παραλλαγές Συνδεδεμένων Λιστών-Παράσταση Αραιού Πολυωνύμου με Συνδεδεμένη Λίστα Καθηγήτρια Μαρία Σατρατζέμη

Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης Creative Commons. Για εκπαιδευτικό υλικό, όπως εικόνες, που υπόκειται σε άλλου τύπου άδειας χρήσης, η άδεια χρήσης αναφέρεται ρητώς. 2

Χρηματοδότηση Το παρόν εκπαιδευτικό υλικό έχει αναπτυχθεί στα πλαίσια του εκπαιδευτικού έργου του διδάσκοντα. Το έργο «Ανοικτά Ακαδημαϊκά Μαθήματα στο Πανεπιστήμιο Μακεδονίας» έχει χρηματοδοτήσει μόνο τη αναδιαμόρφωση του εκπαιδευτικού υλικού. Το έργο υλοποιείται στο πλαίσιο του Επιχειρησιακού Προγράμματος «Εκπαίδευση και Δια Βίου Μάθηση» και συγχρηματοδοτείται από την Ευρωπαϊκή Ένωση (Ευρωπαϊκό Κοινωνικό Ταμείο) και από εθνικούς πόρους. 3

Σκοποί ενότητας Να γνωρίζουν τις παραλλαγές συνδεδεμένων λιστών Τις λίστες με κόμβο κεφαλή και τους αλγόριθμους εισαγωγής, διαγραφής στοιχείου και διάσχισης Τις κυκλικές λίστες και τους αλγόριθμους εισαγωγής, διαγραφής στοιχείου και διάσχισης Να χρησιμοποιούν συνδεδεμένες λίστες (με κόμβο κεφαλή) για να αποθηκεύσουν αραιά πολυώνυμα. Υλοποίηση της πρόσθεσης αραιών πολυωνύμων με κόμβο κεφαλή 4

Περιεχόμενα ενότητας[1] Παραλλαγές συνδεδεμένων λιστών Λίστες με κόμβους κεφαλή Αλγόριθμος Εισαγωγή στοιχείου Αλγόριθμος διαγραφής στοιχείου Αλγόριθμος διάσχισης εισαγωγής στοιχείου Κυκλικές συνδεδεμένες λίστες Εισαγωγή στοιχείου σε κυκλική συνδεδεμένη λίστα Αλγόριθμος διαγραφής στοιχείου 5

Περιεχόμενα ενότητας[2] Πολυώνυμα Αραιά πολυώνυμα Αραιά πολυώνυμα: αποθήκευση λίστας Δηλώσεις Παράδειγμα: πρόσθεση πολυωνύμων Αλγόριθμος πρόσθεσης πολυωνύμων Εφαρμογή του αλγορίθμου Διαδικασία πρόσθεσης συνδεδεμένων πολυωνύμων 6

Άλλες παραλλαγές Συνδεδεμένων Λιστών 7

Παραλλαγές συνδεδεμένων λιστών Οι στοίβες και οι ουρές είναι ειδικές περιπτώσεις λιστών και είδαμε πώς μπορούν να υλοποιηθούν ως συνδεδεμένες λίστες. Στην παράγραφο αυτήν θα δούμε ακόμα δύο περιπτώσεις λιστών: τις λίστες με κόμβους κεφαλή (lists with head nodes) και τις κυκλικές συνδεδεμένες λίστες (circular linked lists). 8

Λίστες με κόμβους κεφαλή -1- Ο πρώτος κόμβος μιας τυπικής συνδεδεμένης λίστας διαφέρει από τους υπόλοιπους, γιατί δεν έχει προηγούμενο κόμβο. Εξ αιτίας αυτού του γεγονότος ξεχωρίσαμε δύο περιπτώσεις για τις διαδικασίες εισαγωγής και διαγραφής. Κάτι τέτοιο όμως μπορεί να αποφευχθεί αν εξασφαλίσουμε ότι κάθε κόμβος που περιέχει κάποιο στοιχείο θα έχει προηγούμενο κόμβο, εισάγοντας στην αρχή της λίστας έναν εικονικό πρώτο κόμβο, τον κόμβο κεφαλή (head node): 9

Λίστες με κόμβους κεφαλή -2- Στο τμήμα δεδομένου αυτού του κόμβου δεν αποθηκεύεται στην πραγματικότητα κανένα στοιχείο της λίστας. Ο κόμβος κεφαλή είναι ο προηγούμενος του κόμβου στον οποίο αποθηκεύεται το πρώτο στοιχείο, γιατί δείχνει σ' αυτόν τον πραγματικά πρώτο κόμβο. Ένα παράδειγμα φαίνεται παρακάτω: 10

Λίστες με κόμβους κεφαλή -3- Σ' αυτού του είδους τις λίστες κάθε συνδεδεμένη λίστα πρέπει να έχει έναν κόμβο κεφαλή κι επομένως μια κενή λίστα έχει μόνο τον κόμβο κεφαλή, όπως φαίνεται παρακάτω: Για να δημιουργήσουμε μια κενή λίστα, δεν χρειάζεται απλά να δώσουμε την τιμή NULL σε έναν δείκτη List, αλλά πρέπει να πάρουμε έναν κόμβο κεφαλή στον οποίο να δείχνει ο List και το πεδίο δεσμού του να είναι NULL. Στην C αυτό γίνεται με τις ακόλουθες εντολές: List = (ListPointer)malloc(sizeof(struct ListNode); List->next = NULL; 11

Λίστες με κόμβους κεφαλή -4- Για να εξετάσουμε τώρα αν μια τέτοια λίστα είναι κενή αρκεί να ελέγξουμε αν List->next == NULL και όχι αν List == NULL 12

Λίστες με κόμβους κεφαλή -5- Όπως φαίνεται και από το προηγούμενο σχήμα, δημιουργήσαμε μια κενή λίστα με έναν κόμβο κεφαλή ορίζοντας το τμήμα δεσμού του σε NULL χωρίς όμως να δίνουμε κάποια τιμή στο τμήμα δεδομένου του. Σε ορισμένες περιπτώσεις είναι δυνατό να αποθηκεύουμε στο τμήμα δεδομένου του κόμβου κεφαλή κάποια πληροφορία σχετική με τη λίστα. 13

Λίστες με κόμβους κεφαλή -6- Αν, για παράδειγμα οι Ελένη, Μαρία και Φωτεινή δουλεύουν στην εταιρεία Star, τότε μπορούμε να αποθηκεύσουμε το όνομα της εταιρείας στον κόμβο κεφαλή ως εξής: Επειδή σε μια λίστα με κόμβο κεφαλή, για όλους τους κόμβους που περιέχουν στοιχεία της λίστας, υπάρχει προηγούμενος κόμβος, οι διαδικασίες εισαγωγής και διαγραφής είναι πιο απλοποιημένες. 14

Διαδικασία εισαγωγής στοιχείου (1) Παίρνουμε ένα νέο κόμβο, στον οποίο δείχνει προσωρινά ο δείκτης TempPtr (2) Data(TempPtr) <-Item (3) Next(TempPtr) <- Next(PredPtr) (4) Next(PredPtr)<- TempPtr 15

Αλγόριθμος εισαγωγής στοιχείου /*Δέχεται: Μια συνδεδεμένη λίστα με κόμβο κεφαλή, που δεικτοδοτείται από τον List, ένα στοιχείο δεδομένων Item και έναν δείκτη PredPtr. Λειτουργία:Εισάγει έναν κόμβο, που περιέχει το Item, μέσα στην συνδεδεμένη λίστα μετά από τον κόμβο που δεικτοδοτείται από τον PredPtr. Επιστρέφει: Την τροποποιημένη συνδεδεμένη λίστα με κόμβο κεφαλή που δεικτοδοτείται από τον List.*/ (1) Παίρνουμε ένα νέο κόμβο, στον οποίο δείχνει προσωρινά ο δείκτης TempPtr (2) Data(TempPtr) <-Item (3) Next(TempPtr) <- Next(PredPtr) (4) Next(PredPtr)<- TempPtr 16

Διαδικασία διαγραφής στοιχείου (1) TempPtr <- Next(PredPtr) (2) Next(PredPtr)<-Next(TempPtr) 17

Αλγόριθμος διαγραφής στοιχείου -1- /*Δέχεται: Μια συνδεδεμένη λίστα με κόμβο κεφαλή που δεικτοδοτείται από τον List και έναν δείκτη PredPtr. Λειτουργία: Διαγράφει από τη συνδεδεμένη λίστα τον κόμβο που έχει για προηγούμενό του αυτόν στον οποίο δείχνει ο PredPtr, αν η λίστα δεν είναι κενή. Επιστρέφει: Την τροποποιημένη συνδεδεμένη λίστα με τον πρώτο κόμβο να δεικτοδοτείται από τον List. Έξοδος: Ένα μήνυμα κενής λίστας αν η συνδεδεμένη λίστα είναι κενή.*/ 18

Αλγόριθμος διαγραφής στοιχείου -1- Αν η λίστα είναι κενή τότε Γράψε 'Προσπαθείς να διαγράψεις στοιχείο από κενή λίστα' Αλλιώς 1. TempPtr Next(PredPtr) 2. Next(PredPtr) Next(TempPtr) 3. Να επιστρέψεις τον κόμβο στον οποίο δείχνει ο TempPtr στην δεξαμενή των διαθέσιμων κόμβων Τέλος_αν 19

Αλγόριθμος διάσχισης -1- /*Δέχεται: Μια συνδεδεμένη λίστα με κόμβο κεφαλή που δεικτοδοτείται από τον List. Λειτουργία: Διασχίζει τη λίστα με τη βοήθεια του δείκτη CurrPtr που δείχνει τον τρέχοντα κάθε φορά κόμβο της συνδεδεμένης λίστας και επεξεργάζεται κάθε στοιχείο μόνο μια φορά. Επιστρέφει: Εξαρτάται από το είδος της επεξεργασίας.*/ 20

Αλγόριθμος διάσχισης -2-1. CurrPtr Next(List) 2. Όσο CurrPtr!= NULL επανάλαβε α. Πάρε το τρέχον Data(CurrPtr) για επεξεργασία β. CurrPtr Next(CurrPtr) Τέλος_επανάληψης 21

Κυκλικές συνδεδεμένες λίστες -1- Όταν μελετήσαμε την υλοποίηση των ουρών με πίνακα, είδαμε ότι μπορούσαμε να αντιμετωπίσουμε το πρόβλημα της μετατόπισης των στοιχείων μέσα στον πίνακα, χρησιμοποιώντας έναν κυκλικό πίνακα στον οποίο το πρώτο στοιχείο ακολουθεί το τελευταίο. 22

Κυκλικές συνδεδεμένες λίστες -2- Η ίδια ιδέα μπορεί να εφαρμοστεί και σε μια συνδεδεμένη λίστα, αν ο τελευταίος κόμβος δείχνει στον πρώτο, δηλαδή αν έχουμε μια κυκλική συνδεδεμένη λίστα (circular linked list) όπως η παρακάτω 23

Εισαγωγή στοιχείου σε κυκλική Αν η λίστα είναι κενή: (3) Next(TempPtr) <-TempPtr (4) CList <- TempPtr συνδεδεμένη λίστα (1) Παίρνουμε ένα νέο κόμβο, στον οποίο δείχνει προσωρινά ο δείκτης TempPtr (2) Data(TempPtr) <-Item Αν η λίστα δεν είναι κενή: (3) Next(TempPtr) <- Next(PredPtr) (4) Next(PredPtr) <- TempPtr 24

Αλγόριθμος εισαγωγής στοιχείου -1- /*Δέχεται: Μια κυκλική συνδεδεμένη λίστα με τον πρώτο κόμβο να δεικτοδοτείται από τον CList, ένα στοιχείο Item και έναν δείκτη PredPtr. Λειτουργία: Εισάγει έναν κόμβο, που περιέχει το Item, μέσα στην κυκλική λίστα μετά από τον κόμβο που δεικτοδοτείται από τον PredPtr (εφόσον υπάρχει κάποιος). Επιστρέφει: Την τροποποιημένη κυκλική συνδεδεμένη λίστα που δεικτοδοτείται από τον CList.*/ 25

Αλγόριθμος εισαγωγής στοιχείου -2-1. Πάρε έναν κόμβο στον οποίο να δείχνει ο TempPtr 2. Data(TempPtr) Item 3. Αν η λίστα είναι κενή τότε α. Next(TempPtr) TempPtr β. CList TempPtr Αλλιώς α. Next(TempPtr) Next(PredPtr) β. Next(PredPtr) TempPtr Τέλος_αν 26

Αλγόριθμος διαγραφής στοιχείου -1- /*Δέχεται: Μια συνδεδεμένη κυκλική λίστα με τον πρώτο κόμβο να δεικτοδοτείται από τον CList και έναν δείκτη PredPtr. Λειτουργία: Διαγράφει από τη λίστα τον κόμβο που έχει για προηγούμενό του αυτόν στον οποίο δείχνει ο PredPtr, αν υπάρχει κάποιος. Επιστρέφει: Την τροποποιημένη συνδεδεμένη λίστα με τον πρώτο κόμβο να δεικτοδοτείται από τον CList.*/ 27

Αλγόριθμος διαγραφής στοιχείου -2- Αν η λίστα είναι κενή τότε Γράψε 'Προσπαθείς να διαγράψεις στοιχείο από κενή λίστα' Αλλιώς 1. TempPtr Next(PredPtr) 2. Αν TempPtr == PredPtr τότε CList nil Αλλιώς Next(PredPtr) Next(TempPtr) Τέλος_αν 3. Να επιστρέψεις τον κόμβο στον οποίο δείχνει ο TempPtr στη δεξαμενή των διαθέσιμων κόμβων Τέλος_αν 28

Αλγόριθμος διάσχισης κυκλ. Συνδεδεμένης λίστας -1- /*Δέχεται: Μια κυκλική συνδεδεμένη λίστα με τον πρώτο κόμβο να δεικτοδοτείται από τον CList. Λειτουργία: Διασχίζει την κυκλική συνδεδεμένη λίστα με τη βοήθεια του δείκτη CurrPtr που δείχνει τον τρέχοντα κάθε φορά κόμβο της κυκλικής συνδεδεμένης λίστας και επεξεργάζεται κάθε στοιχείο της κυκλικής συνδεδεμένης λίστας μόνο μια φορά. Επιστρέφει: Εξαρτάται από το είδος της επεξεργασίας.*/ 29

Αλγόριθμος διάσχισης κυκλ. Συνδεδεμένης λίστας -2- Αν η λίστα δεν είναι κενή τότε 1. CurrPtr CList 2. Αρχή_επανάληψης α. Πάρε το τρέχον στοιχείο Data(CurrPtr) για επεξεργασία β. CurrPtr Next(CurrPtr) Μέχρις_ότου (CurrPtr == CList) Τέλος_αν 30

Αλγόριθμος διαγραφής στοιχείου σε κυκλ. ΣΛ. -1- Μπορούμε, επίσης, να έχουμε μια κυκλική συνδεδεμένη λίστα με κόμβο κεφαλή, όπως φαίνεται στο παρακάτω σχήμα: 31

Αλγόριθμος διαγραφής στοιχείου σε κυκλ. ΣΛ. -2- Σε ορισμένες περιπτώσεις είναι προτιμότερο ο δείκτης Clist να δείχνει στον τελευταίο κόμβο και όχι στον πρώτο, γιατί έτσι μπορούμε να έχουμε άμεση πρόσβαση στον τελευταίο κόμβο και σχεδόν άμεση πρόσβαση και στον πρώτο, αφού ο Next(Clist) δείχνει στον πρώτο κόμβο: 32

Παράσταση Αραιού Πολυωνύμου με Συνδεδεμένη Λίστα 33

Πολυώνυμα Είναι γνωστό ότι σ' ένα πολυώνυμο Ρ(x) της μορφής Ρ(x)= a 0 + a 1 x + a 2 x 2 +... + a n x n οι a 0,, a 1, a 2,..., a n ονομάζονται συντελεστές (coefficients) του πολυωνύμου και ο αριθμός n που αντιστοιχεί στη μεγαλύτερη δύναμη του x με a n 0 ονομάζεται βαθμός (degree) του πολυωνύμου. Έτσι, για παράδειγμα, το πολυώνυμο Ρ(x)= 3-5x + 21x 2 + x 3 έχει συντελεστές 3, -5, 21, 1 και βαθμό 3, ενώ το πολυώνυμο Q(x)= 5 έχει έναν συντελεστή, 5, και βαθμό 0. 34

Αραιά πολυώνυμα -1- Αν ο βαθμός του πολυωνύμου που αποθηκεύεται σε έναν τέτοιο πίνακα δεν διαφέρει πολύ από το άνω όριο που τίθεται από το μέγεθος του πίνακα και οι μηδενικοί συντελεστές δεν είναι πολλοί, τότε μια αναπαράσταση σαν την παραπάνω είναι ικανοποιητική. Ωστόσο, υπάρχουν πολυώνυμα που έχουν λίγους μη μηδενικούς συντελεστές. Τα πολυώνυμα αυτά ονομάζονται αραιά πολυώνυμα (sparse polynomials) και ένας πίνακας δεν είναι η κατάλληλη αποθηκευτική δομή για τους συντελεστές τους. 35

Αραιά πολυώνυμα -2- Ένα παράδειγμα αραιού πολυωνύμου είναι το παρακάτω: Ρ(x)= 12x - 3x 2 + 3x 70 το οποίο μπορεί να γραφτεί και ως Ρ(x) = 0 + 12x - 3x 2 + 0x 3 + 0x 4 +... + 0x 69 + 3x 70. 36

Αραιά πολυώνυμα -3- Η αποθήκευση αυτού του πολυωνύμου σε πίνακα θα απαιτούσε 71 θέσεις, από τις οποίες μόνο οι 3 θα είχαν μη μηδενικές τιμές, ενώ οι υπόλοιπες 68 θα είχαν μηδενικές. Κάτι τέτοιο συνεπάγεται σπατάλη μνήμης, την οποία μπορούμε να αποφύγουμε αν αποθηκεύσουμε μόνο τους μη μηδενικούς συντελεστές. Βέβαια, σ' αυτήν την περίπτωση θα πρέπει να αποθηκεύσουμε και τη δύναμη του x που αντιστοιχεί σε κάθε συντελεστή. 37

Αραιά πολυώνυμα -5- Επομένως, μπορούμε να παραστήσουμε ένα πολυώνυμο σαν μια λίστα από ζεύγη συντελεστών-εκθετών. Για το παραπάνω πολυώνυμο η λίστα που σχηματίζεται είναι η ακόλουθη: ((12, 1),(-3, 2),(3, 70)) 38

Αραιά πολυώνυμα: αποθήκευση λίστας -1- Για την αποθήκευση μιας τέτοιας λίστας μπορούμε να χρησιμοποιήσουμε έναν πίνακα εγγραφών με ένα πεδίο Coefficient για τον συντελεστή και ένα πεδίο Exponent για τον εκθέτη. Πάλι όμως θα έχουμε το πρόβλημα του σταθερού μεγέθους του πίνακα που περιορίζει το μέγεθος της λίστας. Κατά συνέπεια, μια πιο κατάλληλη δομή αποθήκευσης είναι η συνδεδεμένη λίστα. 39

Αραιά πολυώνυμα: αποθήκευση λίστας -2- Κάθε κόμβος της λίστας θα περιέχει: ένα τμήμα Coef, για την αποθήκευση ενός μη μηδενικού συντελεστή, ένα τμήμα Exp, για την αποθήκευση του αντίστοιχου εκθέτη, και ένα τμήμα Next, για την αποθήκευση του δείκτη που δείχνει στον επόμενο όρο του πολυωνύμου: 40

Αραιά πολυώνυμα: αποθήκευση λίστας -3- Για παράδειγμα, το πολυώνυμο Ρ(x)= 12x - 3x 2 + 3x 70 μπορεί να αποθηκευτεί σε μια συνδεδεμένη λίστα με κόμβο κεφαλή, όπου ο βαθμός του πολυωνύμου αποθηκεύεται στο τμήμα Exp του κόμβου κεφαλή: 41

Δηλώσεις typedef int CoefficientType; typedef struct PolyNode *PolyPointer; typedef struct PolyNode { CoefficientType Coef; int Expo; PolyPointer next; } PolyNode; typedef enum { FALSE, TRUE } boolean; 42

Παράδειγμα: πρόσθεση πολυωνύμων -1- Για να γίνει κατανοητός ο τρόπος επεξεργασίας των πολυωνύμων, μπορούμε να θεωρήσουμε τη λειτουργία της πρόσθεσης δυο πολυωνύμων, π.χ. των P(x) και Q(x): P(x)= 2 + 5x 2-12x 3 - x 4 - x 6 Q(x)= 12x 3 - x 4 + 2x 5 + 24x 6 Fια να προσθέσουμε δύο πολυώνυμα, προσθέτουμε τους συντελεστές των όρων που έχουν τον ίδιο εκθέτη. Tο αποτέλεσμα της πρόσθεσης είναι: W(x)= P(x) + Q(x)= 2 + 5x 2-2x 4 + 2x 5 + 23x 6 43

Παράδειγμα: πρόσθεση πολυωνύμων -2- P(x)= 2 + 5x 2-12x 3 - x 4 - x 6 Q(x)= 12x 3 - x 4 + 2x 5 + 24x 6 W(x)= P(x) + Q(x)= 2 + 5x 2-2x 4 + 2x 5 + 23x 6 Αν παραστήσουμε τα πολυώνυμα P(x) και Q(x) σαν συνδεδεμένες λίστες με κόμβους κεφαλή τότε θα παραστήσουμε και το W(x) σαν συνδεδεμένη λίστα που αρχικά έχει μόνο τον κόμβο κεφαλή χωρίς τιμές: 44

Παράδειγμα: πρόσθεση πολυωνύμων -3- Χρειαζόμαστε τρεις δείκτες, CurrPtrP, CurrPtrQ και CurrPtrW: οι CurrPtrP και CurrPtrQ θα δείχνουν στον κόμβο των λιστών P και Q αντίστοιχα που επεξεργαζόμαστε την τρέχουσα στιγμή, ενώ ο CurrPtrW θα δείχνει στον τελευταίο κόμβο που προστέθηκε στη λίστα W. Αρχικά οι CurrPtrP και CurrPtrQ θα δείχνουν στους κόμβους P->next και Q->next και ο CurrPtrW θα δείχνει εκεί που δείχνει και ο W: 45

Παράδειγμα: πρόσθεση πολυωνύμων -3-46

Αλγόριθμος πρόσθεσης πολυωνύμων -1- Κάθε φορά, συγκρίνουμε τους εκθέτες που είναι αποθηκευμένοι στους κόμβους στους οποίους δείχνουν οι CurrPtrP και CurrPtrQ. Αν οι εκθέτες είναι ίδιοι, τότε προσθέτουμε τους αντίστοιχους συντελεστές. Εδώ διακρίνουμε δύο περιπτώσεις: α) αν το αποτέλεσμα δεν είναι μηδέν, τότε προσθέτουμε έναν καινούργιο κόμβο στη λίστα W και αποθηκεύουμε το άθροισμα των συντελεστών στο τμήμα Coef του και τον κοινό εκθέτη στο τμήμα Exp. Οι τρεις δείκτες CurrPtrP, CurrPtrQ και CurrPtrW προχωρούν στους επόμενους κόμβους αντίστοιχα. β) αν το άθροισμα των συντελεστών είναι μηδέν, τότε δεν προσθέτουμε νέο κόμβο στη λίστα W, αλλά απλώς αυξάνουμε τους CurrPtrP και CurrPtrQ. 47

Αλγόριθμος πρόσθεσης πολυωνύμων -2- Αν οι εκθέτες είναι διαφορετικοί, τότε προστίθεται ένας νέος κόμβος στην λίστα W, με τον μικρότερο από τους δύο εκθέτες στο τμήμα Exp και τον αντίστοιχο συντελεστή στο τμήμα Coef. Ο δείκτης που έδειχνε στον μικρότερο εκθέτη και ο CurrPtrW προχωρούν στους επόμενους κόμβους. Η διαδικασία συνεχίζεται μέχρι να φτάσουμε στο τέλος της λίστας P ή Q, δηλαδή μέχρι ένας από τους CurrPtrP και CurrPtrQ να πάρει τιμή nil. 48

Αλγόριθμος πρόσθεσης πολυωνύμων -3- Αν δεν φτάσουμε συγχρόνως στο τέλος και της άλλης λίστας, τότε αντιγράφουμε τους υπόλοιπους κόμβους και τους προσθέτουμε στη λίστα W και θέτουμε το τμήμα δεσμού του τελευταίου κόμβου ίσο με nil. Πιο συγκεκριμένα, η διαδικασία της πρόσθεσης των πολυωνύμων P(x) και Q(x) φαίνεται παρακάτω: 49

Εφαρμογή του αλγορίθμου 50

Διαδικασία πρόσθεσης συνδεδεμένων πολυωνύμων -1- void LinkedPolyAdd(PolyPointer P, PolyPointer Q, PolyPointer *W) /*Δέχεται: Δύο πολυώνυμα, P και Q. Λειτουργία: Υπολογίζει το άθροισμα W = P+Q. Επιστρέφει: Το πολυώνυμο W. Σημείωση: Τα πολυώνυμα παριστάνονται ως συνδεδεμένες λίστες με κόμβο κεφαλή.*/ 51

Διαδικασία πρόσθεσης συνδεδεμένων πολυωνύμων -2- { PolyPointer ptrp,ptrq,ptrw,tempptr; CoefficientType sum; ptrp = P->next; ptrq = Q->next; *W = (PolyPointer)malloc(sizeof(struct PolyNode)); ptrw = *W; 52

Διαδικασία πρόσθεσης συνδεδεμένων πολυωνύμων -3- while (ptrp!= NULL && ptrq!= NULL) { if (ptrp->expo < ptrq->expo) { //αντιγραφή του όρου από το P Attach(ptrP->Coef, ptrp->expo,&ptrw); ptrp = ptrp->next; } else 53

if (ptrp->expo > ptrq->expo) //αντιγραφή του όρου από το Q { Attach(ptrQ->Coef, ptrq->expo,&ptrw); ptrq = ptrq->next; } } Διαδικασία πρόσθεσης συνδεδεμένων πολυωνύμων -4- } else { //ίδιοι εκθέτες sum = ptrp->coef + ptrq->coef; if (sum!= 0) Attach(sum,ptrP->Expo,&ptrW); ptrp = ptrp->next; ptrq = ptrq->next; 54

Διαδικασία πρόσθεσης συνδεδεμένων πολυωνύμων -5- // αντιγραφή των υπολοίπων όρων του P ή του Q στο W if (ptrp!= NULL) TempPtr = ptrp; else TempPtr = ptrq; while (TempPtr!= NULL) { Attach(TempPtr-> Coef, TempPtr-> Expo, &ptrw); TempPtr = TempPtr->next; } ptrw->next = NULL; } 55

H διαδικασία Αttach -1- void Attach(CoefficientType Co,int Ex, PolyPointer *Last /*Δέχεται: Έναν συντελεστή Coef, έναν εκθέτη Exp και έναν δείκτη Last. Λειτουργία: Δημιουργεί έναν κόμβο που περιέχει τους Coef και Exp, τον συνδέει με τον κόμβο στον οποίο δείχνει ο Last και κάνει τον Last να δείχνει σ' αυτόν τον νέο κόμβο. Επιστρέφει: Τον τροποποιημένο δείκτη Last.*/ 56

H διαδικασία Αttach -2- { } PolyPointer TempPtr; TempPtr= (PolyPointer)malloc(sizeof(struct PolyNode)); TempPtr->Coef = Co; TempPtr->Expo = Ex; TempPtr->next = NULL; (*Last)->next = TempPtr; *Last = TempPtr; 57

Χρήση πίνακα Αν χρησιμοποιηθεί πίνακας ως αποθηκευτική δομή των πολυωνύμων, όπως περιγράφτηκε πιο πάνω, τότε η διαδικασία της πρόσθεσης είναι αρκετά πιο απλή. Το μόνο που χρειάζεται είναι ο παρακάτω βρόχος for: for (i = 0; i <= MaxDegree; i++) W[i] = P[i]+Q[i]; όπου MaxDegree είναι ο μέγιστος βαθμός των πολυωνύμων P και Q. 58

Τέλος Ενότητας