Λίστες (Lists) Ο ΑΤΔ λίστα είναι µια συλλογή στοιχείων του ίδιου τύπου µε
|
|
- Ολυμπία Οικονόμου
- 8 χρόνια πριν
- Προβολές:
Transcript
1 Λίστες (Lists) Ο ΑΤΔ λίστα είναι µια συλλογή στοιχείων του ίδιου τύπου µε γραµµική δοµή
2 Βασικές Πράξεις Δηµιουργία Κενή Περιεχόµενο Προχώρησε Εισαγωγή Μετά Εισαγωγή Πριν Διαγραφή Αναζήτηση Μήκος
3 Ο ΑΤΔ Ακολουθιακή Λίστα Στον ΑΤΔ ακολουθιακή λίστα η φυσική διάταξη των στοιχείων της (στην υλοποίηση) ταυτίζεται µε εκείνη της λογικής τους διάταξης Υλοποίηση µε πίνακα Η ακολουθιακή υλοποίηση έχει σαν βασικό χαρακτηριστικό ότι διαδοχικά στοιχεία της λίστας αποθηκεύονται σε διαδοχικές θέσεις του πίνακα Ετσι το πρώτο στοιχείο της λίστας αποθηκεύεται στην πρώτη θέση του πίνακα, το δεύτερο στοιχείο της λίστας αποθηκεύεται στη δεύτερη θέση του πίνακα κοκ, όπως δείχνει το ακόλουθο σχήµα :
4 a 1 a 2 a 3 a n A[0] A[1] A[2] A[n-1] A[plithos - 1] Eκτός από την αποθήκευση των στοιχείων της λίστας στον πίνακα είναι, αποθηκεύουµε σε µια µεταβλητή και το τρέχον πλήθος των στοιχείων που περιέχει η λίστα Έχουµε λοιπόν τις δηλώσεις :
5 #define plithos typedef typos_stoixeiou; typedef int typos_deikti; typedef typos_stoixeiou typos_pinaka[plithos]; typedef struct { typos_pinaka pinakas; typos_deikti megethos; } typos_listas; typos_listas lista;
6 Η υλοποίηση των βασικών πράξεων για τον ΑΤΔ ακολουθιακή λίστα είναι εύκολη και ορισµένες από αυτές παρουσιάζονται παρακάτω: void dimiourgia (typos_listas *lista) /* Προ : Καµµία Μετα : Δηµιουργεί µια κενή λίστα/* { lista->megethos = 0; }
7 int keni(typos_listas lista) /* Προ : Δηµιουργία µιας λίστας Μετα : Ελέγχει αν µια λίστα είναι κενή*/ { } return (listamegethos == 0 );
8 int epomenos(typos_listas lista, typos_deikti thesi) /*Προ : Δηµιουργία λίστας Mετά: Επιστρέφει την επόµενη θέση της thesi αλλιώς επιστρέφει το -1 */ { if (( thesi < 0 ) ( thesi > = listamegethos 1 )) { printf( Ο δείκτης thesi είναι εκτός διαστήµατος ); return (-1); } else return ( thesi++ ); }
9 thesi megethos ?? ?? Για την εισαγωγή ενός νέου στοιχείου στη λίστα θα πρέπει να δηµιουργηθεί χώρος Η υλοποίηση της διαδικασίας της εισαγωγής ενός νέου στοιχείου στη λίστα παρουσιάζεται στη συνέχεια Πολυπλοκότητα :O(n)
10 void eisagogi_meta( typos_listas *lista, typos_stoixeiou stoixeio, typos_deikti thesi) /* Προ : Δηµιουργία της λίστας Mετά: Εισάγεται το στοιχείο stoixeio στη λίστα µετά το στοιχείο που βρίσκεται στη θέση thesi */ { int i; if (lista->megethos == plithos) printf( Η λίστα είναι γεµάτη ); else if (thesi < 0 ) or (thesi > lista -> megethos - 1) printf( Ο δείκτης thesi είναι εκτός διαστήµατος ); else συνέχεια
11 { /* Mετακίνηση στοιχείων µια θέση δεξιά */ for (i = lista->megethos-1 ; i >= thesi+1 ; i--) lista->pinakas[i+1] = lista->pinakas[i]; } } /* εισαγωγή του νέου στοιχείου µετά τη θέση thesi και αύξηση του µεγέθους της λίστας */ lista->pinakas[thesi+1]=stoixeio; lista->megethos++;
12 Διαγραφή thesi megethos ?? ??
13 void diagrafi(typos_listas *lista, typos_deikti thesi) /* Προ : Δηµιουργία της λίστας Mετά: Διαγράφεται το στοιχείο της *lista που βρίσκεται στη θέση thesi */ { int i; if (keni(*lista)) printf( Η λίστα είναι κενή ); else συνέχεια
14 } if ((thesi<0) (thesi > lista->megethos -1)) printf( Η thesi είναι εκτός διαστήµατος ); } } { } else /* µείωση του µεγέθους της λίστας κατά 1 και αφαίρεση του κενού χώρου */ lista->megethos--; for (i=thesi; i <= lista->megethos-1 ; i++ ) lista->pinakas[i] = lista->pinakas[i+1];
15 O AΤΔ Συνδεδεµένη Λίστα Κάθε στοιχείο του ΑΤΔ συνδεδεµένη λίστα (linked list) καλείται κόµβος (node) και περιέχει δύο πεδία Στο ένα πεδίο αποθηκεύονται τα δεδοµένα και στο άλλο αποθηκεύεται η διεύθυνση του επόµενου κόµβου της λίστας Επίσης υπάρχει ένας εξωτερικός δείκτης lista, ο οποίος περιέχει τη διεύθυνση του πρώτου κόµβου της λίστας
16 Σχηµατική Παράσταση Συνδεδεµένης Λίστας lista Δεδοµένο Επόµενο Δεδοµένο Επόµενο Δεδοµένο Επόµενο Βασίλης Ελένη Σπύρος - Τα βέλη συµβολίζουν δείκτες - Η τελεία στο τµήµα επόµενο του τελευταίου κόµβου αντιπροσωπεύει το µηδενικό δείκτη (null)
17 dedomena (p) p epomenos (p) apodesmeysi (p) p pare_komvo (p) p
18 Εισαγωγή Εισαγωγή µετά από έναν κόµβο : lista Ανδρέας Βασίλης Ελένη Σπύρος prodeiktis
19 pare_komvo (prosorinos) dedomena (prosorinos) = Νίκος prosorinos Νίκος 1 lista Ανδρέας Βασίλης Ελένη Σπύρος prodeiktis epomenos (prosorinos) = epomenos (prodeiktis) 1
20 prosorinos Νίκος lista Ανδρέας Βασίλης 2 1 Ελένη Σπύρος prodeiktis epomenos (prodeiktis) = prosorinos 2
21 Εισαγωγή στην αρχή : prosorinos Ανδρέας? pare_komvo(prosorinos) dedomena(prosorinos) = Ανδρέας prosorinos Ανδρέας 1 lista Βασίλης Ελένη Σπύρος epomenos(prosorinos) = lista 1
22 prosorinos lista 2 Ανδρέας 1 Βασίλης Ελένη Σπύρος lista = prosorinos 2
23 Διαγραφή Διαγραφή µετά από έναν κόµβο : 2 lista Ανδρέας Βασίλης Ελένη Σπύρος prodeiktis 1 prosorinos prosorinos = epomenos (prodeiktis) epomenos (prodeiktis) = epomenos (prosorinos) 1 2
24 Διαγραφή στην αρχή : 2 Ανδρέας 1 prosorinos Βασίλης Ελένη Σπύρος prosorinos = lista 1 lista = epomenos (prosorinos) 2
25 Τόσο για τον υπολογισµό του µήκους όσο και για το πρόβληµα της αναζήτησης είναι αναγκαία η επίσκεψη όλων των κόµβων µιας λίστας ξεκινώντας από τον πρώτο Η πράξη αυτή αποτελείται από τα εξής βήµατα: 1 Χρησιµοποιείται ένας βοηθητικός δείκτης που διατρέχει ό- λους τους κόµβους της λίστας Ο δείκτης αυτός είναι ο trexon και αρχικά δείχνει τον πρώτο κόµβο 2 Επεξεργασία πεδίου dedomena(trexon) 3 Μετακίνηση του δείκτη trexon στον επόµενο κόµβο
26 Ο αλγόριθµος της επίσκεψης των κόµβων µιας συνδεδεµένης λίστας είναι ο ακόλουθος : 1 trexon = lista 2 Οσο trexon!= NULL να εκτελούνται : α Επεξεργασία του dedomena(trexon) β trexon = epomenos(trexon)
27 Η εφαρµογή του αλγόριθµου για την λίστα των ονοµάτων εµφανίζεται στο ακόλουθο σχήµα : lista lista lista lista Βασίλης Ελένη Σπύρος trexon Βασίλης Ελένη Σπύρος trexon Βασίλης Ελένη Σπύρος trexon Βασίλης Ελένη Σπύρος
28 Υλοποίηση του ΑΤΔ συνδεδεµένη λίστα µε πίνακα δείκτης dedomena epomenos lista = ?? Ελένη???? Σπύρος?? Βασίλης 4-1?? 1????
29 #define plithos #define null -1 typedef typos_stoixeiou; typedef int typos_deikti; typedef struct { typos_stoixeiou dedomena; typos_deikti epomenos; } typos_komvou; typedef typos_komvou pinakas_komvon[plithos]; pinakas_komvon komvos; typos_deikti kenos, lista;
30 Η αποθήκευση της λίστας των ονοµάτων παρουσιάζεται στο ακόλουθο σχήµα όπου παρατηρούµε ότι η τοποθέτηση των τριών εγγραφών µπορεί να γίνει οπουδήποτε µέσα στον πίνακα µε 10 στοιχεία δείκτης dedomena lista = epomenos?? Ελένη???? Σπύρος?? Βασίλης????? 4-1 1?
31 Θα πρέπει να γνωρίζουµε την οργάνωση του πίνακα αυτού προκειµένου να γίνει εισαγωγή ή διαγραφή κάποιου στοιχείου του Δηµιουργούµε την εξής αρχική κατάσταση στον πίνακα:?????????? kenos δείκτης dedomena epomenos
32 void arxiki_katastasi() { int i; /* σύνδεση των κόµβων µεταξύ τους */ for ( i=0; i<plithos-1; i++ ) komvos[i]epomenos = i+1; } /* ένδειξη τέλους της λίστας */ komvos[plithos-1]epomenos = null; kenos = 0; Παρατήρηση : Η komvos και kenos είναι καθολικές µεταβλητές!!
33 Στη συνέχεια, ας υποθέσουµε ότι Βασίλης είναι το πρώτο όνοµα που θα εισαχθεί σε µια συνδεδεµένη λίστα Το όνοµα αυτό θα τοποθετηθεί στην πρώτη διαθέσιµη θέση του πίνακα στην οποία δείχνει η µεταβλητή kenos: δείκτης dedomena epomenos lista kenos Βασίλης?????????
34 Για την εκτέλεση της παραπάνω διαδικασίας απαιτείται πρώτα ο εντοπισµός της κενής θέσης όπου θα εισαχθεί ο νέος κόµβος Η pare_komvo(p) τοποθετεί στο δείκτη p την τιµή της kenos, η οποία αντιστοιχεί στην πρώτη διαθέσιµη θέση του πίνακα komvos που είναι κενή και πρόκειται να τοποθετηθεί ο νέος κόµβος Ταυτόχρονα, διαγράφει τη θέση αυτή από τη λίστα των κενών θέσεων
35 void pare_komvo(typos_deikti *p) /*Προ : Καµµία Mετά: Aν υπάρχει κάποιος διαθέσιµος κόµβος τότε ο δείκτης *p δείχνει έναν κενό κόµβο αλλιώς ο *p είναι null(-1) */ { *p = kenos; if (kenos!= null) kenos = komvos[kenos]epomenos; }
36 Οταν διαγράφεται ένας κόµβος από τη συνδεδεµένη λίστα πρέπει η θέση του να συµπεριληφθεί στις κενές θέσεις του πίνακα ώστε να ξαναχρησιµοποιηθεί αργότερα για την αποθήκευση κάποιου άλλου στοιχείου της λίστας Για παράδειγµα, ας υποθέσουµε ότι έχουµε τη συνδεδεµένη λίστα του σχήµατος p lista kenos δείκτης dedomena epomenos Βασίλης Σπύρος Ελένη???????
37 Τότε η διαγραφή του ονόµατος Βασίλης έχει σαν αποτέλεσµα αυτό του σχήµατος kenos lista δείκτης dedomena epomenos Βασίλης Σπύρος Ελένη???????
38 Η διαδικασία που υλοποιεί µόνο την αποδέσµευση του χώρου του κόµβου που διαγράφεται είναι η ακόλουθη: void apodesmeysi(typos_deikti p) { komvos[p]epomenos = kenos; kenos = p; }
39 Η διαδικασία για τη δηµιουργία µιας κενής συνδεδεµένης λίστας τοποθετεί την τιµή null στο δείκτη lista: void dimiourgia(typos_deikti *lista) { *lista = null; }
40 Για τον έλεγχο αν µια συνδεδεµένη λίστα είναι κενή έχουµε το ακόλουθο υποπρόγραµµα : int keni(typos_deikti lista) { return (lista==null); }
41 Η πράξη proxorise υλοποιείται από το ακόλουθο υποπρόγραµµα :: void proxorise(typos_deikti *p) { *p = komvos[*p]epomenos; }
42 Η πράξη της προσπέλασης στα δεδοµένα ενός κόµβου (περιεχόµενο) υλοποιείται µε το ακόλουθο υποπρόγραµµα: typos_stoixeiou periexomeno(typos_deikti p) /* Προ : Ο δείκτης p δείχνει ένα κόµβο µε ορισµένο το πεδίο dedomena Μετα : Επιστρέφει τα δεδοµένα του κόµβου που δείχνει ο δείκτης p */ { return (komvos[p]dedomena); }
43 Για τις διαδικασίες της εισαγωγής και διαγραφής θα υποθέσουµε καταρχήν ότι γνωρίζουµε τη θέση στην οποία πρόκειται να εισαχθεί ή να διαγραφεί ένας κόµβος Ετσι ο αλγόριθµος της εισαγωγής είναι ο παρακάτω: Αλγόριθµος εισαγωγής σε συνδεδεµένη λίστα prosorinos 1 3 lista 2 prosorinos εισαγωγή µετά Εισαγωγή στην αρχή prodeiktis
44 1 pare_komvo(prosorinos) 2 dedomena(prosorinos) = stoixeio 3 Αν prodeiktis == null τότε {εισαγωγή στην αρχή} α epomenos(prosorinos) = lista } εισαγωγή β lista = prosorinos στην αρχή διαφορετικά α epomenos(prosorinos) = epomenos(prodeiktis) β epomenos(prodeiktis) = prosorinos } εισαγωγή µετά
45 Στη συνέχεια ακολουθεί η υλοποίηση των δύο αυτών πράξεων void eisagogi_meta(typos_deikti prodeiktis, typos_stoixeiou stoixeio) /* Προ : Πρέπει ο prodeiktis να είναι δείκτης που δείχνει ένα κόµβο στη λίστα Mετά: O κόµβος µε δεδοµένα stoixeio έχει εισαχθεί µετά τον κόµβο που δείχνει ο δείκτης prodeiktis */ { typos_deikti prosorinos; } pare_komvo(&prosorinos); komvos[prosorinos]dedomena = stoixeio; komvos[prosorinos]epomenos = komvos[prodeiktis]epomenos; komvos[prodeiktis]epomenos = prosorinos;
46 void eisagogi_prin(typos_deikti *p, typos_stoixeiou stoixeio) /* Προ : Πρέπει ο δείκτης *p να δείχνει τον κόµβο που είναι στην αρχή της λίστας Mετά: O κόµβος µε δεδοµένα stoixeio έχει εισαχθεί πριν τον κόµβο που έδειχνε ο δείκτης *p και ο *p δείχνει πλέον τη νέα αρχή της λίστας */ { typos_deikti prosorinos; } pare_komvo(&prosorinos); komvos[prosorinos]dedomena = stoixeio; komvos[prosorinos]epomenos = *p; *p = prosorinos;
47 Χρησιµοποιώντας τις ανωτέρω δύο πράξεις η εισαγωγή υλοποιείται ως εξής: void eisagogi(typos_deikti *lista, typos_stoixeiou stoixeio, typos_deikti prodeiktis) /* Προ : Πρέπει ο prodeiktis να είναι null(-1) ή να δείχνει ένα κόµβο µέσα στη λίστα Mετά: Aν ο prodeiktis είναι null(-1) τότε ο κόµβος µε δεδοµένα stoixeio έχει εισαχθεί στην αρχή της λίστας αλλιώς ο κόµβος µε δεδοµένα stoixeio έχει εισαχθεί µετά τον κόµβο που δείχνει ο prodeiktis */ { if (keni(prodeiktis)) /*εισαγωγή στην αρχή λίστας */ eisagogi_prin(lista,stoixeio); else eisagogi_meta(prodeiktis,stoixeio); }
48 Διαγραφή Για τη διαγραφή, υποθέτουµε ότι ο prosorinos δείχνει τον κόµβο που πρόκειται να διαγραφτεί Υπάρχουν και εδώ δύο περιπτώσεις : (1) η διαγραφή του πρώτου στοιχείου της λίστας και (2) η διαγραφή κάποιου στοιχείου που έχει ένα προηγούµενο στοιχείο Για τη διαγραφή του κόµβου που βρίσκεται στην αρχή της λίστας απλά µεταφέρουµε το δείκτη lista ώστε να δείχνει στο δεύτερο κόµβο της λίστας 2 lista prodeiktis 1 prosorinos
49 Για τη δεύτερη περίπτωση το ρόλο της lista παίζει ο : komvos[prodeiktis]epomenos lista prodeiktis prosorinos Ο παρακάτω αλγόριθµος περιγράφει τη λειτουργία της διαγραφής :
50 Αλγόριθµος για τη διαγραφή από µια συνδεδεµένη λίστα Αν η λίστα είναι κενή τότε να εκτυπωθεί ένα µήνυµα διαφορετικά 1 Αν prodeiktis ==null τότε {διαγραφή πρώτου κόµβου} α prosorinos = lista β lista = epomenos(prosorinos) διαφορετικά {ο κόµβος έχει προηγούµενο} α prosorinos = epomenos(prodeiktis) β epomenos(prodeiktis) = epomenos(prosorinos) 2 Apodesmeysi(prosorinos) {δηµιουργία κενού χώρου στον πίνακα}
51 lista prodeiktis prosorinos Το υποπρόγραµµα που υλοποιεί τη λειτουργία της διαγραφής είναι το ακόλουθο: void diagrafi_komvou(typos_deikti *lista, typos_deikti prodeiktis) /*Προ : H λίστα *lista δεν είναι κενή και ο prodeiktis πρέπει να είναι ένας κόµβος της λίστας ή να είναι null Mετά: Aν η *lista δεν είναι κενή και ο prodeiktis είναι null διαγράφεται το πρώτο στοιχείο της λίστας Aν η *lista δεν είναι κενή και ο prodeiktis είναι ένας κόµβος της λίστας τότε διαγράφεται ο επόµενος κόµβος από αυτόν που δείχνει ο prodeiktis */ συνέχεια
52 } if (keni(*lista)) printf( Κενή λίστα ); else { if (keni(prodeiktis)) diagrafi(lista); else diagrafi(&komvos[prodeiktis]epomenos); }
53 void diagrafi(typos_deikti *p) /* Mετά: Διαγράφθηκε ο κόµβος που έδειχνε o *p O *p δείχνει πλέον τον επόµενο κόµβο */ { typos_deikti prosorinos; } prosorinos = *p; *p = komvos[prosorinos]epomenos; apodesmeysi(prosorinos);
54 Αναζήτηση Διατρέχονται όλοι οι κόµβοι της συνδεδεµένης λίστας από την αρχή ελέγχοντας το περιεχόµενο του τµήµατος των δεδοµένων τους Αν αυτό συµπίπτει µε το ζητούµενο, η αναζήτηση σταµατά Είναι φανερό ότι για τον εντοπισµό του στοιχείου που πρόκειται να διαγραφτεί χρειάζονται δύο δείκτες Ο ένας δείχνει τον τρέχοντα κόµβο του οποίου εξετάζεται το περιεχόµενο και ο άλλος δείχνει τον προηγούµενο κόµβο :
55 lista prodeiktis E trexon C F A lista prodeiktis E trexon C F A
56 lista prodeiktis E C F A trexon lista E prodeiktis C F A trexon
57 Αλγόριθµος αναζήτησης σε µια συνδεδεµένη λίστα 1 prodeiktis = NULL, trexon = NULL 2 Οσο ο ζητούµενος κόµβος δεν έχει βρεθεί και ο δείκτης trexon!=null, τότε εκτελούνται οι παρακάτω εργασίες : Αν dedomena(trexon) = stoixeio τότε βρέθηκε ο ζητούµενος κόµβος διαφορετικά α prodeiktis = trexon β trexon= epomenos(trexon)
58 H υλοποίηση του παραπάνω αλγόριθµου γίνεται µε το ακόλουθο υποπρόγραµµα: void anazitisi1(typos_deikti lista, typos_stoixeiou stoixeio, typos_deikti *prodeiktis, int *vrethike) /* Mετά: Aναζήτηση στη lista για εντοπισµό του πρώτου κόµβου που έχει περιεχόµενο stoixeio (*vrethike=1) ή για µια θέση για την εισαγωγή νέου κόµβου (*vrethike=0) */ { typos_deikti trexon; trexon = lista; *prodeiktis = null; *vrethike = 0; συνέχεια
59 } while ((!(*vrethike)) && (!keni(trexon))) if (periexomeno(trexon) == stoixeio) *vrethike = 1; else { *prodeiktis = trexon; proxorise(&trexon); }
60 Μια λίστα λέγεται ταξινοµηµένη (sorted list) αν οι κόµβοι της είναι συνδεδεµένοι κατά τέτοιο τρόπο ώστε ένα από τα πεδία, το πεδίο κλειδί (key field) του τµήµατος δεδοµένων, είναι ταξινοµηµένο σε αύξουσα ή φθίνουσα σειρά Σε µια τέτοια λίστα η εισαγωγή ενός νέου κόµβου θα πρέπει να έχει σαν αποτέλεσµα την παραγωγή µιας νέας ταξινοµηµένης λίστας Η εισαγωγή του δηλαδή θα πρέπει να γίνει σε κάποιο συγκεκριµένο σηµείο της λίστας Στην περίπτωση της αναζήτησης κάποιου κόµβου σε µια ταξινοµηµένη λίστα εξετάζεται επιπλέον αν βρέθηκε ο κόµβος αυτός ή όχι
61 Αλγόριθµος αναζήτησης ταξινοµηµένης (σε αύξουσα σειρά) λίστας 1 prodeiktis = null, trexon = null 2 Οσο δεν έγινε αναζήτηση και trexon <> null να εκτελούνται οι παρακάτω εργασίες: Αν dedomena(trexon) >= stoixeio, τότε: Η αναζήτηση έγινε και ο κόµβος βρέθηκε εφόσον dedomena(trexon) = = stoixeio διαφορετικά προχώρησε τους δείκτες prodeiktis και trexon
62 Η υλοποίηση του παραπάνω αλγορίθµου γίνεται µε την ακόλουθη διαδικασία : void anazitisi2(typos_deikti lista, typos_stoixeiou stoixeio, typos_deikti *prodeiktis, int *vrethike) /* Προ : Tα στοιχεία της λίστας lista είναι ταξινοµηµένα σε αύξουσα σειρά Mετά: Έγινε αναζήτηση στη lista για τον εντοπισµό κόµβου που έχει περιεχόµενο stoixeio (*vrethike=1) ή για µια θέση για την εισαγωγή νέου κόµβου (*vrethike= 0)Ο *prodeiktis δείχνει τον προηγούµενο κόµβο από αυτόν που περιέχει το stoixeio(εφόσον βρέθηκε) ή τον κόµβο µετά τον οποίο µπορεί να εισαχθεί το stoixeio (εφόσον δεν βρέθηκε) */ συνέχεια
63 { typos_deikti trexon; int anazitisi; trexon = lista; *prodeiktis = null; *vrethike = 0; anazitisi = 0; while ((!anazitisi) && (!keni(trexon))) if (periexomeno(trexon) >= stoixeio) { anazitisi = 1; *vrethike = (periexomeno(trexon) == stoixeio); } else { *prodeiktis = trexon; proxorise(&trexon); } }
64 typedef int *deikths_ar; deiktis_ar p,q; Δείκτες (Pointers) στην C p=malloc(sizeof(int)) *p= 3; printf( %d,*p); p? p *p? p *p 3
65 free(p) p? p = NULL; p = q;
66 Υλοποίηση του ΑΤΔ συνδεδεµένη λίστα µε δείκτες Α) Με ορισµό τύπου δείκτη typedef typos_stoixeiou ; typedef struct typos_komvou *typos_deikti; typedef struct typos_komvou { typos_stoixeiou dedomena; typos_deikti epomenos; }; typos_deikti lista; Ας σηµειωθεί ότι ο ορισµός του τύπου δείκτη προηγείται του ορισµού του τύπου του κόµβου, πράγµα που επιτρέπεται στην C
67 Υλοποίηση του ΑΤΔ συνδεδεµένη λίστα µε δείκτες Β) Με ορισµό τύπου κόµβου typedef typos_stoixeiou ; typedef struct typos_komvou { typos_stoixeiou dedomena; typos_komvou *epomenos; }; typos_komvou *lista;
68 Τον ρόλο των διαδικασιών pare_komvo(p) και apodesmeysi(p) τον παίζουν οι malloc(sizeof(int ) και free(p), αντίστοιχα Η υλοποίηση των βασικών πράξεων για τον ΑΤΔ συνδεδεµένη λίστα µε τη χρήση δεικτών είναι όµοια µε εκείνη του πίνακα Οι διαφορές εστιάζονται στους υπολογισµούς των δεικτών
69 void dimiourgia(typos_deikti *lista) /*Προ: Καµµία Μετά : Εχει δηµιουργηθεί η κενή λίστα lista*/ { *lista = NULL; }
70 Ο έλεγχος µιας κενής λίστας γίνεται µε το υποπρόγραµµα: int keni(typos_deikti lista) /*Προ : Εχει δηµιουργηθεί η lista Μετά : Επιστρέφει 1 ή 0 ανάλογα αν η lista είναι κενή ή όχι*/ { } return ( lista == NULL );
71 Η πράξη προχώρησε το δείκτη έτσι ώστε να δείχνει τον επόµενο κόµβο υλοποιείται ως εξής: void proxorise(typos_deikti *p) /*Προχωρά το δείκτη p στον επόµενο κόµβο της λίστας*/ { *p = (*p)->epomenos; }
72 Η ανάκτηση του περιεχοµένου ενός κόµβου υλοποιείται µε το ακόλουθο υποπρόγραµµα : typos_stoixeiou periexomeno(typos_deikti p) /*Επιστρέφει τα δεδοµένα του κόµβου που δείχνει ο δείκτης p*/ { return (p->dedomena); }
73 Οι διαδικασίες για την εισαγωγή και διαγραφή στοιχείου από µια συνδεδεµένη λίστα µε δείκτες είναι παρόµοιες µε εκείνες που βασίζονται στην υλοποίηση µε πίνακα και παρουσιάζονται στη συνέχεια : 1 prosorinos 3 2 prodeiktis
74 void eisagogi_meta(typos_deikti prodeiktis, typos_stoixeiou stoixeio) /* Προ : Ο prodeiktis δείχνει ένα κόµβο στη λίστα Mετά: O κόµβος µε δεδοµένα stoixeio έχει εισαχθεί µετά τον κόµβο που δείχνει ο δείκτης prodeiktis */ { typos_deikti prosorinos; } prosorinos = (typos_deikti) malloc(sizeof(struct typos_komvou)); prosorinos->dedomena = stoixeio; 2 prosorinos->epomenos = prodeiktis->epomenos; 3 prodeiktis->epomenos = prosorinos; 1
75 Εισαγωγή 1 prosorinos 3 2 p
76 void eisagogi_prin(typos_deikti *p, typos_stoixeiou stoixeio) /* Προ : Ο δείκτης *p δείχνει το πρώτο στοιχείο της λίστας Mετά: O κόµβος µε δεδοµένα stoixeio έχει εισαχθεί πρίν τον κόµβο που έδειχνε ο δείκτης *p Ο δείκτης *p δείχνει την αρχή της λίστας */ { 1 typos_deikti prosorinos; prosorinos = (typos_deikti) malloc(sizeof(struct 2 typos_komvou)); 3 prosorinos->dedomena = stoixeio; prosorinos->epomenos = *p; *p = prosorinos; }
77 Η εισαγωγή ενός κόµβου σε οποιοδήποτε σηµείο της λίστας υλοποιείται από το ακόλουθο υποπρόγραµµα void eisagogi(typos_deikti *lista, typos_stoixeiou stoixeio, typos_deikti prodeiktis) /*Προ :Ο prodeiktis είναι NULL ή να δείχνει ένα κόµβο µέσα στη λίστα Mετά: Aν ο prodeiktis είναι NULL τότε ο κόµβος µε δεδοµένα stoixeio εισάγεται στην αρχή της λίστας αλλιώς εισάγεται µετά τον κόµβο που δείχνει ο prodeiktis */ συνέχεια
78 } } if (keni(prodeiktis)) eisagogi_prin(lista, stoixeio); else eisagogi_meta(prodeiktis, stoixeio);
79 Διαγραφή lista prodeiktis prosorinos
80 void diagrafi_komvou(typos_deikti *lista, typos_deikti prodeiktis) /*Προ : H *lista δεν είναι κενή και ο prodeiktis πρέπει να είναι ένας κόµβος της λίστας ή να είναι NULL Mετά: Aν η *lista δεν είναι κενή και ο prodeiktis είναι NULL τότε διαγράφθηκε το πρώτο στοιχείο της λίστας Aν η *lista δεν είναι κενή και ο prodeiktis είναι ένας κόµβος της λίστας τότε διαγράφθηκε ο επόµενος κόµβος από αυτόν που δείχνει ο prodeiktis */ συνέχεια
81 typos_deikti prosorinos; } if (keni(*lista)) printf( Η λίστα είναι κενή ); else { if (keni(prodeiktis)) /* διαγραφή στην αρχή */ diagrafi(lista); else /* o κόµβος έχει προηγούµενο */ { prosorinos = prodeiktis->epomenos ; diagrafi(&prosorinos); prodeiktis->epomenos = prosorinos; } }
82 void diagrafi(typos_deikti *p) /*Προ : Ο *p δείχνει ένα κόµβο Mετά: Διαγράφθηκε ο κόµβος που έδειχνε o *p O *p δείχνει πλέον τον επόµενο κόµβο */ { typos_deikti prosorinos; } prosorinos = *p; *p = prosorinos ->epomenos; free(prosorinos);
83 lista trexon void diadromi(typos_deikti lista) /*Προ : Εχει δηµιουργηθεί µια λίστα Mετά: Διέτρεξε όλους τους κόµβους µιας λίστας και επεξεργάστηκε τα δεδόµενα κάθε κόµβου */ { typos_deikti trexon; trexon = lista; while (!keni(trexon)) {/* εντολές για επεξεργασία του periexomeno(trexon) */ proxorise(&trexon); } }
84 Υλοποίηση του ΑΤΔ στοίβα µε συνδεδεµένη λίστα Η στοίβα υλοποιείται σαν µια συνδεδεµένη λίστα, όπου ο δείκτης που δείχνει τον πρώτο κόµβο της λίστας θα παίζει τον ρόλο της korifi stoiva
85 Για την υλοποίηση του ΑΤΔ στοίβα µε συνδεδεµένες λίστες χρειάζονται οι δηλώσεις: typedef typos_stoixeiou; typedef struct typos_komvou *typos_deikti; typedef struct typos_komvou { typos_stoixeiou dedomena; typos_deikti epomenos; }; typedef typos_deikti typos_stoivas; typos_stoivas stoiva; Η εξαγωγή και η ώθηση στοιχείου από τη στοίβα είναι ειδικές περιπτώσεις εισαγωγής και εξαγωγής στοιχείου από µια συνδεδεµένη λίστα
86 Στη συνέχεια παρουσιάζονται τα υποπρογράµµατα για τις βασικές λειτουργίες ώθησης και εξαγωγής στοιχείου σε µια στοίβα 2 stoiva 1 prosorinos stoixeio = dedomena(stoiva); diagrafi(stoiva);
87 stoiva prosorinos eisagogi_prin(stoiva)
88 void dimiourgia(typos_stoivas *stoiva) { *stoiva = NULL; ( dimiourgia_listas (stoiva);) } int keni(typos_stoivas stoiva) { return ( stoiva == NULL); ( return ( keni_listas(stoiva));) } void othisi(typos_stoivas *stoiva, typos_stoixeiou stoixeio) { eisagogi_prin(stoiva,stoixeio); }
89 void exagogi(typos_stoivas *stoiva, typos_stoixeiou *stoixeio) { if (keni(*stoiva)) printf( Η στοίβα είναι κενή ); } else { *stoixeio = periexomeno(*stoiva); diagrafi(stoiva); }
90 Η παρατήρηση εδώ είναι ότι στη διαδικασία othisi δεν υπάρχει ο έλεγχος για το αν η στοίβα είναι γεµάτη όπως στην υλοποίηση µε πίνακα Ο µόνος περιορισµός στην υλοποίηση της στοίβας µε δείκτες είναι η συνολική διαθέσιµη µνήµη Ετσι, η υλοποίηση αυτή παριστάνει µε µεγαλύτερη πιστότητα τον ΑΤΔ στοίβα Επίσης αξίζει στο σηµείο αυτό να τονιστεί το γεγονός ότι τα υποπρογράµµατα των βασικών πράξεων του ΑΤΔ στοίβα λειτουργούν είτε ο ΑΤΔ συνδεδεµένη λίστα έχει υλοποιηθεί µε πίνακα ή µε δείκτες Με άλλα λόγια ο ΑΤΔ συνδεδεµένη λίστα χρησιµοποιείται στην παρούσα περίπτωση για την υλοποίηση ενός άλλου ΑΤΔ (στοίβα) Ακριβώς και για το λόγο αυτό δίνεται έµφαση στη χρήση του ΑΤΔ
91 Στη συνέχεια παρουσιάζεται το πρόγραµµα για την µετατροπή ενός δεκαδικού µη αρνητικού ακέραιου αριθµού στο δυαδικό σύστηµα Στο πρόγραµµα αυτό έχουν τροποποιηθεί µόνο οι δηλώσεις και τα υποπρογράµµατα dimiourgia, keni, exagogi και othisi σε σχέση µε το προηγούµενο /* Eδώ τοποθετούνται οι Συναρτήσεις Yλοποίησης Πράξεων Στοίβας */ main() { /* Tο πρόγραµµα αυτό µετατρέπει ένα θετικό ακέραιο από το δεκαδικό στο δυαδικό σύστηµα και τυπώνει την τελική παραστασή του */ int arithmos,ypoloipo; typos_stoivas stoiva; printf("δώστε ένα θετικό ακέραιο:"); scanf("%d",&arithmos); συνέχεια
92 } dimiourgia(&stoiva); while (arithmos) { ypoloipo=arithmos % 2; othisi(&stoiva,ypoloipo); arithmos=arithmos / 2; } printf("o αριθµός στο δυαδικό σύστηµα είναι: \n"); while (!keni(stoiva) ) { exagogi(&stoiva,&ypoloipo); printf("%d",ypoloipo); } printf("\n\n"); συνέχεια
93 Ας σηµειωθεί ότι οι επικεφαλίδες των υποπρογραµµάτων που υλοποιούν τις βασικές πράξεις του ΑΤΔ στοίβα µε συνδεδεµένη λίστα είναι οι ίδιες µε εκείνες που υλοποιούν τον ίδιο ΑΤΔ µε πίνακα Κατ' αυτόν τον τρόπο είναι δυνατόν να χρησιµοποιείται κάθε φορά η πιο αποτελεσµατική υλοποίηση του ΑΤΔ στοίβα, ανάλογα µε την εφαρµογή, µε ελάχιστες τροποποιήσεις του κύριου προγράµµατος Στο σηµείο αυτό παρατηρεί κανείς έντονα το πλεονέκτηµα της απόκρυψης της πληροφορίας που επιτυγχάνεται ακολουθώντας τη µέθοδο του ΑΤΔ
94 Yλοποίηση του ΑΤΔ ουρά µε συνδεδεµένη λίστα H υλοποίηση του ΑΤΔ ουρά µε δείκτες είναι όµοια µε εκείνη της στοίβας µε τη µόνη διαφορά ότι εδώ χρειάζονται δύο δείκτες οι οποίοι δείχνουν το εµπρός και το πίσω µέρος της ουράς Στην υλοποίηση της ουράς µε συνδεδεµένη λίστα ο δείκτης embros δείχνει τον πρώτο κόµβο ενώ ο δείκτης piso τον τελευταίο κόµβο embros piso
95 Χρειαζόµαστε τις δηλώσεις: typedef typos_stoixeiou ; typedef struct komvos_ouras *typos_deikti; typedef struct komvos_ouras { typos_stoixeiou dedomena; typos_deikti epomenos; }; typedef struct { typos_deikti embros,piso; } typos_ouras; typos_ouras oura;
96 Στη συνέχεια παρουσιάζονται τα υποπρογράµµατα που αναφέρονται στις βασικές πράξεις του ΑΤΔ ουρά υλοποιηµένου µε συνδεδεµένη λίστα και δείκτες void dimiourgia(typos_ouras *oura) { oura->embros = NULL; oura->piso = NULL; } int keni(typos_ouras oura) { return (ouraembros == NULL); }
97 Πρόσθεση στοιχείου στην ουρά prosorinos 1 2 oura 3 4 piso embros piso pare_komvo(prosorinos); 1 dedomena(prosorinos) = stoixeio; epomenos(prosorinos) = NULL; epomenos(piso) = prosorinos; 3 piso = prosorinos; 4 } 2
98 void prosthesi(typos_ouras *oura, typos_stoixeiou stoixeio) { /* Mετά: Tο στοιχείο stoixeio έχει προστεθεί στο τέλος της ουράς *oura */ typos_deikti prosorinos; prosorinos = (typos_deikti) malloc(sizeof(struct komvos_ouras)); 1 prosorinos->dedomena = stoixeio; 2 prosorinos->epomenos = NULL; /* Eισαγωγή του νέου κόµβου στο πίσω µέρος της ουράς */ if (keni(*oura)) oura->embros = prosorinos; else oura->piso->epomenos = prosorinos; 3 } /* Eνηµέρωση του piso ώστε να δείχνει τον τελευταίο κόµβο */ oura->piso = prosorinos; 4
99 Αν η ουρά είχε παρασταθεί όπως στο παρακάτω σχήµα, όπου οι δείκτες embros και piso έχουν ανταλλάξει θέσεις, τότε θα υπήρχε πρόβληµα µετά τη διαγραφή του κόµβου piso embros
100 Αποµάκρυνση στοιχείου από την ουρά prosorinos 1 embros 2 embros piso prosorinos = embros; 1 stoixeio = dedomena(embros); embros = epomenos(embros); apodesmeysi(prosorinos); 2
101 void apomakrinsi(typos_ouras *oura, typos_stoixeiou *stoixeio) /*Mετά: Aν η *oura δεν είναι κενή τότε διαγράφεται το πρώτο στοιχείο της *oura και αποθηκεύεται στο *stoixeio και επιστρέφεται 1, αλλιώς επιστρέφεται 0 */ { typos_deikti prosorinos; if (keni(*oura)) printf( Η ουρά είναι κενή ); else { *stoixeio = periexomeno(oura->embros); diagrafi(oura->embros); if keni(oura) /* Αν η ουρά είναι κενή τότε piso=null*/ piso = NULL; } }
102 Αναζήτηση κόµβου Ας υποθέσουµε ότι έχουµε µια ταξινοµηµένη συνδεδεµένη λίστα και θέλουµε να εντοπίσουµε ένα στοιχείο της µε συγκεκριµένο περιεχόµενο στο τµήµα των δεδοµένων του ή ότι θέλουµε να εντοπίσουµε τη θέση στην οποία θα εισάγουµε ένα νέο κόµβο void anazitisi_listas(typos_deikti lista, typos_stoixeiou stoixeio, typos_deikti *prodeiktis, int *vrethike) {/*Mετά: Έγινε αναζήτηση της lista για τον εντοπισµό κόµβου που έχει περιεχόµενο stoixeio (στην περίπτωση αυτή *vrethike=1) ή για µια θέση για την εισαγωγή ενός νέου κόµβου (*vrethike= 0)Tο *prodeiktis δείχνει τον προηγούµενο κόµβο από αυτόν που περιέχει το stoixeio ή τον κόµβο µετά τον οποίο µπορεί να εισαχθεί το stoixeio */ συνέχεια
103 typos_deikti trexon; int anazitisi; trexon = lista; *prodeiktis = NULL; *vrethike = 0; anazitisi = 0; while ((!anazitisi) && (!keni(trexon))) if (periexomeno(trexon) >= stoixeio) { anazitisi = 1; *vrethike = (periexomeno(trexon) == stoixeio); } else { *prodeiktis = trexon; proxorise(&trexon); }}
104 Λίστες µε κεφαλή Ο κόµβος κεφαλή συνήθως δεν περιέχει τίποτα στο τµήµα των δεδοµένων του και ο ρόλος του είναι απλά για να υπάρχει ένας προηγούµενος κόµβος πριν τον "πραγµατικό" πρώτο κόµβο της λίστας lista? Βασίλης Ελένη Σπύρος Mε αυτού του είδους την υλοποίηση, κάθε συνδεδεµένη λίστα έχει ένα κόµβο κεφαλή Πιο συγκεκριµένα, µια κενή λίστα έχει ένα κόµβο κεφαλή: lista?
105 H δηµιουργία µιας κενής συνδεδεµένης λίστας µε κεφαλή περιγράφεται από το υποπρόγραµµα: typedef typos_stoixeiou ; typedef struct typos_komvou *typos_deikti; typedef struct typos_komvou { typos_stoixeiou dedomena; typos_deikti epomenos; }; typos_deikti lista; void dimiourgia(typos_deikti *lista) { *lista = (typos_deikti) malloc(sizeof(struct typos_komvou)); (*lista)->epomenos = NULL; }
106 Οµοια για τον έλεγχο αν µια λίστα είναι κενή έχουµε: int keni(typos_deikti lista) /*Ελέγχει αν µια λίστα µε κεφαλή είναι κενή*/ { return (lista->epomenos == NULL); }
107 Οι πράξεις proxorise και περιεχόµενο παραµένουν οι ίδιες Τόσο οι αλγόριθµοι όσο και τα αντίστοιχα υποπρογράµµατα για τις πράξεις της εισαγωγής και διαγραφής απλοποιούνται για τις συνδεδεµένες λίστες µε κεφαλή Ετσι το υποπρόγραµµα eisagogi τροποποιείται στο παρακάτω: void eisagogi (typos_stoixeiou stoixeio, typos_deikti prodeiktis) /* Mετά: O κόµβος µε δεδοµένα stoixeio έχει εισαχθεί στη συνδεδεµένη λίστα µε κεφαλή µετά τον κόµβο που δείχνει ο prodeiktis */ { typos_deikti prosorinos; prosorinos = (typos_deikti) malloc(sizeof(struct typos_komvou)); prosorinos->dedomena= stoixeio; prosorinos->epomenos= prodeiktis->epomenos; prodeiktis->epomenos= prosorinos;} συνέχεια
108 Οµοια για το υποπρόγραµµα diagrafi έχουµε: void diagrafi(typos_deikti *lista, typos_deikti prodeiktis) /*Προ : H *lista δεν είναι κενή Mετά: Aν η λίστα *lista δεν είναι κενή τότε διαγράφθηκε από τη *lista ο επόµενος κόµβος από αυτόν που δείχνει ο prodeiktis */ { typos_deikti prosorinos; if (keni(*lista)) printf( Η λίστα είναι κενή ); συνέχεια
109 } else { } prosorinos = prodeiktis->epomenos; prodeiktis->epomenos =prosorinos->epomenos; free(prosorinos);
110 Κυκλικά Συνδεδεµένες Λίστες klista Ανδρέας Βασίλης Ελένη Σπύρος klista 2 Ελένη 1 Στους αλγορίθµους της διαγραφής και εισαγωγής κόµβου δεν χρειάζεται να ληφθεί υπόψη η περίπτωση κόµβων που δεν έχουν προηγούµενο
111 Αλγόριθµος εισαγωγής σε κυκλικά συνδεδεµένη λίστα : {Ο prodeiktis δείχνει τον προηγούµενο κόµβο από αυτόν που πρόκειται να εισαχθεί (αν υπάρχει)} 1 pare_komvo(prosorinos) 2 dedomena(prosorinos)= stoixeio 3 Αν η κυκλική λίστα είναι κενή τότε α epomenos(prosorinos) = prosorinos β klista = prosorinos διαφορετικά α epomenos(prosorinos)= epomenos(prodeiktis) β epomenos(prodeiktis) = prosorinos
112 Το αντίστοιχο υποπρόγραµµα είναι το παρακάτω: void eisagogi_klista(typos_deikti *klista, typos_stoixeiou stoixeio, typos_deikti prodeiktis) {/* Mετά: O κόµβος µε δεδοµένα stoixeio έχει εισαχθεί(στην κυκλικά συνδεδεµένη λίστα *klista) µετά τον κόµβο που δείχνει ο prodeiktis */ typos_deikti prosorinos; prosorinos = (typos_deikti) malloc(sizeof(struct typos_komvou)); prosorinos->dedomena = stoixeio; if (keni_klista(*klista)) { prosorinos->epomenos = prosorinos; *klista = prosorinos; συνέχεια }
113 } else { } prosorinos->epomenos = prodeiktis->epomenos; prodeiktis->epomenos = prosorinos;
114 Αλγόριθµος διαγραφής σε κυκλικά συνδεδεµένη λίστα {Ο prodeiktis δείχνει τον προηγούµενο κόµβο από αυτόν που πρόκειται να διαγραφτεί (αν υπάρχει)} Αν η λίστα είναι κενή τότε να τυπωθεί ένα µήνυµα διαφορετικά 1 prosorinos = epomenos(prodeiktis) 2 Αν prosorinos == prodeiktis τότε {λίστα µε ένα µόνο κόµβο} klista = NULL διαφορετικά epomenos(prodeiktis) = epomenos(prosorinos) 3 apodesmeysi(prosorinos)
115 void diagrafi_klista(typos_deikti *klista, typos_deikti prodeiktis) /* Προ : H λίστα *klista δεν είναι κενή Mετά: Aν η *klista δεν είναι κενή τότε διαγράφθηκε ο επόµενος κόµβος από αυτόν που δείχνει ο prodeiktis */ { typos_deikti prosorinos; if (keni_klista(*klista)) printf( Η λίστα είναι κενή ); else { prosorinos = prodeiktis->epomenos;
116 } } if (prosorinos == prodeiktis) /* µόνο ένας κόµβος */ *klista = NULL; else { prodeiktis->epomenos =prosorinos->epomenos; } free(prosorinos); if (prosorinos == *klista) /* Διαγραφή 1ου κόµβου */ *klista = prosorinos->epomenos;
117 Αλγόριθµος για την επίσκεψη των κόµβων µιας κυκλικά συνδεδεµένης λίστας Αν η λίστα δεν είναι κενή τότε: 1 trexon = klista 2 Να επαναλαµβάνονται τα ακόλουθα βήµατα: α Επεξεργασία του dedomena(trexon) β trexon = epomenos(trexon) µέχρις ότου trexon == klista
118 Κυκλικά Συνδεδεµένη Λίστα µε Κεφαλή klista? Ανδρέας Βασίλης Ελένη Ανδρέας Βασίλης Ελένη klista
119 Διπλά Συνδεδεµένες Λίστες Διπλά Συνδεδεµένες Λίστες : dlista? Ανδρέας Βασίλης Ελένη Κυκλικά Διπλά Συνδεδεµένες Λίστες : kdlista? Ανδρέας Βασίλης Ελένη
120 Για την υλοποίηση των διπλά συνδεδεµένων λιστών χρειάζονται οι ακόλουθοι ορισµοί και δηλώσεις: typedef typos_stoixeiou ; typedef struct typos_komvou *typos_deikti; typedef struct typos_komvou { typos_stoixeiou dedomena; typos_deikti epomenos,proigoumenos; }; typos_deikti dlista;
121 Οι αλγόριθµοι για τις βασικές πράξεις µε διπλά συνδεδεµένες λίστες είναι όµοιοι µε εκείνους των συνδεδεµένων λιστών µιας κατεύθυνσης dlista? void dimiourgia_dlistas(typos_deikti *dlista) /*Δηµιουργεί µια κενή διπλά συνδεδεµένη λίστα µε κεφαλή*/ { *dlista = (typos_deikti) malloc(sizeof(struct typos_komvou)); (*dlista)->epomenos = NULL; (*dlista)->proigoumenos = NULL; }
122 dlista? int keni_dlista(typos_deikti dlista) /*Ελέγχει αν µια διπλά συνδεδεµένη λίστα µε κεφαλή είναι κενή*/ { } return (dlista->epomenos == dlista->proigoumenos);
123 Εισαγωγή κόµβου σε µια διπλά συνδεδεµένη λίστα µε κεφαλή prosorinos 1 Ελένη prodeiktis 2 Νίκος 2 1 Σπύρος Πιο συγκεκριµένα, πρέπει να ακολουθηθούν τα επόµενα βήµατα: 1 Δηµιουργία κόµβου στον οποίο να δείχνει ο δείκτης prosorinos 2 Καταχώρηση της τιµής στο τµήµα των δεδοµένων του, δηλαδή το όνοµα Νίκος 3 Σύνδεση του κόµβου µε τη λίστα
124 void eisagogi_dlista(typos_stoixeiou stoixeio,typos_deikti prodeiktis) /* Mετά: O κόµβος µε δεδοµένα stoixeio έχει εισαχθεί στη διπλά συνδεδεµένη λίστά µε κεφαλή µετά τον κόµβο που δείχνει ο prodeiktis */ { typos_deikti prosorinos; prosorinos = (typos_deikti) malloc(sizeof(struct typos_komvou)); prosorinos->dedomena = stoixeio; 1 prosorinos->proigoumenos = prodeiktis; prosorinos->epomenos = prodeiktis->epomenos; prodeiktis->epomenos = prosorinos; 2 } if (prosorinos->epomenos!= NULL) prosorinos->epomenos->proigoumenos =prosorinos;
125 Διαγραφή κόµβου σε µια συνδεδεµένη λίστα µε κεφαλή Ανδρέας Ελένη Σπύρος prodeiktis prosorinos void diagrafi_dlista(typos_deikti *dlista,typos_deikti prodeiktis) /* Προ : H διπλά συνδεδεµένη λίστά µε κεφαλή δεν είναι κενή Mετά: Aν η *dlista δεν είναι κενή τότε διαγράφθηκε ο επόµενος κόµβος από αυτόν που δείχνει ο prodeiktis */ typos_deikti prosorinos; συνέχεια
126 } if (keni_dlista(*dlista)) printf( Κενή λίστα ); else { prosorinos = prodeiktis->epomenos; prodeiktis->epomenos = prosorinos->epomenos; if (prosorinos->epomenos!= NULL) prosorinos->epomenos->proigoumenos = prodeiktis; free(prosorinos); }
127 Πολλαπλά συνδεδεµένες λίστες (multiply linked lists) Για το προηγούµενο παράδειγµα των εγγραφών, που περιέχουν το όνοµα και τον αριθµό µητρώου φοιτητών, θα µπορούσαµε να έχουµε την παρακάτω συνδεδεµένη λίστα: Σπύρος 1532 Βασίλης 1117 lista2 lista1 Ανδρέας 1758 Νίκος 2500
128 Εφαρµογές συνδεδεµένων λιστών Υλοποίηση του ΑΤΔ σύνολο µε συνδεδεµένη λίστα Η υλοποίηση του ΑΤΔ σύνολο µε πίνακα επιβάλλει τον περιορισµό ότι όλα τα σύνολα, ακόµα και εκείνα µε λίγα µόνο στοιχεία, παριστάνονται µε πίνακες των οποίων το µέγεθος είναι ίσο µε το µέγεθος του καθολικού συνόλου, το οποίο µπορεί να είναι αρκετά µεγάλο Ενας άλλος περιορισµός είναι ότι τα στοιχεία του καθολικού συνόλου πρέπει να είναι ταξινοµηµένα γιατί πρέπει να αντιστοιχούν στους δείκτες του πίνακα Ενας άλλος τρόπος υλοποίησης που δεν έχει τους παραπάνω περιορισµούς είναι εκείνος που χρησιµοποιεί τη συνδεδεµένη λίστα για την παράσταση ενός συνόλου Για παράδειγµα, το σύνολο των αρτίων ψηφίων θα µπορούσε να παρασταθεί µε την ακόλουθη συνδεδεµένη λίστα µε κεφαλή: artio?
129 Ας υποτεθεί ότι έχουµε τις δηλώσεις: typedef typos_stoixeiou ; typedef struct typos_komvou *typos_deikti; typedef struct typos_komvou { typos_stoixeiou dedomena; typos_deikti epomenos; }; typos_deikti synolo;
130 Με βάση τις παραπάνω δηλώσεις η δηµιουργία και ο έλεγχος µιας κενής συνδεδεµένης λίστας µε κεφαλή υλοποιούνται από τα ακόλουθα υποπρογράµµατα : void dimiourgia(typos_deikti *synolo) { *synolo = (typos_deikti) malloc(sizeof(struct typos_komvou)); (*synolo)->epomenos = NULL; }
131 int keno(typos_deikti synolo) /*Προ: Δηµιουργία κενής συνδεδεµένης λίστας µε κεφαλή Μετά : Επιστρέφει 1 ή 0 ανάλογα αν είναι κενή λίστα ή όχι*/ { return (synolo->epomenos == NULL); }
132 Για την υλοποίηση της εισαγωγής ενός νέου στοιχείου σε µια συνδεδεµένη λίστα µε κεφαλή, χρησιµοποιείται το ακόλουθο υποπρόγραµµα: void eisagogi(typos_deikti *synolo, typos_stoixeiou x) /* Mετά: Eισήχθη ένας νέος κόµβος µε δεδοµένα x στην αρχή της λίστας που παριστάνει το συνόλο */ { typos_deikti prosorinos; prosorinos = (typos_deikti) malloc(sizeof(struct typos_komvou)); prosorinos->dedomena = x; prosorinos->epomenos = (*synolo)->epomenos; (*synolo)->epomenos = prosorinos; }
133 Επίσης και οι άλλες πράξεις υλοποιούνται εξίσου εύκολα Για παράδειγµα, ο έλεγχος του αν ένα στοιχείο ανήκει σε ένα σύνολο υλοποιείται µε την παρακάτω συνάρτηση, η οποία στην ουσία διατρέχει τους κόµβους της λίστας int melos(typos_deikti synolo,typos_stoixeiou x) {/* Mετά: Aν το στοιχείο x είναι µέλος του synolo τότε η συνάρτηση επιστρέφει 1, αλλιώς επιστρέφει 0 */ typos_deikti trexon; int evrika; trexon = synolo->epomenos; /* έχει κεφαλή */ evrika = 0; συνέχεια
134 } while (!evrika && (trexon!= NULL) ) { if (trexon->dedomena == x) evrika = 1; else trexon = trexon->epomenos; } return evrika;
135 Για την ένωση C = A B δύο συνόλων Α και Β, που παριστάνονται µε αυτή την υλοποίηση, αντιγράφονται οι κόµβοι της Α στην C και στη συνέχεια, διατρέχονται οι κόµβοι της Β και αντιγράφονται στη C εφόσον δεν ανήκουν στην Α typos_deikti enosi(typos_deikti A,typos_deikti B) {/* Mετά: H συνάρτηση επιστρέφει την ένωση των συνόλων A και B */ typos_deikti C,prosorinos; dimiourgia(&c); /* αντιγραφή του A στο C */ prosorinos = A; proxorise(&prosorinos); συνέχεια
136 while (!keno(prosorinos)) { eisagogi(&c,periexomeno(prosorinos)); proxorise(&prosorinos); } /* αντιγραφή των στοιχείων του B,που δεν ανήκουν στο A,στο C */ prosorinos = B; proxorise(&prosorinos); while(!keno(prosorinos)) { if (!melos(a,periexomeno(prosorinos))) eisagogi(&c,periexomeno(prosorinos)); proxorise(&prosorinos); } return C;} συνέχεια
137 Η υλοποίηση των υπολοίπων πράξεων της διαφοράς και της τοµής δύο συνόλων αφήνονται σαν άσκηση
138 Υλοποίηση του ΑΤΔ συµβολοσειρά µε συνδεδεµένη λίστα Η µετατροπή της υλοποίησης µε πίνακα του ΑΤΔ συµβολοσειρά σε αντίστοιχη µε συνδεδεµένη λίστα είναι απλή Αρκεί ο πίνακας των χαρακτήρων να αντικατασταθεί µε µια συνδεδεµένη λίστα στην οποία ο κάθε κόµβος περιέχει ένα χαρακτήρα Οι δηλώσεις και η υλοποίηση της συνένωσης δύο συµβολοσειρών παρουσιάζονται παρακάτω :
139 typedef struct typos_komvou *typos_deikti; typedef struct typos_komvou { char xar; typos_deikti epomenos; }; typedef struct { int mikos; typos_deikti lista; } typos_seiras; typos_seiras seira;
140 void synenosi(typos_seiras seira1,typos_seiras seira2, typos_seiras *nea_seira) {/* Mετά: Δηµιουργήθηκε µια νέα συµβολοσειρά, η *nea_seira, που αποτελεί την συνένωση των συµβολοσειρών seira1 και seira2 */ typos_deikti trexon; dimiourgia(nea_seira); nea_seira->mikos = mikos(seira1)+mikos(seira2); /* αντιγραφή της seira1 στη nea_seira */ trexon = (seira1lista)->epomenos; while (trexon!= NULL) { prosartisi(nea_seira,trexon->xar); trexon = trexon->epomenos; } συνέχεια
141 } /* αντιγραφή της seira2 στη nea_seira */ trexon = (seira2lista)->epomenos; while (trexon!= NULL) { prosartisi(nea_seira,trexon->xar); trexon = trexon->epomenos; } Η υλοποίηση των υπολοίπων πράξεων του ΑΤΔ συµβολοσειρά αφήνεται σαν άσκηση
142 Παράσταση πολυωνύµου µε συνδεδεµένη λίστα Ενα πολυώνυµο n-ιοστού βαθµού έχει τη µορφή: p n (x) = a 0 + a 1 x + a 2 x a n x n και µπορεί να µελετηθεί µε τη χρήση του ΑΤΔ λίστα Πράγµατι, οι συντελεστές του µπορεί να θεωρηθούν ότι σχηµατίζουν τη λίστα (a 0, a 1, a 2,, a n ) και κατά συνέπεια να παρασταθεί µε οποιαδήποτε από τις υλοποιήσεις για λίστα Σε περίπτωση που το πολυώνυµο είναι αραιό πχ το : p(x) = 6 + x 50 + x 99
143 το οποίο έχει τη πλήρη µορφή p(x) = 6 + 0x + 0x x x 99 θα χρειάζεται ένα πίνακα µε 100 στοιχεία, από τα οποία τα τρία είναι µη µηδενικά Για την αποφυγή του προβλήµατος αυτού θα πρέπει να διατηρούνται µόνο οι µη µηδενικοί συντελεστές του πολυωνύµου Για παράδειγµα το p(x) παριστάνεται σαν ((6, 0), (1, 50), (1, 99)) όπου τα ζευγάρια είναι διατεταγµένα έτσι ώστε οι εκθέτες να είναι σε αύξουσα σειρά Ο κόµβος µιας τέτοιας λίστας θα έχει τη µορφή synd ekth
144 Για παράδειγµα, το p(x) θα παριστάνεται µε την ακόλουθη συνδεδεµένη λίστα µε κεφαλή: p??
145 Χρησιµοποιώντας την υλοποίηση µε δείκτες, απαιτούνται οι ακόλουθοι ορισµοί και δηλώσεις: typedef float typos_stoixeiou ; typedef struct typos_komvou *typos_deikti; typedef struct typos_komvou { typos_stoixeiou synd; int ekth; typos_deikti }; typos_deikti p; epomenos;
146 Η επεξεργασία πολυωνύµων που παριστάνονται µε τον παραπάνω τρόπο δεν παρουσιάζει δυσκολίες Για παράδειγµα, ας υποτεθεί ότι επιθυµούµε να προσθέσουµε τα πολυώνυµα και p(x) = 4 + 5x 3 + 2x 5 + x 7 q(x) = 2x 3 + 3x x 7-3x x 9 p που παριστάνονται σαν?? q??
147 Θα χρησιµοποιηθούν δύο βοηθητικοί δείκτες ptrexon και qtrexon που θα διατρέχουν τα στοιχεία των λιστών p και q, αντίστοιχα Σε κάθε βήµα, οι ptrexon και qtrexon θα δείχνουν κόµβους που πρόκειται να επεξεργαστούν Η επεξεργασία αρχίζει µε την σύγκριση των εκθετών των δύο κόµβων που δείχνουν οι ptrexon και qtrexon Αν οι εκθέτες είναι διαφορετικοί, τότε ο κόµβος που περιέχει το µικρότερο τοποθετείται στη νέα λίστα r που θα παριστάνει το άθροισµα των πολυωνύµων p(x) και q(x) Αν όµως οι εκθέτες είναι ίσοι, τότε οι συντελεστές αυτών των κόµβων προστίθενται και το αποτέλεσµα τοποθετείται στο πεδίο synd ενός νέου κόµβου Στο πεδίο ekth του κόµβου αυτού τοποθετείται ο κοινός εκθέτης και ο κόµβος αυτός τοποθετείται στη λίστα r Αν το άθροισµα των συντελεστών είναι µηδέν, τότε δεν δηµιουργείται νέος κόµβος Αν συναντηθεί το τέλος της µιας λίστας, τότε αντιγράφονται οι υπόλοιποι κόµβοι της άλλης στη λίστα r
148 Η πρόσθεση δύο πολυωνύµων που παριστάνονται µε συνδεδεµένες λίστες υλοποιείται στο ακόλουθο υποπρόγραµµα: void prosthesi_poly(typos_deikti p,typos_deikti q, typos_deikti *r) { /* Προ : Έχουν δηµιουργηθεί δύο λίστες µε κεφαλές που παριστάνουν δύο πολυώνυµα p και q Mετά: Tο *r είναι δείκτης σε µια συνδεδεµένη λίστα µε κεφαλή που παριστάνει το άθροισµα των πολυωνύµων p και q */ typos_deikti ptrexon,qtrexon,rtrexon,prosorinos; typos_stoixeiou neos_synd; συνέχεια
149 ptrexon = p->epomenos; qtrexon = q->epomenos; dimiourgia(r); rtrexon = *r; while ((ptrexon!=null) && (qtrexon!=null)) { if (ptrexon->ekth < qtrexon->ekth) { eisagogi_telos(ptrexon->synd,ptrexon->ekth,&rtrexon); proxorise(&ptrexon); } else συνέχεια
150 if (qtrexon->ekth < ptrexon->ekth) { eisagogi_telos(qtrexon->synd, qtrexon->ekth,&rtrexon); proxorise(&qtrexon); } else { neos_synd = ptrexon->synd + qtrexon->synd; if (neos_synd!= 0) eisagogi_telos(neos_synd,ptrexon->ekth,&rtrexon); proxorise(&ptrexon); proxorise(&qtrexon); } συνέχεια
151 } /* Aντιγραφή υπόλοπων κόµβων της p ή της q στην r */ if (ptrexon!=null) prosorinos = ptrexon; else prosorinos = qtrexon; while (prosorinos!=null) { eisagogi_telos(prosorinos->synd, prosorinos->ekth,&rtrexon); proxorise(&prosorinos); } rtrexon->epomenos = NULL; }
152 Το υποπρόγραµµα αυτό χρησιµοποιεί το υποπρόγραµµα eisagogi_telos για τη δηµιουργία κόµβου και την προσάρτησή του στο τέλος της νέας συνδεδεµένης λίστας, όπως φαίνεται παρακάτω: void eisagogi_telos(typos_stoixeiou sy, int ek, typos_deikti *telos) { /* Προ : Έχει δηµιουργηθεί µία λίστα και ο δείκτης *telos δείχνει τον τελευταίο κόµβο της Mετά: Έχει εισαχθεί στο τέλος της λίστας ένας νέος κόµβος µε συντελεστή sy και εκθέτη ek */ typos_deikti prosorinos; prosorinos = (typos_deikti) malloc(sizeof(struct typos_komvou)); prosorinos->synd = sy; prosorinos->ekth = ek; συνέχεια
153 } prosorinos->epomenos = NULL; (*telos)->epomenos = prosorinos; *telos = prosorinos;
154 Παράσταση αραιού πίνακα µε συνδεδεµένη λίστα Οταν περιοριστούµε στην πρόσθεση, αφαίρεση και τον πολ/µό αραιών πινάκων µπορούµε να χρησιµοποιήσουµε µια απλούστερη και πιο αποτελεσµατική συνδεδεµένη δοµή Απλουστευµένη σύνδεση του πίνακα Α : Α στοιχείο κεφαλή στοιχείο µε τις διαστάσεις του πίνακα σύνδεση κατά γραµµές σύνδεση κατά στήλες
155 Δοµή δεδοµένων για αραιούς πίνακες (a ij <> 0) (i) Στοιχείο κεφαλή kato dexi kefali epomeno (ii) Τυπικό στοιχείο λίστας kato kefali grammi stili dexi timi
156 FALSE J I A[I,J] (iii) Στοιχεία για a ij <> A = Αραιός Πίνακας Ακολουθεί η συνδεδεµένη δοµή του πίνακα Α :
157 Α 4 4 Κ 1 Κ 2 Κ 3 Κ 4 Κ Κ Κ 3 Κ
158 Πρόβληµα Γράψτε ένα υποπρόγραµµα διαδικασία που να διαβάζει ένα αραιό πίνακα και να δηµιουργεί τη συνδεδεµένη µορφή του Ανάλυση Θα υποθέσουµε ότι η πρώτη γραµµή του αρχείου εισόδου αποτελείται από τον αριθµό των γραµµών n, τον αριθµό των στηλών m και τον αριθµό r των µη µηδενικών στοιχείων του πίνακα Στη συνέχεια έπονται r γραµµές εισόδου όπου στην κάθε µία υπάρχει η τριάδα (i, j, a ij ) µε a ij <> 0 Επίσης υποθέτουµε ότι οι τριάδες αυτές είναι διατεταγµένες κατά γραµµές και σε κάθε γραµµή κατά στήλες
159 Στο κύριο πρόγραµµα υποθέτουµε ότι υπάρχουν οι ορισµοί: type deiktispin = stoixeio; stoixeio = record kato : deiktispin; dexi : deiktispin; case kefali : boolean of true : (epomeno : deiktispin); false : (timi : integer; grammi : integer; stili : integer) end; var kefstoixeio : array [1K] of deiktispin; όπου K = max(n, m)
160 procedure diabasmapin (var A: deiktispin); {Διάβασε ένα πίνακα και δηµιούργησε τη συνδεδεµένη δοµή του} var i, m, n, p, r, ggrammi, sstili, ttimi, trexgrammi: integer; x, trexon : deiktispin; begin {Διαστάσεις πίνακα} readln (n, m, r); if m > n then p := m else p := n; {αρχικές τιµές στους κόµβους κεφαλές} συνέχεια
161 for i := 1 to p do begin new(x); kefstoixeio[i] := x; with x do begin dexi := x; epomeno := x; kefali := true end {with} end; {for} trexgrami := 1; {τρέχον κόµβος στη τρέχουσα γραµµή} trexon := kefstoixeio[1]; συνέχεια
162 for i := 1 to r do begin readln (ggrammi, sstili, ttimi) if ggrami > trexgrami then begin {κλείσε την τρέχουσα γραµµή} trexon^dexi := kefstoixeio[trexgrami]; trexgrami := ggrami; trexon := kefstoixeio[ggrami] end; {στοιχείο για νέα τριάδα} new(x); with x do begin kefali := false; grami := ggrami; συνέχεια
163 stili := sstili; timi := ttimi end; {σύνδεση µε τη λίστα γραµµής} trexon^dexi := x; trexon := x; {σύνδεση µε τη λίστα στήλης} kefstoixeio[sstili]^epomeno kato := x; kefstoixeio[sstili]^epomeno := x; end; {for} {κλείσιµο τελευταίας γραµµής} for i := 1 to m do if r > 0 then trexon^dexi := kefstoixeio[trexgrami]; {κλείσιµο όλων των λιστών στήλης} kefstoixeio[i]^epomenο^kato := kefstoixeio[i]; συνέχεια
164 end; {Δηµιουργία κεφαλής της λίστας κεφαλής κόµβων} new(a); a^grami := n; a^stili := m; {Σύνδεση των κόµβων κεφαλές µεταξύ τους} for i := 1 to p - 1 do kefstoixeio[i]^epomeno := kefstoixeio[i+1]; if p = 0 then a^dexi := a else begin kefstoixeio[p]^epomeno := a; a^dexi := kefstoixeio[1] end
ΛΙΣΤΕΣ. Ορισμός ΑΤΔ Λίστα ΑΤΔ Ακολουθιακή Λίστα Διαχείριση Δεικτών και Λιστών στη C ΑΤΔ Συνδεδεμένη Λίστα. Εφαρμογές και Χρήση Λιστών
ΛΙΣΤΕΣ Ορισμός ΑΤΔ Λίστα ΑΤΔ Ακολουθιακή Λίστα Διαχείριση Δεικτών και Λιστών στη C ΑΤΔ Συνδεδεμένη Λίστα Υλοποίηση με δείκτες (pointers) Υλοποίηση με πίνακα Εφαρμογές και Χρήση Λιστών Λίστες (Lists) Δεδομένα
ΣΤΟΙΒΕΣ (stacks) Σχήµα: Λειτουργία Στοίβας
ΣΤΟΙΒΕΣ (stacks) Η στοίβα είναι µια συλλογή δεδοµένων µε γραµµική διάταξη στην οποία όλες οι εισαγωγές και οι διαγραφές γίνονται στο ένα άκρο που λέγεται κορυφή (top) της στοίβας Σχήµα: Λειτουργία Στοίβας
2 η Υλοποίηση του ΑΤΔ συνδεδεμένη λίστα με πίνακα Κόμβοι από δεδομένα και θέσεις πίνακα ????
η Υλοποίηση του ΑΤΔ συνδεδεμένη λίστα με πίνακα Κόμβοι από δεδομένα και θέσεις πίνακα θέση (index) dedomena epomenos lista = 0 1 3 Ελένη Σπύρος Βασίλης -1 1 Στη συνέχεια θα πρέπει να γνωρίζουμε την οργάνωση
Οι Πράξεις. 1 η Υλοποίηση του ΑΤΔ: μονά συνδεδεμένη λίστα με δείκτες. Σχεδιασμός: Λίστα με Συνδεδεμένους Κόμβους
Σχεδιασμός: Λίστα με Συνδεδεμένους Κόμβους Κάθε στοιχείο του ΑΤΔ συνδεδεμένη λίστα (linked list) καλείται κόμβος (node) και περιέχει δύο πεδία Στο ένα πεδίο αποθηκεύονται τα δεδομένα και Στο άλλο αποθηκεύεται
Σχεδιασμός: Λίστα με Συνδεδεμένους Κόμβους
Σχεδιασμός: Λίστα με Συνδεδεμένους Κόμβους Κάθε στοιχείο του ΑΤΔ συνδεδεμένη λίστα (linked list) καλείται κόμβος (node) και περιέχει δύο πεδία. Στο ένα πεδίο αποθηκεύονται τα δεδομένα και Στο άλλο αποθηκεύεται
Δομές Δεδομένων και Τεχνικές Προγραμματισμού Ενότητα 4: ΑΤΔ Λίστα. Ιωάννης Κοτρώνης Σχολή Θετικών Επιστημών Τμήμα Πληροφορικής και Τηλεπικοινωνιών
Δομές Δεδομένων και Τεχνικές Προγραμματισμού Ενότητα 4: ΑΤΔ Λίστα Ιωάννης Κοτρώνης Σχολή Θετικών Επιστημών Τμήμα Πληροφορικής και Τηλεπικοινωνιών Σκοποί ενότητας Ορίζει τον ΑΤΔ Λίστα Να αναδείξει το πρόβλημα
Ουρές (Queues) FIFO A B C. Διαγραφή. Εισαγωγή. εµπρός. πίσω. πίσω. πίσω
εµπρός Ουρές (Queues) A B C FIFO εµπρός πίσω B C Διαγραφή εµπρός πίσω B C D E Εισαγωγή πίσω Ορισµός Η ουρά είναι µια γραµµική λίστα στην οποία η διαγραφή ενός στοιχείου γίνεται στο ένα άκρο το οποίο καλείται
ΕΠΛ232: Εργαστήριο 2
ΕΠΛ232: Εργαστήριο 2 Παράδειγμα σε Στοίβες 1 Υπολογισμός Αριθμητικών Παραστάσεων - Πολωνικός Συμβολισμός A + (B * C) A + (BC * ) A(BC *) + ABC * + Ενδοθεματική μορφή Μεταθεματική μορφή Οι κανόνες που διέπουν
Οι βασικές πράξεις που ορίζουν τον ΑΤ δυαδικό δέντρο αναζήτησης είναι οι ακόλουθες:
υαδικά έντρα Αναζήτησης (Binary Search Trees) Ορισµός : Ένα δυαδικό δέντρο αναζήτησης t είναι ένα δυαδικό δέντρο, το οποίο είτε είναι κενό είτε: (i) όλα τα περιεχόµενα στο αριστερό υποδέντρο του t είναι
Tύπος δεδοµένων (data type) µιας µεταβλητής (σε µια γλώσσα προγραµµατισµού) είναι το σύνολο των τιµών που µπορεί να πάρει η µεταβλητή.
Tύπος δεδοµένων (data type) µιας µεταβλητής (σε µια γλώσσα προγραµµατισµού) είναι το σύνολο των τιµών που µπορεί να πάρει η µεταβλητή. Αφηρηµένος τύπος δεδοµένων (abstract data type): είναι ένα θεωρητικό
ΣΥΜΒΟΛΟΣΕΙΡΕΣ (Strings) Ο ΑΤΔ Συµβολοσειρά Μία συµβολοσειρά είναι µία ακολουθία χαρακτήρων. Bασικές πράξεις : 1. Δηµιουργία. 2. Μήκος. 3.
ΣΥΜΒΟΛΟΣΕΙΡΕΣ (Strings) Ο ΑΤΔ Συµβολοσειρά Μία συµβολοσειρά είναι µία ακολουθία χαρακτήρων Bασικές πράξεις : 1. Δηµιουργία 2. Μήκος 3. Ανάκτηση 4. Προσάρτηση 5. Διαγραφή 6. Αντιγραφή 7. Συνένωση 8. Αναζήτηση
Δυαδικά Δέντρα Αναζήτησης (Binary Search Trees) Ορισμός : Ένα δυαδικό δέντρο αναζήτησης t είναι ένα δυαδικό δέντρο, το οποίο είτε είναι κενό είτε:
Δυαδικά Δέντρα Αναζήτησης (Binary Search Trees) Ορισμός : Ένα δυαδικό δέντρο αναζήτησης t είναι ένα δυαδικό δέντρο, το οποίο είτε είναι κενό είτε: (i) όλα τα περιεχόμενα στο αριστερό υποδέντρο του t είναι
Δρ. Πέτρος Παναγή B123
Δρ. Πέτρος Παναγή petrosp@cs.ucy.ac.cy B123 1 ΣΥΜΒΟΛΟΣΕΙΡΕΣ (Strings) Ο ΑΤΔ Συμβολοσειρά Μία συμβολοσειρά είναι μία συλλογή χαρακτήρων με διάταξη Bασικές πράξεις : (Είναιτοελάχιστοδυνατόσύνολοπράξεων)
ΟιβασικέςπράξειςπουορίζουντονΑΤΔ δυαδικό δέντρο αναζήτησης είναι οι ακόλουθες:
Δυαδικά Δέντρα Αναζήτησης (Binary Search Trees) Ορισμός : Ένα δυαδικό δέντρο αναζήτησης t είναι ένα δυαδικό δέντρο, το οποίο είτε είναι κενό είτε: (i) όλα τα περιεχόμενα στο αριστερό υποδέντρο του t είναι
Επισκόπηση Μαθήματος. Γραμμικές Δομές Δεδομένων. ΑΤΔ Ουρά Εναλλακτικοί Σχεδιασμοί Προγραμματισμός με Ενότητες Interface.h Implementation.
Γραμμικές Δομές Δεδομένων Επισκόπηση Μαθήματος Συλλογή δεδομένων στη σειρά (ολική διάταξη). Προσθέτουμε δεδομένα στη Δομή (μεγαλώνει) ή αφαιρούμε δεδομένα (μικραίνει) Αν περιορίσουμε τις πράξεις Στην Αρχή
Γραμμικές Δομές Δεδομένων
Γραμμικές Δομές Δεδομένων Συλλογή δεδομένων στη σειρά (ολική διάταξη). Προσθέτουμε δεδομένα στη Δομή (μεγαλώνει) ή αφαιρούμε δεδομένα (μικραίνει) Αν περιορίσουμε τις πράξεις Στην Αρχή μόνο Στοίβα (stack)
Δέντρα (Trees) - Ιεραρχική Δομή
Δέντρα (Trees) - Ιεραρχική Δομή Εφαρμογές Δομή Οργάνωση Αρχείων Οργανογράμματα Ορισμός (αναδρομικός ορισμός): Ένα δέντρο είναι ένα πεπερασμένο σύνολο κόμβων το οποίο είτε είναι κενό είτε μη κενό σύνολο
ρίζα E F G H I J επίπεδο 1
Δέντρα (Trees) Ορισµός: Ενα δέντρο είναι ένα πεπερασµένο µη κενό σύνολο κόµβων τέτοιο ώστε: 1.Yπάρχει ένας µοναδικός κόµβος, που καλείται ρίζα, ο οποίος δεν έχει προηγούµενο. 2.Οι υπόλοιποι κόµβοι χωρίζονται
Δομές Δεδομένων. Ενότητα 7: Άλλες παραλλαγές Συνδεδεμένων Λιστών-Παράσταση Αραιού Πολυωνύμου με Συνδεδεμένη Λίστα. Καθηγήτρια Μαρία Σατρατζέμη
Ενότητα 7: Άλλες παραλλαγές Συνδεδεμένων Λιστών-Παράσταση Αραιού Πολυωνύμου με Συνδεδεμένη Λίστα Καθηγήτρια Μαρία Σατρατζέμη Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης Creative
Δομές Δεδομένων και Τεχνικές Προγραμματισμού Ενότητα 3: ΑΤΔ Ουρά. Ιωάννης Κοτρώνης Σχολή Θετικών Επιστημών Τμήμα Πληροφορικής και Τηλεπικοινωνιών
Δομές Δεδομένων και Τεχνικές Προγραμματισμού Ενότητα 3: ΑΤΔ Ουρά Ιωάννης Κοτρώνης Σχολή Θετικών Επιστημών Τμήμα Πληροφορικής και Τηλεπικοινωνιών Ορίζει τον ΑΤΔ Ουρά Σκοποί ενότητας Σχεδιάζει τον ΑΤΔ Ουρά
ΠΛΗΡΟΦΟΡΙΑΚΑ & ΤΗΛΕΠΙΚΟΙΝΩΝΙΑΚΑ ΣΥΣΤΗΜΑΤΑ
Οικονοµικό Πανεπιστήµιο Αθηνών Τµήµα ιοικητικής Επιστήµης & Τεχνολογίας ΠΛΗΡΟΦΟΡΙΑΚΑ & ΤΗΛΕΠΙΚΟΙΝΩΝΙΑΚΑ ΣΥΣΤΗΜΑΤΑ Κεφάλαιο 9 οµές εδοµένων σε C Γιώργος Γιαγλής Περίληψη Κεφαλαίου 9 οµές εδοµένων υναµικές
Δομές Δεδομένων. Ενότητα 4: Ο ΑΤΔ Λίστα & Υλοποίηση Λίστας με σειριακή αποθήκευση- Ο ΑΤΔ Συνδεδεμένη Λίστα- Υλοποίηση ΑΤΔ Συνδεδεμένη Λίστα με πίνακα
Ενότητα 4: Ο ΑΤΔ Λίστα & Υλοποίηση Λίστας με σειριακή αποθήκευση- Ο ΑΤΔ Συνδεδεμένη Λίστα- Υλοποίηση ΑΤΔ Συνδεδεμένη Λίστα με πίνακα Καθηγήτρια Μαρία Σατρατζέμη Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό
ΣΤΟΙΒΑ ΧΑΡΑΚΤΗΡΙΣΤΙΚΗ ΙΔΙΟΤΗΤΑ ΤΗΣ ΣΤΟΙΒΑΣ. Το τελευταίο στοιχείο που εισήχθη θα εξαχθεί πρώτο. Άλλο όνομα L I F O (Last In First Out)
ΣΤΟΙΒΑ ΧΑΡΑΚΤΗΡΙΣΤΙΚΗ ΙΔΙΟΤΗΤΑ ΤΗΣ ΣΤΟΙΒΑΣ Το τελευταίο στοιχείο που εισήχθη θα εξαχθεί πρώτο. Άλλο όνομα L I F O (Last In First Out) Χρήσεις Στοίβας Καθημερινή Ζωή (όχι πάρα πολλές) Δίσκοι Τραπεζαρίας
ΣΤΟΙΒΑ ΧΑΡΑΚΤΗΡΙΣΤΙΚΗ ΙΔΙΟΤΗΤΑ ΤΗΣ ΣΤΟΙΒΑΣ. Το τελευταίο στοιχείο που εισήχθη θα εξαχθεί πρώτο. Άλλο όνομα L I F O (Last In First Out)
ΣΤΟΙΒΑ ΧΑΡΑΚΤΗΡΙΣΤΙΚΗ ΙΔΙΟΤΗΤΑ ΤΗΣ ΣΤΟΙΒΑΣ Το τελευταίο στοιχείο που εισήχθη θα εξαχθεί πρώτο. Άλλο όνομα L I F O (Last In First Out) Χρήσεις Στοίβας Καθημερινή Ζωή (όχι πάρα πολλές) Δίσκοι Τραπεζαρίας
Χρήσεις Στοίβας ΣΤΟΙΒΑ. Ορισμός Στοίβας (stack) Βασική Λειτουργικότητα
ΣΤΟΙΒΑ ΧΑΡΑΚΤΗΡΙΣΤΙΚΗ ΙΔΙΟΤΗΤΑ ΤΗΣ ΣΤΟΙΒΑΣ Το τελευταίο στοιχείο που εισήχθη θα εξαχθεί πρώτο. Άλλο όνομα L I F O (Last In First Out) Χρήσεις Στοίβας Καθημερινή Ζωή (όχι πάρα πολλές) Δίσκοι Τραπεζαρίας
Επιλογές και Κριτήρια Σχεδιασμού ΑΤΔ Ανεξαρτήτως από Γλώσσα Υλοποίησης 24/4/2012
Επιλογές και Κριτήρια Σχεδιασμού ΑΤΔ Ανεξαρτήτως από Γλώσσα Υλοποίησης 24/4/2012 Κύκλος (Ζωής) Λογισμικού (ΑΤΔ) Γενικά Ορισμός ΑΤΔ (Προδιαγραφές) Οργάνωση Δεδομένων Τι κάνει Υλοποίηση Σχεδιασμός (ανεξάρτητος
Δομές Δεδομένων. Ενότητα 6: Εφαρμογή Συνδεδεμένων Λιστών: Αλφαβητικό ευρετήριο κειμένου- Υλοποίηση ΑΤΔ Στοίβα και Ουρά με δείκτες
Ενότητα 6: Εφαρμογή Συνδεδεμένων Λιστών: Αλφαβητικό ευρετήριο κειμένου- Υλοποίηση ΑΤΔ Στοίβα και Ουρά με δείκτες Καθηγήτρια Μαρία Σατρατζέμη Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες
ΠΑΡΑΡΤΗΜΑ: QUIZ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ
ΠΑΡΑΡΤΗΜΑ: QUIZ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ (Οι ερωτήσεις µε κίτρινη υπογράµµιση είναι εκτός ύλης για φέτος) ΕΙΣΑΓΩΓΗ Q1. Οι Πρωταρχικοί τύποι (primitive types) στη Java 1. Είναι όλοι οι ακέραιοι και όλοι οι πραγµατικοί
AVL δέντρα. h L h R. G.M. Adelson_Velkii και E.M. Landis 1962
AVL δέντρα L - R 1 L R G.M. AdelsonVelkii και E.M. Landis 1962 AVL Δέντρα Μη AVL Δέντρα Εισαγωγή κόμβου 4, 6 : 4 12 : 6 4 6 Αριστερή στροφή 6 4 12 12 8, 14 : 6 4 12 8 14 7 : 4 6 12 6 4 8 6 8 12 7 8 14
Υλοποίηση Λιστών. Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα:
Υλοποίηση Λιστών Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: Ευθύγραμμές Απλά και Διπλά Συνδεδεμένες Λίστες Κυκλικές Απλά και Διπλά Συνδεδεμένες Λίστες Τεχνικές Μείωσης Μνήμης ΕΠΛ 231 Δομές
Δομές Δεδομένων. Ενότητα 2: Στοίβες Εισαγωγή-Υλοποίηση ΑΤΔ Στοίβα με Πίνακα-Εφαρμογή Στοίβας: Αντίστροφη Πολωνική Γραφή. Καθηγήτρια Μαρία Σατρατζέμη
Ενότητα 2: Στοίβες Εισαγωγή-Υλοποίηση ΑΤΔ Στοίβα με Πίνακα-Εφαρμογή Στοίβας: Αντίστροφη Πολωνική Γραφή Καθηγήτρια Μαρία Σατρατζέμη Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης Creative
ΠΛΗ111. Ανοιξη 2005. Μάθηµα 3 ο. Συνδεδεµένες Λίστες. Τµήµα Ηλεκτρονικών Μηχανικών και Μηχανικών Υπολογιστών Πολυτεχνείο Κρήτης
ΠΛΗ111 οµηµένος Προγραµµατισµός Ανοιξη 2005 Μάθηµα 3 ο Συνδεδεµένες Λίστες Τµήµα Ηλεκτρονικών Μηχανικών και Μηχανικών Υπολογιστών Πολυτεχνείο Κρήτης Ανασκόπηση ΟΑΤ λίστα Ακολουθιακή λίστα Συνδεδεµένη λίστα
Δομές Δεδομένων. Καθηγήτρια Μαρία Σατρατζέμη. Τμήμα Εφαρμοσμένης Πληροφορικής. Δομές Δεδομένων. Τμήμα Εφαρμοσμένης Πληροφορικής
Ενότητα 5: Δείκτες και Δυναμική Δέσμευση- Αποδέσμευση Μνήμης στη C/ Υλοποίηση ΑΤΔ Συνδεδεμένη Λίστα με δείκτες /Ένα πακέτο για τον ΑΤΔ Συνδεδεμένη Λίστα Καθηγήτρια Μαρία Σατρατζέμη Άδειες Χρήσης Το παρόν
Εισαγωγή στην C. Μορφή Προγράµµατος σε γλώσσα C
Εισαγωγή στην C Μορφή Προγράµµατος σε γλώσσα C Τµήµα Α Με την εντολή include συµπεριλαµβάνω στο πρόγραµµα τα πρότυπα των συναρτήσεων εισόδου/εξόδου της C.Το αρχείο κεφαλίδας stdio.h είναι ένας κατάλογος
Διάλεξη 22: Δυαδικά Δέντρα. Διδάσκων: Παναγιώτης Ανδρέου
Διάλεξη 22: Δυαδικά Δέντρα Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: - Δυαδικά Δένδρα - Δυαδικά Δένδρα Αναζήτησης - Πράξεις Εισαγωγής, Εύρεσης Στοιχείου, Διαγραφής Μικρότερου Στοιχείου
υαδικό δέντρο έντρα (Trees) -Ιεραρχική οµή
έντρα (Trees) Ιεραρχική οµή Εφαρµογές οµή Οργάνωση ρχείων Οργανογράµµατα Ορισµός (αναδροµικός ορισµός): Ένα δέντρο είναι ένα πεπερασµένο σύνολο κόµβων το οποίο είτε είναι κενό είτε µη κενό σύνολο τέτοιο
ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ. ΕΠΛ 035: οµές εδοµένων και Αλγόριθµοι για Ηλεκτρολόγους Μηχανικούς και Μηχανικούς Υπολογιστών
ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΕΠΛ 035: οµές εδοµένων και Αλγόριθµοι για Ηλεκτρολόγους Μηχανικούς και Μηχανικούς Υπολογιστών Ακαδηµαϊκό έτος 2010 2011, Χειµερινό εξάµηνο Ασκήσεις Επανάληψης Ενδιάµεσης
Διάλεξη 17: Δυαδικά Δέντρα. Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ
Διάλεξη 7: Δυαδικά Δέντρα Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: Δυαδικά Δένδρα Δυαδικά Δένδρα Αναζήτησης Πράξεις Εισαγωγής, Εύρεσης Στοιχείου, Διαγραφής Μικρότερου Στοιχείου Διδάσκων:
Διάλεξη 12: Λίστες Υλοποίηση & Εφαρμογές. Διδάσκων: Παναγιώτης Ανδρέου
Διάλεξη 12: Λίστες Υλοποίηση & Εφαρμογές Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: -Ευθύγραμμες Απλά Συνδεδεμένες Λίστες (εύρεση, εισαγωγή, διαγραφή) - Σύγκριση Συνδεδεμένων Λιστών με Πίνακες
Θεωρητικό Μέρος. 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 Νοεµβρίου 2005 Η/Υ 432: οµές εδοµένων Χειµερινό Εξάµηνο Ακαδηµαϊκού Έτους 2005-2006 Παναγιώτα Φατούρου Ηµεροµηνία Παράδοσης 1 ο Σετ Ασκήσεων Θεωρητικό Μέρος:
Δομές Δεδομένων και Τεχνικές Προγραμματισμού Ενότητα 2: ΑΤΔ Στοίβα. Ιωάννης Κοτρώνης Σχολή Θετικών Επιστημών Τμήμα Πληροφορικής και Τηλεπικοινωνιών
Δομές Δεδομένων και Τεχνικές Προγραμματισμού Ενότητα 2: ΑΤΔ Στοίβα Ιωάννης Κοτρώνης Σχολή Θετικών Επιστημών Τμήμα Πληροφορικής και Τηλεπικοινωνιών Σκοποί ενότητας Ορίζει τον ΑΤΔ Στοίβα Σχεδιαστικές Επιλογές
Δομές Δεδομένων. Ενότητα 12: Κατακερματισμός: Χειρισμός Συγκρούσεων. Καθηγήτρια Μαρία Σατρατζέμη. Τμήμα Εφαρμοσμένης Πληροφορικής.
Ενότητα 12: Κατακερματισμός: Χειρισμός Συγκρούσεων Καθηγήτρια Μαρία Σατρατζέμη Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης Creative Commons. Για εκπαιδευτικό υλικό, όπως εικόνες,
ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ
ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΕΠΛ 23: οµές εδοµένων και Αλγόριθµοι Ενδιάµεση Εξέταση Ηµεροµηνία : ευτέρα, 3 Νοεµβρίου 2008 ιάρκεια : 2.00-4.00 ιδάσκουσα : Άννα Φιλίππου Ονοµατεπώνυµο: ΣΚΕΛΕΤΟΙ
Προγραµµατισµός Ι (ΗΥ120)
Προγραµµατισµός Ι (ΗΥ120) Διάλεξη 15: Διασυνδεµένες Δοµές - Λίστες Δοµές δεδοµένων! Ένα τυπικό πρόγραµµα επεξεργάζεται δεδοµένα Πώς θα τα διατάξουµε? 2 Τι λειτουργίες θέλουµε να εκτελέσουµε? Πώς θα υλοποιήσουµε
ΕΝΟΤΗΤΑ 6 ΛΙΣΤΕΣ ΠΑΡΑΛΕΙΨΗΣ (SKIP LISTS)
ΕΝΟΤΗΤΑ 6 ΛΙΣΤΕΣ ΠΑΡΑΛΕΙΨΗΣ (SKIP LISTS) Ταχεία Αναζήτηση Σε πίνακα: δυαδική αναζήτηση (binary search) σε ταξινοµηµένο πίνακα O(log n) Σε δένδρο: αναζήτηση σε ισοζυγισµένο δένδρο O(log n) Σε λίστα: Μπορούµε
Alternative to Balanced Trees, Comms of the ACM, 33(6), June 1990,
ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΘΗΝΩΝ Τμήμα Πληροφορικής & Τηλεπικοινωνιών Μια σημείωση από τον Α. Δελή για το άρθρο: W. Pugh, Skip Lists: A Probabilistic Alternative to Balanced Trees, Comms of the ACM, 33(), June 10,
Οργάνωση αρχείων: πως είναι τοποθετηµένες οι εγγραφές ενός αρχείου όταν αποθηκεύονται στο δίσκο
Κατακερµατισµός 1 Οργάνωση Αρχείων (σύνοψη) Οργάνωση αρχείων: πως είναι τοποθετηµένες οι εγγραφές ενός αρχείου όταν αποθηκεύονται στο δίσκο 1. Αρχεία Σωρού 2. Ταξινοµηµένα Αρχεία Φυσική διάταξη των εγγραφών
Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ
Διάλεξη 10: Λίστες Υλοποίηση & Εφαρμογές Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: Ευθύγραμμες Απλά Συνδεδεμένες Λίστες (εύρεση, εισαγωγή, διαγραφή) Σύγκριση Συνδεδεμένων Λιστών με Πίνακες
ΠΛΗ111. Ανοιξη 2005. Μάθηµα 7 ο. έντρο. Τµήµα Ηλεκτρονικών Μηχανικών και Μηχανικών Υπολογιστών Πολυτεχνείο Κρήτης
ΠΛΗ111 οµηµένος Προγραµµατισµός Ανοιξη 2005 Μάθηµα 7 ο έντρο Τµήµα Ηλεκτρονικών Μηχανικών και Μηχανικών Υπολογιστών Πολυτεχνείο Κρήτης έντρο Ορισµός Υλοποίηση µε Πίνακα Υλοποίηση µε είκτες υαδικό έντρο
Διάλεξη 11: Φροντιστήριο για Στοίβες. Διδάσκων: Παναγιώτης Ανδρέου. ΕΠΛ035 Δομές Δεδομένων και Αλγόριθμοι για Ηλ. Μηχ. Και Μηχ. Υπολ.
Διάλεξη 11: Φροντιστήριο για Στοίβες Διδάσκων: Παναγιώτης Ανδρέου ΕΠΛ035 Δομές Δεδομένων και Αλγόριθμοι για Ηλ. Μηχ. Και Μηχ. Υπολ. 1 ΑΤΔ Στοίβα- Πράξεις Θυμηθείτε τον ΑΤΔ στοίβα με τις πράξεις του: MakeEmptyStack()
#include <stdlib.h> Α. [-128,127] Β. [-127,128] Γ. [-128,128]
ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ Εξετάσεις Α Περιόδου 2017 (27/1/2017) ΟΝΟΜΑΤΕΠΩΝΥΜΟ:................................................................................ Α.Μ.:...............................................
ΕΝΤΟΛΕΣ ΕΠΑΝΑΛΗΨΗΣ. for (παράσταση_1; παράσταση_2; παράσταση_3) εντολή επόμενη εντολή
ΕΝΤΟΛΕΣ ΕΠΑΝΑΛΗΨΗΣ for (παράσταση_1; παράσταση_2; παράσταση_3) εντολή επόμενη εντολή παράσταση_1 = Παράσταση Αρχικοποίησης παράσταση_2 = Παράσταση Ελέγχου Επανάληψης παράσταση_3 = Παράσταση Ενημέρωσης
ΠΛΗ111. Ανοιξη Μάθηµα 5 ο. Ουρά. Τµήµα Ηλεκτρονικών Μηχανικών και Μηχανικών Υπολογιστών Πολυτεχνείο Κρήτης
ΠΛΗ οµηµένος Προγραµµατισµός Ανοιξη 5 Μάθηµα 5 ο Ουρά Τµήµα Ηλεκτρονικών Μηχανικών και Μηχανικών Υπολογιστών Πολυτεχνείο Κρήτης Ανασκόπηση Αφηρηµένος Τύπος εδοµένων Ουρά Υλοποίηση µε Κυκλικό Πίνακα Υλοποίηση
Φροντιστήριο 4 Σκελετοί Λύσεων
Φροντιστήριο 4 Σκελετοί Λύσεων 1. Ο ζητούμενος ΑΤΔ μπορεί να υλοποιηθεί ως εξής: (i) Διαδοχική χορήγηση μνήμης Υποθέτουμε ότι οι λίστες μας έχουν μέγιστο μέγεθος max και χρησιμοποιούμε τη δομή type elements[max];
ΠΛΗ111. Ανοιξη Μάθηµα 2 ο. Αλγόριθµοι και Αφηρηµένοι Τύποι εδοµένων. Τµήµα Ηλεκτρονικών Μηχανικών και Μηχανικών Υπολογιστών Πολυτεχνείο Κρήτης
ΠΛΗ111 οµηµένος Προγραµµατισµός Ανοιξη 2005 Μάθηµα 2 ο Αλγόριθµοι και Αφηρηµένοι Τύποι εδοµένων Τµήµα Ηλεκτρονικών Μηχανικών και Μηχανικών Υπολογιστών Πολυτεχνείο Κρήτης Αλγόριθµοι Ορισµός Παράδειγµα Ασυµπτωτική
Δομές Δεδομένων. Ενότητα 1: Εισαγωγή-Υλοποίηση του ΑΤΔ Σύνολο με Πίνακα. Καθηγήτρια Μαρία Σατρατζέμη. Τμήμα Εφαρμοσμένης Πληροφορικής.
Ενότητα 1: Εισαγωγή-Υλοποίηση του ΑΤΔ Σύνολο με Πίνακα Καθηγήτρια Μαρία Σατρατζέμη Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης Creative Commons. Για εκπαιδευτικό υλικό, όπως εικόνες,
Βασικές Δομές Δεδομένων
Βασικές Δομές Δεδομένων Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: Αφηρημένοι Τύποι Δεδομένων Οι ΑΤΔ Στοίβα και Ουρά Υλοποίηση των ΑΤΔ Στοίβα και Ουρά με Διαδοχική και Δυναμική Χορήγηση
Διάλεξη 07: Λίστες Ι Υλοποίηση & Εφαρμογές
Διάλεξη 07: Λίστες Ι Υλοποίηση & Εφαρμογές Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: Ευθύγραμμες Απλά Συνδεδεμένες Λίστες (εισαγωγή, εύρεση, διαγραφή) Ευθύγραμμες Διπλά Συνδεδεμένες Λίστες
ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος 2001-2002 ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #4
ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος 2001-2002 ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #4 «Προγραμματισμός Η/Υ» - Τετράδιο Εργαστηρίου #4 2 Γενικά Στο Τετράδιο #4 του Εργαστηρίου θα αναφερθούμε σε θέματα διαχείρισης πινάκων
ιαφάνειες παρουσίασης #5 (β)
ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΕΣ ΤΕΧΝΙΚΕΣ http://www.softlab.ntua.gr/~nickie/courses/progtech/ ιδάσκοντες: Γιάννης Μαΐστρος (maistros@cs.ntua.gr) Στάθης Ζάχος (zachos@cs.ntua.gr) (nickie@softlab.ntua.gr) ιαφάνειες παρουσίασης
Διάλεξη 21η: Απλά Συνδεδεμένες Λίστες
Διάλεξη 21η: Απλά Συνδεδεμένες Λίστες Τμήμα Επιστήμης Υπολογιστών, Πανεπιστήμιο Κρήτης Εισαγωγή στην Επιστήμη Υπολογιστών Πρατικάκης (CSD) Απλές Λίστες CS100, 2015-2016 1 / 10 Δομές δεδομένων Ορισμός:
Οι βασικές λειτουργίες (ή πράξεις) που γίνονται σε μια δομή δεδομένων είναι:
ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ Μια δομή δεδομένων στην πληροφορική, συχνά αναπαριστά οντότητες του φυσικού κόσμου στον υπολογιστή. Για την αναπαράσταση αυτή, δημιουργούμε πρώτα ένα αφηρημένο μοντέλο στο οποίο προσδιορίζονται
Φροντιστήριο 4 Σκελετοί Λύσεων
Φροντιστήριο 4 Σκελετοί Λύσεων Άσκηση 1 Υποθέτουμε πως οι λίστες είναι υλοποιημένες χρησιμοποιώντας τις πιο κάτω δομές. typedef struct Node{ type data; struct node *next; node; node *top; list; Υλοποιούμε
Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ
Διάλεξη 8: Αφηρημένοι Τύποι Δεδομένων Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: Αφηρημένοι Τύποι Δεδομένων (ΑΤΔ) Οι ΑΤΔ Στοίβα και Ουρά Υλοποίηση των ΑΤΔ Στοίβα και Ουρά με Στατική Δέσμευση
ΠΙ Ν Α Κ Ε Σ (arrays)
ΠΙ Ν Α Κ Ε Σ (arrays) ΤΑΞΙΝΟΜΗΣΗ Η μέθοδος της φυσαλίδας (bubble sort) Η μέθοδος της επιλογής (selection) Η μέθοδος της γρήγορης ταξινόμησης (quicksort) Η μέθοδος της συγχώνευσης (merge sort) ΠΙ Ν Α Κ
Ενότητα 2: Στοίβες Ουρές - Λίστες Ασκήσεις και Λύσεις
Ενότητα 2: Στοίβες Ουρές - Λίστες Ασκήσεις και Λύσεις Άσκηση 1 Έστω ότι µια βιβλιοθήκη σας παρέχει πρόσβαση σε στοίβες ακεραίων. Η βιβλιοθήκη σας επιτρέπει να ορίσετε µια στοίβα και να καλέσετε τις 5 βασικές
ΑΡ Χ Ε Ι Α Κ Ε Ι Μ Ε Ν Ο Υ (text files)
ΑΡ Χ Ε Ι Α Κ Ε Ι Μ Ε Ν Ο Υ (text files) Αρχείο είναι μια συλλογή δεδομένων του ίδιου τύπου. Ενα αρχείο αποθηκεύεται στην περιφερειακή μνήμη (σκληρό δίσκο, δισκέττα). Τα αρχεία είναι μόνιμα. Τα δεδομένα
Διδάσκων: Παναγιώτης Ανδρέου
Διάλεξη 12: Δέντρα ΙΙ -Δυαδικά Δέντρα Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: - Δυαδικά Δένδρα - Δυαδικά Δένδρα Αναζήτησης(ΔΔΑ) - Εύρεση Τυχαίου, Μέγιστου, Μικρότερου στοιχείου - Εισαγωγή
Δομές Δεδομένων. Ενότητα 10: Πλήρη Δυαδικά Δέντρα, Μέγιστα/Ελάχιστα Δέντρα & Εισαγωγή στο Σωρό- Ο ΑΤΔ Μέγιστος Σωρός. Καθηγήτρια Μαρία Σατρατζέμη
Ενότητα 10: Πλήρη Δυαδικά Δέντρα, Μέγιστα/Ελάχιστα Δέντρα & Εισαγωγή στο Σωρό- Ο ΑΤΔ Μέγιστος Σωρός Καθηγήτρια Μαρία Σατρατζέμη Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης Creative
Κεφάλαιο 12 : ΥΠΟΠΡΟΓΡΑΜΜΑΤΑ
ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Κεφάλαιο 12 : ΥΠΟΠΡΟΓΡΑΜΜΑΤΑ 1. Συναρτήσεις ΣΥΝΑΡΤΗΣΕΙΣ 1.1. Ο λόγος ύπαρξης των συναρτήσεων Όπως είδαµε µία διαδικασία µπορεί να υπολογίζει περισσότερα από ένα αποτελέσµατα τα
Αναδροµή. Σε αυτήν την (βοηθητική) ενότητα θα µελετηθούν τα εξής : Η έννοια της αναδροµής Υλοποίηση και αποδοτικότητα Αφαίρεση της αναδροµής
Αναδροµή Σε αυτήν την (βοηθητική) ενότητα θα µελετηθούν τα εξής : Η έννοια της αναδροµής Υλοποίηση και αποδοτικότητα Αφαίρεση της αναδροµής 1 Αναδροµή Βασική έννοια στα Μαθηµατικά και στην Πληροφορική.
Αναδροµή (Recursion) ύο παρεξηγήσεις. Σκέψου Αναδροµικά. Τρίγωνο Sierpinski Μη αναδροµικός ορισµός;
Αναδροµή (Recursion) Πώς να λύσουµε ένα πρόβληµα κάνοντας λίγη δουλειά και ανάγοντας το υπόλοιπο να λυθεί µε τον ίδιο τρόπο. Πού χρειάζεται; Πολλές µαθηµατικές συναρτήσεις ορίζονται αναδροµικά. εν είναι
Κατ οίκον Εργασία 3 Σκελετοί Λύσεων
Άσκηση 1 Χρησιµοποιούµε τη δοµή Κατ οίκον Εργασία 3 Σκελετοί Λύσεων typedef struct Node int data; struct node *lchild; struct node *rbro; node; και υποθέτουµε πως ένα τυχαίο δένδρο είναι υλοποιηµένο ως
Βασικές οµές εδοµένων
Βασικές οµές εδοµένων Στην ενότητα αυτή θα µελετηθούν τα εξής επιµέρους θέµατα: Αφηρηµένοι Τύποι εδοµένων Οι ΑΤ Στοίβα και Ουρά Υλοποίηση των ΑΤ Στοίβα και Ουρά µε ιαδοχική και υναµική Χορήγηση Μνήµης
Διάλεξη 05: Αφηρημένοι Τύποι Δεδομένων
Διάλεξη 05: Αφηρημένοι Τύποι Δεδομένων Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: Αφηρημένοι Τύποι Δεδομένων (ΑΤΔ) Οι ΑΤΔ Στοίβα και Ουρά Υλοποίηση των ΑΤΔ Στοίβα και Ουρά ΕΠΛ231 Δομές Δεδομένων
Ενότητα 7 Ουρές Προτεραιότητας
Ενότητα Ουρές Προτεραιότητας ΗΥ4 - Παναγιώτα Φατούρου Ουρές Προτεραιότητας Θεωρούµε ένα χώρο κλειδιών U και έστω ότι µε κάθε κλειδί Κ (τύπου Key) έχει συσχετισθεί κάποια πληροφορία Ι (τύπου Type). Έστω
Κατ οίκον Εργασία 3 Σκελετοί Λύσεων
Κατ οίκον Εργασία 3 Σκελετοί Λύσεων Άσκηση 1 (α) Έστω Α(n) και Κ(n) ο αριθμός των ακμών και ο αριθμός των κόμβων ενός αυστηρά δυαδικού δένδρου με n φύλλα. Θέλουμε να αποδείξουμε για κάθε n 1 την πρόταση
ΠΛΗΡΟΦΟΡΙΑΚΑ & ΤΗΛΕΠΙΚΟΙΝΩΝΙΑΚΑ ΣΥΣΤΗΜΑΤΑ
Οικονοµικό Πανεπιστήµιο Αθηνών Τµήµα ιοικητικής Επιστήµης & Τεχνολογίας ΠΛΗΡΟΦΟΡΙΑΚΑ & ΤΗΛΕΠΙΚΟΙΝΩΝΙΑΚΑ ΣΥΣΤΗΜΑΤΑ Κεφάλαιο 8 Προχωρηµένα Θέµατα Προγραµµατισµού C Γιώργος Γιαγλής Περίληψη Κεφαλαίου 8 Προχωρηµένα
υναµική έσµευση Μνήµης (συν.) ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 2 Εφαρµογή
υναµική έσµευση Μνήµης (συν.) Στην ενότητα αυτή θα µελετηθούν: Μια εφαρµογή συνδεδεµένων λιστών ιπλά συνδεδεµένες Λίστες ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 1 Εφαρµογή Ζητούµενο: Πρόγραµµα που παίρνει σαν
ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 5. Αφηρημένοι Τύποι Δεδομένων / Στοίβες και Ουρές
ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 5. Αφηρημένοι Τύποι Δεδομένων / Στοίβες και Ουρές ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 2 Διάλεξη 05: Αφηρημένοι Τύποι Δεδομένων Στην ενότητα αυτή θα μελετηθούν τα
διεύθυνση πρώτου στοιχείου διεύθυνση i-οστού στοιχείου T t[n]; &t[0] είναι t &t[i] είναι t + i*sizeof(t)
Προγραµµατισµός Ι (ΗΥ120) ιάλεξη 18: ιασυνδεµένες οµές - Λίστες ιασυνδεδεµένες δοµές δεδοµένων Η µνήµη ενός πίνακα δεσµεύεται συνεχόµενα. Η πρόσβαση στο i-οστό στοιχείο είναι άµεσηκαθώς η διεύθυνση του
Α Β Γ static; printf("%c\n", putchar( A +1)+2); B DB BD. int i = 0; while (++i); printf("*");
ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ Εξετάσεις Α Περιόδου 2016 (1/2/2016) ΟΝΟΜΑΤΕΠΩΝΥΜΟ:................................................................................ Α.Μ.:...............................................
Στοίβες με Δυναμική Δέσμευση Μνήμης
ΕΠΛ 231 ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΚΑΙ ΑΛΓΟΡΙΘΜΟΙ 10/02/10 Παύλος Αντωνίου Στοίβες με Δυναμική Δέσμευση Μνήμης Στοίβα: Στοίβα είναι μια λίστα που έχει ένα επιπλέον περιορισμό. Ο περιορισμός είναι ότι οι εισαγωγές
Δομές Δεδομένων. Ενότητα 3: Ουρές Εισαγωγή-Υλοποίηση ΑΤΔ Ουρά με πίνακα. Καθηγήτρια Μαρία Σατρατζέμη. Τμήμα Εφαρμοσμένης Πληροφορικής.
Ενότητα 3: Ουρές Εισαγωγή-Υλοποίηση ΑΤΔ Ουρά με πίνακα Καθηγήτρια Μαρία Σατρατζέμη Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης Creative Commons. Για εκπαιδευτικό υλικό, όπως εικόνες,
Πανεπιστήµιο Θεσσαλίας, THMMY HY120, Σεπτέµβριος 2015 ΟΝΟΜΑΤΕΠΩΝΥΜΟ:
ΟΝΟΜΑΤΕΠΩΝΥΜΟ: AEM: ΜΕΡΟΣ Α: ΕΡΩΤΗΣΕΙΣ ΠΟΛΛΑΠΛΩΝ ΕΠΙΛΟΓΩΝ [15 µονάδες] ΣΗΜΑΝΤΙΚΕΣ ΔΙΕΥΚΡΙΝΙΣΕΙΣ: Επιλέξτε ΜΙΑ σωστή απάντηση για κάθε ερώτηση. Λάθος απαντήσεις βαθµολογούνται αρνητικά Σε ερωτήσεις που
Σκοπός. Εργαστήριο 6 Εντολές Επανάληψης
Εργαστήριο 6 Εντολές Επανάληψης Η δομή Επιλογής στη PASCAL H δομή Επανάληψης στη PASCAL. Ρεύμα Εισόδου / Εξόδου.. Ρεύμα Εισόδου / Εξόδου. To πρόγραμμα γραφικών gnuplot. Γραφικά στη PASCAL. Σκοπός 6.1 ΕΠΙΔΙΩΞΗ
ΗΥ240: οµές εδοµένων Χειµερινό Εξάµηνο Ακαδηµαϊκό Έτος Παναγιώτα Φατούρου. Προγραµµατιστική Εργασία 3 ο Μέρος
Πανεπιστήµιο Κρήτης, Τµήµα Επιστήµης Υπολογιστών 6 εκεµβρίου 2008 ΗΥ240: οµές εδοµένων Χειµερινό Εξάµηνο Ακαδηµαϊκό Έτος 2008-09 Παναγιώτα Φατούρου Προγραµµατιστική Εργασία 3 ο Μέρος Ηµεροµηνία Παράδοσης:
TO ΥΠΟΠΡΟΓΡΑΜΜΑ ΣΥΝΑΡΤΗΣΗ
Μάθημα 7 - Υποπρογράμματα Εργαστήριο 11 Ο TO ΥΠΟΠΡΟΓΡΑΜΜΑ ΣΥΝΑΡΤΗΣΗ Βασικές Έννοιες: Υποπρόγραμμα, Ανάλυση προβλήματος, top down σχεδίαση, Συνάρτηση, Διαδικασία, Παράμετρος, Κλήση συνάρτησης, Μετάβαση
for for for for( . */
Εισαγωγή Στον Προγραµµατισµό «C» Βρόχοι Επανάληψης Πανεπιστήµιο Πελοποννήσου Τµήµα Πληροφορικής & Τηλεπικοινωνιών Νικόλαος Δ. Τσελίκας Νικόλαος Προγραµµατισµός Δ. Τσελίκας Ι Ο βρόχος for Η εντολή for χρησιµοποιείται
Διασυνδεδεμένες Δομές. Λίστες. Προγραμματισμός II 1
Διασυνδεδεμένες Δομές Λίστες Προγραμματισμός II 1 lalis@inf.uth.gr Διασυνδεδεμένες δομές Η μνήμη ενός πίνακα δεσμεύεται συνεχόμενα η πρόσβαση στο i-οστό στοιχείο είναι άμεση καθώς η διεύθυνση του είναι
#2 Αλγόριθµοι, οµές εδοµένων και Πολυπλοκότητα
#2 Αλγόριθµοι, οµές εδοµένων και Πολυπλοκότητα ηµήτρης Ν. Σερπάνος Εργαστήριο Συστηµάτων Υπολογιστών Τµήµα Ηλεκτρολόγων Μηχ. & Τεχνολογίας Υπολογιστών Αλγόριθµοι, οµές εδοµένων και Πολυπλοκότητα Αλγόριθµοι:
Συλλογές, Στοίβες και Ουρές
Συλλογές, Στοίβες και Ουρές Σε πολλές εφαρμογές μας αρκεί η αναπαράσταση ενός δυναμικού συνόλου με μια δομή δεδομένων η οποία δεν υποστηρίζει την αναζήτηση οποιουδήποτε στοιχείου. Συλλογή (bag) : Επιστρέφει
Κατ οίκον Εργασία 2 Σκελετοί Λύσεων
Κατ οίκον Εργασία 2 Σκελετοί Λύσεων Άσκηση 1 Ο ζητούμενος ΑΤΔ μπορεί να υλοποιηθεί ως μια ακολουθία από στοιχεία τύπου window συνοδευόμενη από τις πράξεις: MakeNewWindow(L,w) Destroy(L,w) SwitchTo(L,w)
ΕΠΛ232 Προγραμματιστικές Τεχνικές και Εργαλεία Δυναμική Δέσμευση Μνήμης και Δομές Δεδομένων (Φροντιστήριο)
ΕΠΛ232 Προγραμματιστικές Τεχνικές και Εργαλεία Δυναμική Δέσμευση Μνήμης και Δομές Δεδομένων (Φροντιστήριο) Τμήμα Πληροφορικής, Πανεπιστήμιο Κύπρου http://www.cs.ucy.ac.cy/courses/epl232 Το μάθημα αυτό
Κεφάλαιο 7: Υποπρογράμματα. Αρχές Γλωσσών Προγραμματισμού και Μεταφραστών
Κεφάλαιο 7: Υποπρογράμματα Αρχές Γλωσσών Προγραμματισμού και Μεταφραστών Ορισμός Αφαίρεση με χρήση υποπρογραμμάτων (subprogram abstraction) είναι η αντιστοίχιση ενός συνόλου εισόδων σε ένα σύνολο εξόδων
Στοιχειώδεις Δομές Δεδομένων
Στοιχειώδεις Δομές Δεδομένων Τύποι δεδομένων στη Java Ακέραιοι (int, long) Αριθμοί κινητής υποδιαστολής (float, double) Χαρακτήρες (char) Δυαδικοί (boolean) Από τους παραπάνω μπορούμε να φτιάξουμε σύνθετους
Αναδρομή (Recursion) Πώς να λύσουμε ένα πρόβλημα κάνοντας λίγη δουλειά και ανάγοντας το υπόλοιπο να λυθεί με τον ίδιο τρόπο.
Αναδρομή (Recursion) Πώς να λύσουμε ένα πρόβλημα κάνοντας λίγη δουλειά και ανάγοντας το υπόλοιπο να λυθεί με τον ίδιο τρόπο. Πού χρειάζεται; Πολλές μαθηματικές συναρτήσεις ορίζονται αναδρομικά. Δεν είναι
Ενότητα 2: Στοίβες Ουρές - Λίστες Ασκήσεις και Λύσεις
Ενότητα 2: Στοίβες Ουρές - Λίστες Ασκήσεις και Λύσεις Άσκηση 1 Έστω ότι μια βιβλιοθήκη σας παρέχει πρόσβαση σε στοίβες ακεραίων. Η βιβλιοθήκη σας επιτρέπει να ορίσετε μια στοίβα και να καλέσετε τις 5 βασικές
Κεφάλαιο 7: Υπορουτίνες
Κεφάλαιο 7: Υπορουτίνες Αρχές Γλωσσών Προγραμματισμού και Μεταφραστών Ορισμός Αφαίρεση με χρήση υπορουτινών (subroutine abstraction) είναι η αντιστοίχιση ενός συνόλου εισόδων σε ένα σύνολο εξόδων που μπορεί
Προγραμματισμός Δομές Δεδομένων
Προγραμματισμός Δομές Δεδομένων Προγραμματισμός Δομές Δεδομένων (Data Structures) Καινούργιοι τύποι δεδομένων που αποτελούνται από την ομαδοποίηση υπαρχόντων τύπων δεδομένων Ομαδοποίηση πληροφορίας που