Η παρουσίαση φορτώνεται. Παρακαλείστε να περιμένετε

Η παρουσίαση φορτώνεται. Παρακαλείστε να περιμένετε

Διδάσκων: Δρ. Τσίντζα Παναγιώτα

Παρόμοιες παρουσιάσεις


Παρουσίαση με θέμα: "Διδάσκων: Δρ. Τσίντζα Παναγιώτα"— Μεταγράφημα παρουσίασης:

1 Διδάσκων: Δρ. Τσίντζα Παναγιώτα
ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ Διδάσκων: Δρ. Τσίντζα Παναγιώτα

2 Λίστα – ορισμός Γραµµική λίστα (linear list) είναι ένα πεπερασµένο σύνολο από κόµβους x1, x2, , xn όπου το στοιχείο xk προηγείται του στοιχείου xk+1 και έπεται του xk-1. Κατατάσσονται συνήθως σε δύο κατηγορίες: Σειριακές γραµµικές λίστες (sequential linear lists) => συνεχόµενες θέσεις µνήµης του Η/Υ για την αποθήκευση των κόµβων. Συνδεδεµένες γραµµικές λίστες (linked linear lists) => οι κόµβοι των λιστών βρίσκονται σε αποµακρυσµένες θέσεις που είναι µεταξύ τους συνδεδεµένες

3 Γραμμικές λίστες Χαρακτηρίζονται σαν:
Στατικές δοµές δεδοµένων (static data structures) Κατά τον προγραµµατισµό των λειτουργιών των λιστών, έχει προκαθορισθεί το µέγεθος της µνήµης που απαιτείται για την αποθήκευση των λιστών. ∆υναµικές δοµές δεδοµένων (dynamic data structures) Μια λίστα µπορεί να αυξοµειωθεί κατά την διάρκεια εκτέλεσης του προγράµµατος.

4 Σειριακές γραμμικές λίστες

5 LIFO (Last In First Out)
Στοίβα Φανταστείτε μια στοίβα από πιάτα. Κάθε νέο στοιχείο τοποθετείται στην κορυφή (top ή head). Το στοιχείο που βρίσκεται στην κορυφή της στοίβας εξέρχεται πρώτο. Αυτή η µέθοδος επεξεργασίας ονοµάζεται LIFO (Last In First Out) 4 3 2 1 10 top 7 8

6 Υλοποίηση στοίβας Με τη χρήση µονοδιάστατου πίνακα και δείκτη.
Κύριες λειτουργίες στη στοίβα: Ώθηση (push) στοιχείου στην κορυφή της στοίβας Απώθηση (pop) στοιχείου από τη στοίβα

7 Λειτουργίες Ώθησης (εισαγωγή στοιχείου): Απώθησης (αφαίρεση στοιχείου)
πρέπει οπωσδήποτε να ελέγχει µήπως η στοίβα είναι γεµάτη, οπότε έχουµε υπερχείλιση (overflow). Απώθησης (αφαίρεση στοιχείου) πρέπει να ελέγχει αν η στοίβα έχει αδειάσει, οπότε έχουµε υποχείλιση (underflow).

8 Βασικές πράξεις Empty (), η οποία επιστρέφει 1 αν η στοίβα είναι άδεια ή μηδέν στην αντίθετη περίπτωση. Push (a), η οποία τοποθετεί το στοιχείο a στην κορυφή της στοίβας Top (), προσπελαύνει το στοιχείο που βρίσκεται στην κορυφή της στοίβας. Pop (), η οποία προσπελαύνει και παράλληλα διαγράφει το στοιχείο που βρίσκεται στην κορυφή της στοίβας.

9 Αλγόριθμος υλοποίησης της πράξης push σε ψευδοκώδικα
Αν θεωρήσουμε ότι στοίβα θα περιέχει ακεραίους αριθμούς (ο πίνακας Array[N] δηλώνεται ως ακέραιος) τότε η πράξη ένθεσης καλείται όταν θέλουμε να εισάγουμε ένα στοιχείο στη στοίβα έστω num. Η Push είναι μία ανεξάρτητη διαδικασία η οποία καλείται από το κύριο πρόγραμμα όταν θέλουμε να εισάγουμε ένα στοιχείο στη στοίβα. Συντάσσεται επομένως ως μία συνάρτηση στην περίπτωση μας τύπου ακεραίου στην οποία μεταφέρεται μαζί ως αρχικά δεδομένα και η τιμή του στοιχείου num. Όταν καλείται έχει την μορφή push(num). Όταν γίνει αίτηση πρέπει να εξεταστεί αρχικά το γεγονός αν υπάρχει διαθέσιμος χώρος στη στοίβα για να εισαχθεί το στοιχείο num. Αν η μεταβλητή Head που δείχνει στο τελευταίο στοιχείο της στοίβας (κεφαλή της) δείχνει στο στοιχείο N τότε δεν υπάρχει χώρος στη στοίβα. Άρα δεν εκτελείται η πράξη και αυτό δηλώνεται ορίζοντας την μεταβλητή check ως ψευδής. Στην αντίθετη περίπτωση υπάρχει χώρος για το στοιχείο num και τότε η μεταβλητή head αυξάνεται κατά ένα ώστε να δείχνει στην επόμενη θέση της στοίβας που είναι κενή. Στη συνέχεια το στοιχείο Num εισάγεται στη θέση που δείχνει η head. Η ένθεση εκτελείται επιτυχώς και ορίζεται η μεταβλητή check ως αληθής. Αλγόριθμος Push Δεδομένα //num : ακέραιος αριθμός// Αρχή Aν Head < N τότε Head= Head+1; Array[Head]=num; Check=αληθής; Αλλιώς Check=ψευδής; Τέλος Αν Αποτελέσματα // Check // Τέλος Push

10 Αλγόριθμος υλοποίησης της πράξης pop σε ψευδοκώδικα
Αν θεωρήσουμε ότι στοίβα θα περιέχει ακεραίους αριθμούς (ο πίνακας Array[N] δηλώνεται ως ακέραιος) τότε η πράξη απώθησης καλείται όταν θέλουμε να διαβάσουμε και να σβήσουμε παράλληλα το στοιχείο κεφαλή της στοίβας έστω num. Όταν καλείται η pop επομένως έχει την μορφή push() και επιστρέφει την κεφαλή της στοίβας (αν εκτελεστεί επιτυχώς). Όταν γίνει αίτηση για απώθηση (pop()) πρέπει να εξεταστεί αρχικά το γεγονός αν υπάρχουν στοιχεία της στοίβας. Αν η που Head δείχνει στο τελευταίο στοιχείο της στοίβας έχει την τιμή 0 σημαίνει ότι η στοίβα είναι κενή και δεν εκτελείται η πράξη. Επομένως επιστρέφεται η μεταβλητή check ως ψευδής. Στην αντίθετη περίπτωση υπάρχουν στοιχεία στη στοίβα και η pop επιστρέφει την κεφαλή της που είναι το στοιχείο Array[Head]. Η μεταβλητή head μειώνεται κατά ένα ώστε να δείχνει στο προηγούμενο στοιχείο της στοίβας που θα αποτελεί στη συνέχεια και την κεφαλή της. Η απώθηση εκτελείται επιτυχώς και ορίζεται η μεταβλητή check ως αληθής. Αλγόριθμος Pop Αρχή Aν Head>0 τότε Num=Array[Head]; Head= Head-1; check=αληθής; Αλλιώς Check=ψευδής; Τέλος Αν Αποτελέσματα // Check, num// Τέλος Pop

11 Υλοποίηση στοίβας σε C int pop(int stack[],int *t) { int r ;
#define N 100 // ορισμός μεγέθους int stack[N], top = -1; //ορισμός λίστας και δείκτη (αρχικά στη θέση -1) void push(int stack[], int *t, int obj) { if (*t = = N-1) // έλεγχος υπερχείλισης printf("Stack overflow...\n"); getch(); abort(); } else stack[++(*t)] = obj; // εισαγωγή νέου στοιχείου στη θέση int pop(int stack[],int *t) { int r ; if (*t < 0) // έλεγχος υποχείλισης printf("Stack empty...\n"); getch(); abort(); } else r = stack[(*t)--]; // αφαίρεση στοιχείου return r;

12 Παράδειγμα χρήσης στοίβα
EAS*Y*QUE***ST***IO*N*** τα γράμματα σημαίνουν push() και τα αστεράκια pop() A E S A E A E E

13 FIFO (First In First Out)
Ουρά (queue) Φανταστείτε μια ουρά αναµονής µε ανθρώπους. Το άτοµο που είναι πρώτο στην ουρά, εξυπηρετείται και εξέρχεται. Το άτοµο που µόλις καταφθάνει, τοποθετείται στο τέλος της ουράς. Η µέθοδος αυτή επεξεργασίας ονοµάζεται FIFO (First In First Out) ∆ύο βασικές λειτουργίες: Εισαγωγή (enqueue) στοιχείου στο πίσω άκρο της ουράς Εξαγωγή (dequeue) στοιχείου από το εµπρός άκρο της ουράς

14 Χ Y Z Εξαγωγή στοιχείων Εισαγωγή στοιχείων

15 Υλοποίηση Για την υλοποίηση της ουράς χρειάζονται ένας πίνακας και δύο δείκτες, ο εµπρός (front ή head) και ο πίσω (rear ή back). Προγραµµατιστικά ο δείκτης rear δείχνει πάντα στο τελευταίο στοιχείο, ενώ ο δείκτης front δείχνει µία θέση πριν το πρώτο στοιχείο κατά συνέπεια, η ισότητα των δύο δεικτών αποδεικνύει ότι η ουρά είναι άδεια. 12 8 22 front rear

16 Αλγόριθμος υλοποίησης Enqueue σε ψευδοκώδικα
Πρέπει να εξεταστεί αρχικά αν υπάρχει διαθέσιμος χώρος στην ουρά για να εισαχθεί το στοιχείο num. Η μεταβλητή Back δείχνει στο τελευταίο στοιχείο της ουράς (που εισήχθη και τελευταίο) και αν δείχνει στο στοιχείο N τότε δεν υπάρχει χώρος στην ουρά. Άρα δεν εκτελείται η πράξη και αυτό δηλώνεται ορίζοντας την μεταβλητή check ως ψευδής. Αντίθετα υπάρχει χώρος για το στοιχείο num και τότε η μεταβλητή Back αυξάνεται κατά ένα ώστε να δείχνει στην επόμενη θέση της ουράς που είναι κενή. Στη συνέχεια το στοιχείο Num εισάγεται στη θέση που δείχνει η Back. Η ένθεση εκτελείται επιτυχώς και ορίζεται η μεταβλητή check ως αληθής. Παράλληλα εξετάζουμε την περίπτωση όταν ένα στοιχείο εισάγετε για πρώτη φορά σε μια άδεια ουρά. Τότε, αυξάνεται κατά ένα η Back (Back=1) και το στοιχείο καταλαμβάνει τη θέση Array[Back]=Array[1]. Παράλληλα η head (που είναι μηδέν εφόσον ήταν άδεια η ουρά) αυξάνεται κατά ένα και δείχνει στη θέση Array[1]. Αλγόριθμος Enqueue Δεδομένα //num : ακέραιος αριθμός// Αρχή Aν Head=0 τότε Head=1; Aν Back<N τότε Back = Back +1; Array[Back]=num; Check=αληθής; Αλλιώς Check=ψευδής; Τέλος Αν Αποτελέσματα // Check // Τέλος Enqueue

17 Αλγόριθμος υλοποίησης Dequeue σε ψευδοκώδικα
Αλγόριθμος Dequeue Αρχή Aν Head>0 τότε Num=Array[Head]; Head= Head+1; check=αληθής; Αν Head>Back τότε Head=0; Back=0; Τέλος Αν Αλλιώς Check=ψευδής; Αποτελέσματα // Check, num// Τέλος Dequeue Όταν γίνει αίτηση για απώθηση (Dequeue ()) πρέπει να εξεταστεί αρχικά το γεγονός αν υπάρχουν στοιχεία στην ουρά. Η μεταβλητή Head δείχνει στο πρώτο στοιχείο της ουράς (κεφαλή της). Αν επομένως η head έχει την τιμή 0 σημαίνει ότι η ουρά είναι κενή και δεν εκτελείται η πράξη. Επομένως επιστρέφεται η μεταβλητή check ως ψευδής. Στην αντίθετη περίπτωση υπάρχουν στοιχεία στην ουρά και η Dequeue επιστρέφει την κεφαλή της που είναι το στοιχείο Array[Head]. Η μεταβλητή head αυξάνεται κατά ένα ώστε να δείχνει στο επόμενο στοιχείο της ουράς που θα αποτελεί στη συνέχεια και την κεφαλή της. Η απώθηση εκτελείται επιτυχώς και ορίζεται η μεταβλητή check ως αληθής. Τέλος πρέπει να εξεταστεί η περίπτωση αν μετά από κάθε απώθηση άδειασε η ουρά. Αυτό συμβαίνει αν η Head αυξανόμενη κατά 1 πάρει τιμή μεγαλύτερη της Back. Τότε έχει απωθηθεί το τελευταίο στοιχείο της ουράς. Στην περίπτωση αυτή η ουρά είναι άδεια και επομένως μπορούμε να την αρχικοποιήσουμε θέτοντας στις μεταβλητές Head και Back την τιμή μηδέν.

18 Υλοποίηση ουράς σε C void dequeue(int q[], int *f, int r)
#define N 100 int q[N], front = -1, rear = -1; void enqueue(int q[], int *r, int obj) { if (*r = = N-1) printf("Queue is full..."); getch(); } else q[++(*r)] = obj; void dequeue(int q[], int *f, int r) { int x; if (*f = = r) printf("Queue is empty...\n"); else x = q[++(*f)]; printf("%d has been deleted...",x); }

19 Mειονέκτηµα Υπάρχει περίπτωση ο back να φθάσει στο πάνω όριο του πίνακα, αλλά στην ουσία να µην υπάρχει υπερχείλιση, επειδή ο head θα έχει αυξηθεί (εικονική υπερχείλιση). 12 8 22 16 head back

20 Μια λύση Μία λύση θα ήταν να µεταφερθούν τα στοιχεία στο αριστερό άκρο του πίνακα. elements = front – rear; first = front + 1; for (i=0; i <elements; i++) q[i]=q[first++]; front=-1; rear=elements-1; 12 8 22 16 head back

21 Μια δεύτερη λύση Η ουρά να αναδιπλώνεται,
Όταν ο rear = N-1, να επανατοποθετείται στο 0. Η δοµή αυτή ονοµάζεται κυκλική ουρά (circular queue). 17 12 8 22 16 back head

22 Παράδειγμα χρήσης ουράς
EAS*Y*QUE***ST***IO*N*** τα γράμματα σημαίνουν Enqueue() και τα αστεράκια Dequeue() O N Ε A S Y Q U E S T I

23 Συνδεδεµένες γραµµικές λίστες

24 Απλές διασυνδεμένες λίστες
Τα στοιχεία δεν αποθηκεύονται σε συνεχόμενες θέσεις Κάθε στοιχείο element αποθηκεύεται μαζί με ένα δείκτη next που ‘δείχνει’ στο επόμενο στην ακολουθία στοιχείο. Η δομή ονομάζεται κόμβος element next

25 Απλές διασυνδεμένες λίστες
Η ακολουθία των στοιχείων είναι μια αλυσίδα από κόμβους Κάθε στοιχείο δείχνει το επόμενο του και αναφέρεται από το προηγούμενο του Διαφορετικά στοιχεία είναι το πρώτο και το τελευταίο στη λίστα: Το κεφάλι head δεν αναφέρετε από το προηγούμενο του Η ουρά tail δεν αναφέρετε στο επόμενο του (λέμε ότι ο δείκτης είναι ο μηδενικός σύνδεσμος ή null) a1 a2 a3 null

26 Απλές διασυνδεμένες λίστες
Με ψευδο-κόμβο (dummy node) a1 a2 a3

27 Απλές διασυνδεμένες λίστες
Χωρίς τερματισμό (κυκλικές λίστες): είναι μία απλή συνδεμένη λίστα με την διαφορά ότι ο δείκτης επόμενου στοιχείου του τελευταίου της κόμβου δεν περιέχει την τιμή null (ή 0) αλλά δείχνει στο πρώτο στοιχείο της λίστας. a1 a2 a3

28 Διπλά διασυνδεμένες λίστες
Διπλά συνδεμένη λίστα ή συμμετρική (symmetric lists). Σε κάθε κόμβο συμπεριλαμβάνονται σύνδεσμοι όχι μόνο για το επόμενο στοιχείο – κόμβο αλλά και για το προηγούμενο  έχουμε δύο δείκτες. a1 a2 a3 null

29 Παράμετροι υλοποίησης λίστας
Δύο είδη λίστας: Στατικές: το μέγεθος της λίστας (το σύνολο των κόμβων) είναι προκαθορισμένο Δυναμικές: δεν γνωρίζουμε το μέγεθος της και κάθε φορά που δημιουργείτε ένας κόμβος (εισαγωγή ενός στοιχείου) δεσμεύουμε τον χώρο αποθήκευσης στην μνήμη για αυτόν. Για την υλοποίηση μίας λίστας μπορούμε να χρησιμοποιήσουμε: Ή έναν αριθμητικό πίνακα στον οποίο θα αποθηκεύονται όλοι οι σύνδεσμοι των κόμβων δηλαδή οι θέσεις των επόμενων στοιχείων είτε, αν και η γλώσσα προγραμματισμού το επιτρέπει, δείκτες.

30 1. Βασικές πράξεις στις λίστες
Εισαγωγή (insertion) στοιχείου Πρέπει να δημιουργηθεί ένας νέος κόμβος στην λίστα στον οποίο να αποθηκευτεί (περίπτωση δυναμικής λίστας). Η θέση του κόμβου ορίζεται με βάση τις απαιτήσεις του προγράμματος. Σε κάθε περίπτωση ανάλογα με το είδος της λίστας (απλή, διπλή ή κυκλική) γίνεται μόνο τροποποίηση των περιεχομένων των συνδέσμων επόμενου στοιχείου των κατάλληλων κόμβων. Διαγραφή (deletion) ενός στοιχείου. Αρκεί να τροποποιήσουμε το περιεχόμενο του συνδέσμου επόμενου στοιχείου του προηγούμενου κόμβου. Σάρωση λίστας. Προσπελαύνονται όλα τα στοιχεία της λίστας ξεκινώντας από το πρώτο και ακολουθώντας τους κόμβους μέσω των συνδέσμων τους μέχρι το τελευταίο στοιχείο. Σταματάμε όταν ο σύνδεσμος του επόμενου στοιχείου του έχει την τιμή null (0).

31 2. Βασικές πράξεις στις λίστες
Αναζήτηση στοιχείου. Για την υλοποίηση χρησιμοποιείται η πράξη σάρωσης της λίστας. Η λίστα είναι μία γραμμική δομή άρα και η διαπέραση της μέσω των συνδέσμων είναι γραμμική. Συνένωση λιστών. Συνένωση δύο λιστών σε μία λίστα διατηρώντας αρχικές προϋποθέσεις που δίνονται. Με άλλα λόγια η συνένωση μπορεί να γίνει απλά τοποθετώντας τη μία λίστα μετά την άλλη είτε με συγκεκριμένο αλγόριθμο στην περίπτωση π.χ. που οι αρχικές λίστες είναι διατεταγμένες και επιθυμούμε η νέα λίστα να είναι και αυτή διατεταγμένη. Αντιστροφή λίστας. Αλλάζει η φορά διάταξης της λίστας ορίζοντας τον τελευταίο κόμβο ως πρώτο και αυτόν τελευταίο τροποποιώντας κατάλληλα τους συνδέσμους όλων των κόμβων της λίστας.

32 Παράδειγμα υλοποίησης λίστας ακεραίων στην C:
Struct intlist { int num; Struct intlist *next; } node; Πρέπει να οριστεί κάθε κόμβος σαν μία μεταβλητή δομής η οποία περιέχει τόσο το περιεχόμενο – στοιχείο όσο και τον δείκτη που δείχνει στο επόμενο στοιχείο. Το περιεχόμενο μπορεί να είναι μία απλή μεταβλητή π.χ. ακεραίων όταν έχουμε μία λίστα ακεραίων αριθμών .

33 Παράδειγμα υλοποίησης λίστας με σύνολο μεταβλητών στην C:
Struct address { char name [40]; char street[40]; char city[20]; char state[3]; char zip[10]; struct addrees *next; } node; * σημαίνει ότι χρησιμοποιείται ένας δείκτης διευθύνσεων ως σύνδεσμος με το επόμενο στοιχείο. Αυτός ο δείκτης σε κάθε κόμβο περιέχει την διεύθυνση μνήμης που περιέχει τον επόμενο κόμβο μετά την δομή ορίζεται και η μεταβλητή node που ουσιαστικά είναι η διεύθυνση – δείκτης ενός κόμβου

34 Προσοχή αν node είναι ο δείκτης ενός κόμβου τότε στην περίπτωση της απλής συνδεμένης λίστας ακεραίων (Struct intlist), με τον συμβολισμό node.num ορίζουμε τον ίδιο τον ακέραιο αριθμό του κόμβου ενώ με τον συμβολισμό node.next ορίζουμε τον δείκτη του κόμβου προς τον επόμενο.

35 Εισαγωγή στοιχείου σε απλή συνδεδεμένη λίστα
Struct intlist { int num; Struct intlist *next; } node; Αλγόριθμος Εισαγωγή Δεδομένα Ο δείκτης pro_node που δείχνει τον κόμβο μετά τον οποίο θα εισαχθεί το στοιχείο, ο δείκτης node που δείχνει τη θέση (διεύθυνση) του νέου κόμβου και το στοιχείο Χ που είναι ο ακέραιος που θα εισαχθεί. Αρχή node.num=X; node.next=pro_node.next; pro_node.next=node; Τέλος Τέλος Εισαγωγή Για να γίνει η εισαγωγή ενός στοιχείου πρέπει να δημιουργηθεί ένας νέος κόμβος στην λίστα στον οποίο να αποθηκευτεί. Η θέση του κόμβου ορίζεται με βάση τις απαιτήσεις του προγράμματος. Σε κάθε περίπτωση ανάλογα με το είδος της λίστας (απλή, διπλή ή κυκλική) γίνεται μόνο τροποποίηση των περιεχομένων των συνδέσμων επόμενου στοιχείου των κατάλληλων κόμβων. Διαφορετική περίπτωση η εισαγωγή στο τέλος όπου ο σύνδεσμος επόμενου στοιχείου του τελευταίου κόμβου που είναι null (0) πλέον δείχνει στο νέο στοιχείο ο σύνδεσμος του οποίου παίρνει την τιμή null (0) και είναι ο τελευταίος κόμβος.

36 Διαγραφή στοιχείου σε απλή συνδεδεμένη λίστα
Για να γίνει η διαγραφή ενός στοιχείου από τη λίστα αρκεί να τροποποιήσουμε το περιεχόμενο του συνδέσμου επόμενου στοιχείου του προηγούμενου κόμβου. Αν αυτός δείχνει στον κόμβο που δείχνει ο σύνδεσμος του προς διαγραφή κόμβου τότε ουσιαστικά δεν υπάρχει κόμβος που να δείχνει σ’ αυτόν ενώ η αλυσίδα στοιχείων της λίστας δεν “κόβεται”. Struct intlist { int num; Struct intlist *next; } node; Αλγόριθμος Διαγραφή Δεδομένα Ο δείκτης pro_node που δείχνει τον προηγούμενο κόμβο από αυτόν που θα ακυρωθεί. Αρχή node=pro_node.next; pro_node.next=node.next; Τέλος Τέλος Διαγραφή

37 Σάρωση λίστας Με την πράξη αυτή προσπελαύνονται όλα τα στοιχεία της λίστας ξεκινώντας από το πρώτο και ακολουθώντας τους κόμβους μέσω των συνδέσμων τους μέχρι το τελευταίο στοιχείο που ο σύνδεσμος του επομένου στοιχείου του έχει την τιμή null (0). Είναι σαφές ότι γνωρίζουμε πιο είναι τόσο το πρώτο όσο και το τελευταίο στοιχείο της λίστας μέσω των δεικτών head και last που περιγράψαμε παραπάνω. Αλγόριθμος Σάρωση Δεδομένα Ο δείκτης head που δείχνει στο πρώτο στοιχείο της λίστας Αρχή node=head; Όσο (node!=0) εκτέλεσε Εμφάνισε στοιχείο node.num; node=node.next; Τέλος Όσο Τέλος Τέλος Σάρωση

38 Εύρεση στοιχείου Με την πράξη αυτή μπορεί να γίνει η αναζήτηση ενός στοιχείου που επιθυμούμε. Για την υλοποίηση της πράξης αυτής χρησιμοποιείται η πράξη σάρωσης της λίστας. Η λίστα είναι μία γραμμική δομή άρα και η διαπέραση της μέσω των συνδέσμων είναι γραμμική. Αλγόριθμος Αναζήτηση Δεδομένα Ο δείκτης head που δείχνει στο πρώτο στοιχείο της λίστας Αρχή node=head; Όσο (node!=0) εκτέλεσε Αν (node.num=x); return True node=node.next; Τέλος Όσο return False Τέλος Τέλος Αναζήτηση

39 Συνένωση Με την πράξη αυτή είναι δυνατή η συνένωση δύο λιστών σε μία λίστα διατηρώντας αρχικές προϋποθέσεις που δίνονται. Δηλαδή η συνένωση μπορεί να γίνει απλά τοποθετώντας τη μία λίστα μετά την άλλη είτε με συγκεκριμένο αλγόριθμο στην περίπτωση π.χ. που οι αρχικές λίστες είναι διατεταγμένες και επιθυμούμε η νέα λίστα να είναι και αυτή διατεταγμένη. Στην πρώτη περίπτωση η συνένωση, τα βασικά βήματα του αλγορίθμου που εκτελούνται παρουσιάζονται παρακάτω Αλγόριθμος Συνένωση Δεδομένα Ο δείκτης head που δείχνει στο πρώτο στοιχείο της δεύτερης λίστας, Ο δείκτης last του τελευταίου στοιχείου της πρώτης λίστας Αρχή last.next=head; Τέλος Τέλος Συνένωση

40 Αντιστροφή λίστας Με την πράξη αυτή αλλάζει η φορά διάταξης της λίστας ορίζοντας τον τελευταίο κόμβο ως πρώτο και αυτόν τελευταίο τροποποιώντας κατάλληλα τους συνδέσμους όλων των κόμβων της λίστας. Αλγόριθμος Αντιστροφή Δεδομένα Ο δείκτης head που δείχνει στο πρώτο στοιχείο της λίστας Ο δείκτης last του τελευταίου στοιχείου της πρώτης λίστας Αρχή node=head; Όσο (node!=0) εκτέλεσε y=node.next; y.next=node; Τέλος Όσο head=last; head.next=0; Τέλος Τέλος Αντιστροφή


Κατέβασμα ppt "Διδάσκων: Δρ. Τσίντζα Παναγιώτα"

Παρόμοιες παρουσιάσεις


Διαφημίσεις Google