Λίστες (Lists) Ο ΑΤΔ λίστα είναι µια συλλογή στοιχείων του ίδιου τύπου µε

Μέγεθος: px
Εμφάνιση ξεκινά από τη σελίδα:

Download "Λίστες (Lists) Ο ΑΤΔ λίστα είναι µια συλλογή στοιχείων του ίδιου τύπου µε"

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 ΑΤΔ Συνδεδεμένη Λίστα. Εφαρμογές και Χρήση Λιστών ΛΙΣΤΕΣ Ορισμός ΑΤΔ Λίστα ΑΤΔ Ακολουθιακή Λίστα Διαχείριση Δεικτών και Λιστών στη C ΑΤΔ Συνδεδεμένη Λίστα Υλοποίηση με δείκτες (pointers) Υλοποίηση με πίνακα Εφαρμογές και Χρήση Λιστών Λίστες (Lists) Δεδομένα

Διαβάστε περισσότερα

ΣΤΟΙΒΕΣ (stacks) Σχήµα: Λειτουργία Στοίβας

ΣΤΟΙΒΕΣ (stacks) Σχήµα: Λειτουργία Στοίβας ΣΤΟΙΒΕΣ (stacks) Η στοίβα είναι µια συλλογή δεδοµένων µε γραµµική διάταξη στην οποία όλες οι εισαγωγές και οι διαγραφές γίνονται στο ένα άκρο που λέγεται κορυφή (top) της στοίβας Σχήµα: Λειτουργία Στοίβας

Διαβάστε περισσότερα

2 η Υλοποίηση του ΑΤΔ συνδεδεμένη λίστα με πίνακα Κόμβοι από δεδομένα και θέσεις πίνακα ????

2 η Υλοποίηση του ΑΤΔ συνδεδεμένη λίστα με πίνακα Κόμβοι από δεδομένα και θέσεις πίνακα ???? η Υλοποίηση του ΑΤΔ συνδεδεμένη λίστα με πίνακα Κόμβοι από δεδομένα και θέσεις πίνακα θέση (index) dedomena epomenos lista = 0 1 3 Ελένη Σπύρος Βασίλης -1 1 Στη συνέχεια θα πρέπει να γνωρίζουμε την οργάνωση

Διαβάστε περισσότερα

Οι Πράξεις. 1 η Υλοποίηση του ΑΤΔ: μονά συνδεδεμένη λίστα με δείκτες. Σχεδιασμός: Λίστα με Συνδεδεμένους Κόμβους

Οι Πράξεις. 1 η Υλοποίηση του ΑΤΔ: μονά συνδεδεμένη λίστα με δείκτες. Σχεδιασμός: Λίστα με Συνδεδεμένους Κόμβους Σχεδιασμός: Λίστα με Συνδεδεμένους Κόμβους Κάθε στοιχείο του ΑΤΔ συνδεδεμένη λίστα (linked list) καλείται κόμβος (node) και περιέχει δύο πεδία Στο ένα πεδίο αποθηκεύονται τα δεδομένα και Στο άλλο αποθηκεύεται

Διαβάστε περισσότερα

Σχεδιασμός: Λίστα με Συνδεδεμένους Κόμβους

Σχεδιασμός: Λίστα με Συνδεδεμένους Κόμβους Σχεδιασμός: Λίστα με Συνδεδεμένους Κόμβους Κάθε στοιχείο του ΑΤΔ συνδεδεμένη λίστα (linked list) καλείται κόμβος (node) και περιέχει δύο πεδία. Στο ένα πεδίο αποθηκεύονται τα δεδομένα και Στο άλλο αποθηκεύεται

Διαβάστε περισσότερα

Δομές Δεδομένων και Τεχνικές Προγραμματισμού Ενότητα 4: ΑΤΔ Λίστα. Ιωάννης Κοτρώνης Σχολή Θετικών Επιστημών Τμήμα Πληροφορικής και Τηλεπικοινωνιών

Δομές Δεδομένων και Τεχνικές Προγραμματισμού Ενότητα 4: ΑΤΔ Λίστα. Ιωάννης Κοτρώνης Σχολή Θετικών Επιστημών Τμήμα Πληροφορικής και Τηλεπικοινωνιών Δομές Δεδομένων και Τεχνικές Προγραμματισμού Ενότητα 4: ΑΤΔ Λίστα Ιωάννης Κοτρώνης Σχολή Θετικών Επιστημών Τμήμα Πληροφορικής και Τηλεπικοινωνιών Σκοποί ενότητας Ορίζει τον ΑΤΔ Λίστα Να αναδείξει το πρόβλημα

Διαβάστε περισσότερα

Ουρές (Queues) FIFO A B C. Διαγραφή. Εισαγωγή. εµπρός. πίσω. πίσω. πίσω

Ουρές (Queues) FIFO A B C. Διαγραφή. Εισαγωγή. εµπρός. πίσω. πίσω. πίσω εµπρός Ουρές (Queues) A B C FIFO εµπρός πίσω B C Διαγραφή εµπρός πίσω B C D E Εισαγωγή πίσω Ορισµός Η ουρά είναι µια γραµµική λίστα στην οποία η διαγραφή ενός στοιχείου γίνεται στο ένα άκρο το οποίο καλείται

Διαβάστε περισσότερα

ΕΠΛ232: Εργαστήριο 2

ΕΠΛ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) µιας µεταβλητής (σε µια γλώσσα προγραµµατισµού) είναι το σύνολο των τιµών που µπορεί να πάρει η µεταβλητή. Tύπος δεδοµένων (data type) µιας µεταβλητής (σε µια γλώσσα προγραµµατισµού) είναι το σύνολο των τιµών που µπορεί να πάρει η µεταβλητή. Αφηρηµένος τύπος δεδοµένων (abstract data type): είναι ένα θεωρητικό

Διαβάστε περισσότερα

ΣΥΜΒΟΛΟΣΕΙΡΕΣ (Strings) Ο ΑΤΔ Συµβολοσειρά Μία συµβολοσειρά είναι µία ακολουθία χαρακτήρων. Bασικές πράξεις : 1. Δηµιουργία. 2. Μήκος. 3.

ΣΥΜΒΟΛΟΣΕΙΡΕΣ (Strings) Ο ΑΤΔ Συµβολοσειρά Μία συµβολοσειρά είναι µία ακολουθία χαρακτήρων. Bασικές πράξεις : 1. Δηµιουργία. 2. Μήκος. 3. ΣΥΜΒΟΛΟΣΕΙΡΕΣ (Strings) Ο ΑΤΔ Συµβολοσειρά Μία συµβολοσειρά είναι µία ακολουθία χαρακτήρων Bασικές πράξεις : 1. Δηµιουργία 2. Μήκος 3. Ανάκτηση 4. Προσάρτηση 5. Διαγραφή 6. Αντιγραφή 7. Συνένωση 8. Αναζήτηση

Διαβάστε περισσότερα

Δυαδικά Δέντρα Αναζήτησης (Binary Search Trees) Ορισμός : Ένα δυαδικό δέντρο αναζήτησης t είναι ένα δυαδικό δέντρο, το οποίο είτε είναι κενό είτε:

Δυαδικά Δέντρα Αναζήτησης (Binary Search Trees) Ορισμός : Ένα δυαδικό δέντρο αναζήτησης t είναι ένα δυαδικό δέντρο, το οποίο είτε είναι κενό είτε: Δυαδικά Δέντρα Αναζήτησης (Binary Search Trees) Ορισμός : Ένα δυαδικό δέντρο αναζήτησης t είναι ένα δυαδικό δέντρο, το οποίο είτε είναι κενό είτε: (i) όλα τα περιεχόμενα στο αριστερό υποδέντρο του t είναι

Διαβάστε περισσότερα

Δρ. Πέτρος Παναγή B123

Δρ. Πέτρος Παναγή B123 Δρ. Πέτρος Παναγή petrosp@cs.ucy.ac.cy B123 1 ΣΥΜΒΟΛΟΣΕΙΡΕΣ (Strings) Ο ΑΤΔ Συμβολοσειρά Μία συμβολοσειρά είναι μία συλλογή χαρακτήρων με διάταξη Bασικές πράξεις : (Είναιτοελάχιστοδυνατόσύνολοπράξεων)

Διαβάστε περισσότερα

ΟιβασικέςπράξειςπουορίζουντονΑΤΔ δυαδικό δέντρο αναζήτησης είναι οι ακόλουθες:

ΟιβασικέςπράξειςπουορίζουντονΑΤΔ δυαδικό δέντρο αναζήτησης είναι οι ακόλουθες: Δυαδικά Δέντρα Αναζήτησης (Binary Search Trees) Ορισμός : Ένα δυαδικό δέντρο αναζήτησης t είναι ένα δυαδικό δέντρο, το οποίο είτε είναι κενό είτε: (i) όλα τα περιεχόμενα στο αριστερό υποδέντρο του t είναι

Διαβάστε περισσότερα

Επισκόπηση Μαθήματος. Γραμμικές Δομές Δεδομένων. ΑΤΔ Ουρά Εναλλακτικοί Σχεδιασμοί Προγραμματισμός με Ενότητες Interface.h Implementation.

Επισκόπηση Μαθήματος. Γραμμικές Δομές Δεδομένων. ΑΤΔ Ουρά Εναλλακτικοί Σχεδιασμοί Προγραμματισμός με Ενότητες Interface.h Implementation. Γραμμικές Δομές Δεδομένων Επισκόπηση Μαθήματος Συλλογή δεδομένων στη σειρά (ολική διάταξη). Προσθέτουμε δεδομένα στη Δομή (μεγαλώνει) ή αφαιρούμε δεδομένα (μικραίνει) Αν περιορίσουμε τις πράξεις Στην Αρχή

Διαβάστε περισσότερα

Γραμμικές Δομές Δεδομένων

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

Διαβάστε περισσότερα

Δέντρα (Trees) - Ιεραρχική Δομή

Δέντρα (Trees) - Ιεραρχική Δομή Δέντρα (Trees) - Ιεραρχική Δομή Εφαρμογές Δομή Οργάνωση Αρχείων Οργανογράμματα Ορισμός (αναδρομικός ορισμός): Ένα δέντρο είναι ένα πεπερασμένο σύνολο κόμβων το οποίο είτε είναι κενό είτε μη κενό σύνολο

Διαβάστε περισσότερα

ρίζα E F G H I J επίπεδο 1

ρίζα E F G H I J επίπεδο 1 Δέντρα (Trees) Ορισµός: Ενα δέντρο είναι ένα πεπερασµένο µη κενό σύνολο κόµβων τέτοιο ώστε: 1.Yπάρχει ένας µοναδικός κόµβος, που καλείται ρίζα, ο οποίος δεν έχει προηγούµενο. 2.Οι υπόλοιποι κόµβοι χωρίζονται

Διαβάστε περισσότερα

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

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

Διαβάστε περισσότερα

Δομές Δεδομένων και Τεχνικές Προγραμματισμού Ενότητα 3: ΑΤΔ Ουρά. Ιωάννης Κοτρώνης Σχολή Θετικών Επιστημών Τμήμα Πληροφορικής και Τηλεπικοινωνιών

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

Διαβάστε περισσότερα

ΠΛΗΡΟΦΟΡΙΑΚΑ & ΤΗΛΕΠΙΚΟΙΝΩΝΙΑΚΑ ΣΥΣΤΗΜΑΤΑ

ΠΛΗΡΟΦΟΡΙΑΚΑ & ΤΗΛΕΠΙΚΟΙΝΩΝΙΑΚΑ ΣΥΣΤΗΜΑΤΑ Οικονοµικό Πανεπιστήµιο Αθηνών Τµήµα ιοικητικής Επιστήµης & Τεχνολογίας ΠΛΗΡΟΦΟΡΙΑΚΑ & ΤΗΛΕΠΙΚΟΙΝΩΝΙΑΚΑ ΣΥΣΤΗΜΑΤΑ Κεφάλαιο 9 οµές εδοµένων σε C Γιώργος Γιαγλής Περίληψη Κεφαλαίου 9 οµές εδοµένων υναµικές

Διαβάστε περισσότερα

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

Δομές Δεδομένων. Ενότητα 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)

ΣΤΟΙΒΑ ΧΑΡΑΚΤΗΡΙΣΤΙΚΗ ΙΔΙΟΤΗΤΑ ΤΗΣ ΣΤΟΙΒΑΣ. Το τελευταίο στοιχείο που εισήχθη θα εξαχθεί πρώτο. Άλλο όνομα L I F O (Last In First Out) ΣΤΟΙΒΑ ΧΑΡΑΚΤΗΡΙΣΤΙΚΗ ΙΔΙΟΤΗΤΑ ΤΗΣ ΣΤΟΙΒΑΣ Το τελευταίο στοιχείο που εισήχθη θα εξαχθεί πρώτο. Άλλο όνομα L I F O (Last In First Out) Χρήσεις Στοίβας Καθημερινή Ζωή (όχι πάρα πολλές) Δίσκοι Τραπεζαρίας

Διαβάστε περισσότερα

Χρήσεις Στοίβας ΣΤΟΙΒΑ. Ορισμός Στοίβας (stack) Βασική Λειτουργικότητα

Χρήσεις Στοίβας ΣΤΟΙΒΑ. Ορισμός Στοίβας (stack) Βασική Λειτουργικότητα ΣΤΟΙΒΑ ΧΑΡΑΚΤΗΡΙΣΤΙΚΗ ΙΔΙΟΤΗΤΑ ΤΗΣ ΣΤΟΙΒΑΣ Το τελευταίο στοιχείο που εισήχθη θα εξαχθεί πρώτο. Άλλο όνομα L I F O (Last In First Out) Χρήσεις Στοίβας Καθημερινή Ζωή (όχι πάρα πολλές) Δίσκοι Τραπεζαρίας

Διαβάστε περισσότερα

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

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

Διαβάστε περισσότερα

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

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

Διαβάστε περισσότερα

ΠΑΡΑΡΤΗΜΑ: QUIZ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ

ΠΑΡΑΡΤΗΜΑ: QUIZ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΠΑΡΑΡΤΗΜΑ: QUIZ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ (Οι ερωτήσεις µε κίτρινη υπογράµµιση είναι εκτός ύλης για φέτος) ΕΙΣΑΓΩΓΗ Q1. Οι Πρωταρχικοί τύποι (primitive types) στη Java 1. Είναι όλοι οι ακέραιοι και όλοι οι πραγµατικοί

Διαβάστε περισσότερα

AVL δέντρα. h L h R. G.M. Adelson_Velkii και E.M. Landis 1962

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: Στοίβες Εισαγωγή-Υλοποίηση ΑΤΔ Στοίβα με Πίνακα-Εφαρμογή Στοίβας: Αντίστροφη Πολωνική Γραφή. Καθηγήτρια Μαρία Σατρατζέμη Ενότητα 2: Στοίβες Εισαγωγή-Υλοποίηση ΑΤΔ Στοίβα με Πίνακα-Εφαρμογή Στοίβας: Αντίστροφη Πολωνική Γραφή Καθηγήτρια Μαρία Σατρατζέμη Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης Creative

Διαβάστε περισσότερα

ΠΛΗ111. Ανοιξη 2005. Μάθηµα 3 ο. Συνδεδεµένες Λίστες. Τµήµα Ηλεκτρονικών Μηχανικών και Μηχανικών Υπολογιστών Πολυτεχνείο Κρήτης

ΠΛΗ111. Ανοιξη 2005. Μάθηµα 3 ο. Συνδεδεµένες Λίστες. Τµήµα Ηλεκτρονικών Μηχανικών και Μηχανικών Υπολογιστών Πολυτεχνείο Κρήτης ΠΛΗ111 οµηµένος Προγραµµατισµός Ανοιξη 2005 Μάθηµα 3 ο Συνδεδεµένες Λίστες Τµήµα Ηλεκτρονικών Μηχανικών και Μηχανικών Υπολογιστών Πολυτεχνείο Κρήτης Ανασκόπηση ΟΑΤ λίστα Ακολουθιακή λίστα Συνδεδεµένη λίστα

Διαβάστε περισσότερα

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

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

Διαβάστε περισσότερα

Εισαγωγή στην C. Μορφή Προγράµµατος σε γλώσσα C

Εισαγωγή στην C. Μορφή Προγράµµατος σε γλώσσα C Εισαγωγή στην C Μορφή Προγράµµατος σε γλώσσα C Τµήµα Α Με την εντολή include συµπεριλαµβάνω στο πρόγραµµα τα πρότυπα των συναρτήσεων εισόδου/εξόδου της C.Το αρχείο κεφαλίδας stdio.h είναι ένας κατάλογος

Διαβάστε περισσότερα

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

Διάλεξη 22: Δυαδικά Δέντρα. Διδάσκων: Παναγιώτης Ανδρέου Διάλεξη 22: Δυαδικά Δέντρα Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: - Δυαδικά Δένδρα - Δυαδικά Δένδρα Αναζήτησης - Πράξεις Εισαγωγής, Εύρεσης Στοιχείου, Διαγραφής Μικρότερου Στοιχείου

Διαβάστε περισσότερα

υαδικό δέντρο έντρα (Trees) -Ιεραρχική οµή

υαδικό δέντρο έντρα (Trees) -Ιεραρχική οµή έντρα (Trees) Ιεραρχική οµή Εφαρµογές οµή Οργάνωση ρχείων Οργανογράµµατα Ορισµός (αναδροµικός ορισµός): Ένα δέντρο είναι ένα πεπερασµένο σύνολο κόµβων το οποίο είτε είναι κενό είτε µη κενό σύνολο τέτοιο

Διαβάστε περισσότερα

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ. ΕΠΛ 035: οµές εδοµένων και Αλγόριθµοι για Ηλεκτρολόγους Μηχανικούς και Μηχανικούς Υπολογιστών

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ. ΕΠΛ 035: οµές εδοµένων και Αλγόριθµοι για Ηλεκτρολόγους Μηχανικούς και Μηχανικούς Υπολογιστών ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΕΠΛ 035: οµές εδοµένων και Αλγόριθµοι για Ηλεκτρολόγους Μηχανικούς και Μηχανικούς Υπολογιστών Ακαδηµαϊκό έτος 2010 2011, Χειµερινό εξάµηνο Ασκήσεις Επανάληψης Ενδιάµεσης

Διαβάστε περισσότερα

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

Διάλεξη 17: Δυαδικά Δέντρα. Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ Διάλεξη 7: Δυαδικά Δέντρα Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: Δυαδικά Δένδρα Δυαδικά Δένδρα Αναζήτησης Πράξεις Εισαγωγής, Εύρεσης Στοιχείου, Διαγραφής Μικρότερου Στοιχείου Διδάσκων:

Διαβάστε περισσότερα

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

Διάλεξη 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); } }

Θεωρητικό Μέρος. 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: ΑΤΔ Στοίβα. Ιωάννης Κοτρώνης Σχολή Θετικών Επιστημών Τμήμα Πληροφορικής και Τηλεπικοινωνιών Δομές Δεδομένων και Τεχνικές Προγραμματισμού Ενότητα 2: ΑΤΔ Στοίβα Ιωάννης Κοτρώνης Σχολή Θετικών Επιστημών Τμήμα Πληροφορικής και Τηλεπικοινωνιών Σκοποί ενότητας Ορίζει τον ΑΤΔ Στοίβα Σχεδιαστικές Επιλογές

Διαβάστε περισσότερα

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

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

Διαβάστε περισσότερα

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

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΕΠΛ 23: οµές εδοµένων και Αλγόριθµοι Ενδιάµεση Εξέταση Ηµεροµηνία : ευτέρα, 3 Νοεµβρίου 2008 ιάρκεια : 2.00-4.00 ιδάσκουσα : Άννα Φιλίππου Ονοµατεπώνυµο: ΣΚΕΛΕΤΟΙ

Διαβάστε περισσότερα

Προγραµµατισµός Ι (ΗΥ120)

Προγραµµατισµός Ι (ΗΥ120) Προγραµµατισµός Ι (ΗΥ120) Διάλεξη 15: Διασυνδεµένες Δοµές - Λίστες Δοµές δεδοµένων! Ένα τυπικό πρόγραµµα επεξεργάζεται δεδοµένα Πώς θα τα διατάξουµε? 2 Τι λειτουργίες θέλουµε να εκτελέσουµε? Πώς θα υλοποιήσουµε

Διαβάστε περισσότερα

ΕΝΟΤΗΤΑ 6 ΛΙΣΤΕΣ ΠΑΡΑΛΕΙΨΗΣ (SKIP LISTS)

ΕΝΟΤΗΤΑ 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,

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 ο. έντρο. Τµήµα Ηλεκτρονικών Μηχανικών και Μηχανικών Υπολογιστών Πολυτεχνείο Κρήτης ΠΛΗ111 οµηµένος Προγραµµατισµός Ανοιξη 2005 Μάθηµα 7 ο έντρο Τµήµα Ηλεκτρονικών Μηχανικών και Μηχανικών Υπολογιστών Πολυτεχνείο Κρήτης έντρο Ορισµός Υλοποίηση µε Πίνακα Υλοποίηση µε είκτες υαδικό έντρο

Διαβάστε περισσότερα

Διάλεξη 11: Φροντιστήριο για Στοίβες. Διδάσκων: Παναγιώτης Ανδρέου. ΕΠΛ035 Δομές Δεδομένων και Αλγόριθμοι για Ηλ. Μηχ. Και Μηχ. Υπολ.

Διάλεξη 11: Φροντιστήριο για Στοίβες. Διδάσκων: Παναγιώτης Ανδρέου. ΕΠΛ035 Δομές Δεδομένων και Αλγόριθμοι για Ηλ. Μηχ. Και Μηχ. Υπολ. Διάλεξη 11: Φροντιστήριο για Στοίβες Διδάσκων: Παναγιώτης Ανδρέου ΕΠΛ035 Δομές Δεδομένων και Αλγόριθμοι για Ηλ. Μηχ. Και Μηχ. Υπολ. 1 ΑΤΔ Στοίβα- Πράξεις Θυμηθείτε τον ΑΤΔ στοίβα με τις πράξεις του: MakeEmptyStack()

Διαβάστε περισσότερα

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

#include <stdlib.h> Α. [-128,127] Β. [-127,128] Γ. [-128,128] ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ Εξετάσεις Α Περιόδου 2017 (27/1/2017) ΟΝΟΜΑΤΕΠΩΝΥΜΟ:................................................................................ Α.Μ.:...............................................

Διαβάστε περισσότερα

ΕΝΤΟΛΕΣ ΕΠΑΝΑΛΗΨΗΣ. for (παράσταση_1; παράσταση_2; παράσταση_3) εντολή επόμενη εντολή

ΕΝΤΟΛΕΣ ΕΠΑΝΑΛΗΨΗΣ. for (παράσταση_1; παράσταση_2; παράσταση_3) εντολή επόμενη εντολή ΕΝΤΟΛΕΣ ΕΠΑΝΑΛΗΨΗΣ for (παράσταση_1; παράσταση_2; παράσταση_3) εντολή επόμενη εντολή παράσταση_1 = Παράσταση Αρχικοποίησης παράσταση_2 = Παράσταση Ελέγχου Επανάληψης παράσταση_3 = Παράσταση Ενημέρωσης

Διαβάστε περισσότερα

ΠΛΗ111. Ανοιξη Μάθηµα 5 ο. Ουρά. Τµήµα Ηλεκτρονικών Μηχανικών και Μηχανικών Υπολογιστών Πολυτεχνείο Κρήτης

ΠΛΗ111. Ανοιξη Μάθηµα 5 ο. Ουρά. Τµήµα Ηλεκτρονικών Μηχανικών και Μηχανικών Υπολογιστών Πολυτεχνείο Κρήτης ΠΛΗ οµηµένος Προγραµµατισµός Ανοιξη 5 Μάθηµα 5 ο Ουρά Τµήµα Ηλεκτρονικών Μηχανικών και Μηχανικών Υπολογιστών Πολυτεχνείο Κρήτης Ανασκόπηση Αφηρηµένος Τύπος εδοµένων Ουρά Υλοποίηση µε Κυκλικό Πίνακα Υλοποίηση

Διαβάστε περισσότερα

Φροντιστήριο 4 Σκελετοί Λύσεων

Φροντιστήριο 4 Σκελετοί Λύσεων Φροντιστήριο 4 Σκελετοί Λύσεων 1. Ο ζητούμενος ΑΤΔ μπορεί να υλοποιηθεί ως εξής: (i) Διαδοχική χορήγηση μνήμης Υποθέτουμε ότι οι λίστες μας έχουν μέγιστο μέγεθος max και χρησιμοποιούμε τη δομή type elements[max];

Διαβάστε περισσότερα

ΠΛΗ111. Ανοιξη Μάθηµα 2 ο. Αλγόριθµοι και Αφηρηµένοι Τύποι εδοµένων. Τµήµα Ηλεκτρονικών Μηχανικών και Μηχανικών Υπολογιστών Πολυτεχνείο Κρήτης

ΠΛΗ111. Ανοιξη Μάθηµα 2 ο. Αλγόριθµοι και Αφηρηµένοι Τύποι εδοµένων. Τµήµα Ηλεκτρονικών Μηχανικών και Μηχανικών Υπολογιστών Πολυτεχνείο Κρήτης ΠΛΗ111 οµηµένος Προγραµµατισµός Ανοιξη 2005 Μάθηµα 2 ο Αλγόριθµοι και Αφηρηµένοι Τύποι εδοµένων Τµήµα Ηλεκτρονικών Μηχανικών και Μηχανικών Υπολογιστών Πολυτεχνείο Κρήτης Αλγόριθµοι Ορισµός Παράδειγµα Ασυµπτωτική

Διαβάστε περισσότερα

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

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

Διαβάστε περισσότερα

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

Βασικές Δομές Δεδομένων Βασικές Δομές Δεδομένων Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: Αφηρημένοι Τύποι Δεδομένων Οι ΑΤΔ Στοίβα και Ουρά Υλοποίηση των ΑΤΔ Στοίβα και Ουρά με Διαδοχική και Δυναμική Χορήγηση

Διαβάστε περισσότερα

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

Διάλεξη 07: Λίστες Ι Υλοποίηση & Εφαρμογές Διάλεξη 07: Λίστες Ι Υλοποίηση & Εφαρμογές Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: Ευθύγραμμες Απλά Συνδεδεμένες Λίστες (εισαγωγή, εύρεση, διαγραφή) Ευθύγραμμες Διπλά Συνδεδεμένες Λίστες

Διαβάστε περισσότερα

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος 2001-2002 ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #4

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος 2001-2002 ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #4 ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος 2001-2002 ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #4 «Προγραμματισμός Η/Υ» - Τετράδιο Εργαστηρίου #4 2 Γενικά Στο Τετράδιο #4 του Εργαστηρίου θα αναφερθούμε σε θέματα διαχείρισης πινάκων

Διαβάστε περισσότερα

ιαφάνειες παρουσίασης #5 (β)

ιαφάνειες παρουσίασης #5 (β) ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΕΣ ΤΕΧΝΙΚΕΣ http://www.softlab.ntua.gr/~nickie/courses/progtech/ ιδάσκοντες: Γιάννης Μαΐστρος (maistros@cs.ntua.gr) Στάθης Ζάχος (zachos@cs.ntua.gr) (nickie@softlab.ntua.gr) ιαφάνειες παρουσίασης

Διαβάστε περισσότερα

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

Διάλεξη 21η: Απλά Συνδεδεμένες Λίστες Διάλεξη 21η: Απλά Συνδεδεμένες Λίστες Τμήμα Επιστήμης Υπολογιστών, Πανεπιστήμιο Κρήτης Εισαγωγή στην Επιστήμη Υπολογιστών Πρατικάκης (CSD) Απλές Λίστες CS100, 2015-2016 1 / 10 Δομές δεδομένων Ορισμός:

Διαβάστε περισσότερα

Οι βασικές λειτουργίες (ή πράξεις) που γίνονται σε μια δομή δεδομένων είναι:

Οι βασικές λειτουργίες (ή πράξεις) που γίνονται σε μια δομή δεδομένων είναι: ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ Μια δομή δεδομένων στην πληροφορική, συχνά αναπαριστά οντότητες του φυσικού κόσμου στον υπολογιστή. Για την αναπαράσταση αυτή, δημιουργούμε πρώτα ένα αφηρημένο μοντέλο στο οποίο προσδιορίζονται

Διαβάστε περισσότερα

Φροντιστήριο 4 Σκελετοί Λύσεων

Φροντιστήριο 4 Σκελετοί Λύσεων Φροντιστήριο 4 Σκελετοί Λύσεων Άσκηση 1 Υποθέτουμε πως οι λίστες είναι υλοποιημένες χρησιμοποιώντας τις πιο κάτω δομές. typedef struct Node{ type data; struct node *next; node; node *top; list; Υλοποιούμε

Διαβάστε περισσότερα

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

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ Διάλεξη 8: Αφηρημένοι Τύποι Δεδομένων Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: Αφηρημένοι Τύποι Δεδομένων (ΑΤΔ) Οι ΑΤΔ Στοίβα και Ουρά Υλοποίηση των ΑΤΔ Στοίβα και Ουρά με Στατική Δέσμευση

Διαβάστε περισσότερα

ΠΙ Ν Α Κ Ε Σ (arrays)

ΠΙ Ν Α Κ Ε Σ (arrays) ΠΙ Ν Α Κ Ε Σ (arrays) ΤΑΞΙΝΟΜΗΣΗ Η μέθοδος της φυσαλίδας (bubble sort) Η μέθοδος της επιλογής (selection) Η μέθοδος της γρήγορης ταξινόμησης (quicksort) Η μέθοδος της συγχώνευσης (merge sort) ΠΙ Ν Α Κ

Διαβάστε περισσότερα

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

Ενότητα 2: Στοίβες Ουρές - Λίστες Ασκήσεις και Λύσεις Ενότητα 2: Στοίβες Ουρές - Λίστες Ασκήσεις και Λύσεις Άσκηση 1 Έστω ότι µια βιβλιοθήκη σας παρέχει πρόσβαση σε στοίβες ακεραίων. Η βιβλιοθήκη σας επιτρέπει να ορίσετε µια στοίβα και να καλέσετε τις 5 βασικές

Διαβάστε περισσότερα

ΑΡ Χ Ε Ι Α Κ Ε Ι Μ Ε Ν Ο Υ (text files)

ΑΡ Χ Ε Ι Α Κ Ε Ι Μ Ε Ν Ο Υ (text files) ΑΡ Χ Ε Ι Α Κ Ε Ι Μ Ε Ν Ο Υ (text files) Αρχείο είναι μια συλλογή δεδομένων του ίδιου τύπου. Ενα αρχείο αποθηκεύεται στην περιφερειακή μνήμη (σκληρό δίσκο, δισκέττα). Τα αρχεία είναι μόνιμα. Τα δεδομένα

Διαβάστε περισσότερα

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

Διδάσκων: Παναγιώτης Ανδρέου Διάλεξη 12: Δέντρα ΙΙ -Δυαδικά Δέντρα Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: - Δυαδικά Δένδρα - Δυαδικά Δένδρα Αναζήτησης(ΔΔΑ) - Εύρεση Τυχαίου, Μέγιστου, Μικρότερου στοιχείου - Εισαγωγή

Διαβάστε περισσότερα

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

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

Διαβάστε περισσότερα

Κεφάλαιο 12 : ΥΠΟΠΡΟΓΡΑΜΜΑΤΑ

Κεφάλαιο 12 : ΥΠΟΠΡΟΓΡΑΜΜΑΤΑ ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Κεφάλαιο 12 : ΥΠΟΠΡΟΓΡΑΜΜΑΤΑ 1. Συναρτήσεις ΣΥΝΑΡΤΗΣΕΙΣ 1.1. Ο λόγος ύπαρξης των συναρτήσεων Όπως είδαµε µία διαδικασία µπορεί να υπολογίζει περισσότερα από ένα αποτελέσµατα τα

Διαβάστε περισσότερα

Αναδροµή. Σε αυτήν την (βοηθητική) ενότητα θα µελετηθούν τα εξής : Η έννοια της αναδροµής Υλοποίηση και αποδοτικότητα Αφαίρεση της αναδροµής

Αναδροµή. Σε αυτήν την (βοηθητική) ενότητα θα µελετηθούν τα εξής : Η έννοια της αναδροµής Υλοποίηση και αποδοτικότητα Αφαίρεση της αναδροµής Αναδροµή Σε αυτήν την (βοηθητική) ενότητα θα µελετηθούν τα εξής : Η έννοια της αναδροµής Υλοποίηση και αποδοτικότητα Αφαίρεση της αναδροµής 1 Αναδροµή Βασική έννοια στα Μαθηµατικά και στην Πληροφορική.

Διαβάστε περισσότερα

Αναδροµή (Recursion) ύο παρεξηγήσεις. Σκέψου Αναδροµικά. Τρίγωνο Sierpinski Μη αναδροµικός ορισµός;

Αναδροµή (Recursion) ύο παρεξηγήσεις. Σκέψου Αναδροµικά. Τρίγωνο Sierpinski Μη αναδροµικός ορισµός; Αναδροµή (Recursion) Πώς να λύσουµε ένα πρόβληµα κάνοντας λίγη δουλειά και ανάγοντας το υπόλοιπο να λυθεί µε τον ίδιο τρόπο. Πού χρειάζεται; Πολλές µαθηµατικές συναρτήσεις ορίζονται αναδροµικά. εν είναι

Διαβάστε περισσότερα

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

Κατ οίκον Εργασία 3 Σκελετοί Λύσεων Άσκηση 1 Χρησιµοποιούµε τη δοµή Κατ οίκον Εργασία 3 Σκελετοί Λύσεων typedef struct Node int data; struct node *lchild; struct node *rbro; node; και υποθέτουµε πως ένα τυχαίο δένδρο είναι υλοποιηµένο ως

Διαβάστε περισσότερα

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

Βασικές οµές εδοµένων Βασικές οµές εδοµένων Στην ενότητα αυτή θα µελετηθούν τα εξής επιµέρους θέµατα: Αφηρηµένοι Τύποι εδοµένων Οι ΑΤ Στοίβα και Ουρά Υλοποίηση των ΑΤ Στοίβα και Ουρά µε ιαδοχική και υναµική Χορήγηση Μνήµης

Διαβάστε περισσότερα

Διάλεξη 05: Αφηρημένοι Τύποι Δεδομένων

Διάλεξη 05: Αφηρημένοι Τύποι Δεδομένων Διάλεξη 05: Αφηρημένοι Τύποι Δεδομένων Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: Αφηρημένοι Τύποι Δεδομένων (ΑΤΔ) Οι ΑΤΔ Στοίβα και Ουρά Υλοποίηση των ΑΤΔ Στοίβα και Ουρά ΕΠΛ231 Δομές Δεδομένων

Διαβάστε περισσότερα

Ενότητα 7 Ουρές Προτεραιότητας

Ενότητα 7 Ουρές Προτεραιότητας Ενότητα Ουρές Προτεραιότητας ΗΥ4 - Παναγιώτα Φατούρου Ουρές Προτεραιότητας Θεωρούµε ένα χώρο κλειδιών U και έστω ότι µε κάθε κλειδί Κ (τύπου Key) έχει συσχετισθεί κάποια πληροφορία Ι (τύπου Type). Έστω

Διαβάστε περισσότερα

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

Κατ οίκον Εργασία 3 Σκελετοί Λύσεων Κατ οίκον Εργασία 3 Σκελετοί Λύσεων Άσκηση 1 (α) Έστω Α(n) και Κ(n) ο αριθμός των ακμών και ο αριθμός των κόμβων ενός αυστηρά δυαδικού δένδρου με n φύλλα. Θέλουμε να αποδείξουμε για κάθε n 1 την πρόταση

Διαβάστε περισσότερα

ΠΛΗΡΟΦΟΡΙΑΚΑ & ΤΗΛΕΠΙΚΟΙΝΩΝΙΑΚΑ ΣΥΣΤΗΜΑΤΑ

ΠΛΗΡΟΦΟΡΙΑΚΑ & ΤΗΛΕΠΙΚΟΙΝΩΝΙΑΚΑ ΣΥΣΤΗΜΑΤΑ Οικονοµικό Πανεπιστήµιο Αθηνών Τµήµα ιοικητικής Επιστήµης & Τεχνολογίας ΠΛΗΡΟΦΟΡΙΑΚΑ & ΤΗΛΕΠΙΚΟΙΝΩΝΙΑΚΑ ΣΥΣΤΗΜΑΤΑ Κεφάλαιο 8 Προχωρηµένα Θέµατα Προγραµµατισµού C Γιώργος Γιαγλής Περίληψη Κεφαλαίου 8 Προχωρηµένα

Διαβάστε περισσότερα

υναµική έσµευση Μνήµης (συν.) ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 2 Εφαρµογή

υναµική έσµευση Μνήµης (συν.) ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 2 Εφαρµογή υναµική έσµευση Μνήµης (συν.) Στην ενότητα αυτή θα µελετηθούν: Μια εφαρµογή συνδεδεµένων λιστών ιπλά συνδεδεµένες Λίστες ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 1 Εφαρµογή Ζητούµενο: Πρόγραµµα που παίρνει σαν

Διαβάστε περισσότερα

ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 5. Αφηρημένοι Τύποι Δεδομένων / Στοίβες και Ουρές

ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 5. Αφηρημένοι Τύποι Δεδομένων / Στοίβες και Ουρές ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 5. Αφηρημένοι Τύποι Δεδομένων / Στοίβες και Ουρές ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 2 Διάλεξη 05: Αφηρημένοι Τύποι Δεδομένων Στην ενότητα αυτή θα μελετηθούν τα

Διαβάστε περισσότερα

διεύθυνση πρώτου στοιχείου διεύθυνση i-οστού στοιχείου T t[n]; &t[0] είναι t &t[i] είναι t + i*sizeof(t)

διεύθυνση πρώτου στοιχείου διεύθυνση 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("*");

Α Β Γ 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: Ουρές Εισαγωγή-Υλοποίηση ΑΤΔ Ουρά με πίνακα. Καθηγήτρια Μαρία Σατρατζέμη. Τμήμα Εφαρμοσμένης Πληροφορικής. Ενότητα 3: Ουρές Εισαγωγή-Υλοποίηση ΑΤΔ Ουρά με πίνακα Καθηγήτρια Μαρία Σατρατζέμη Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης Creative Commons. Για εκπαιδευτικό υλικό, όπως εικόνες,

Διαβάστε περισσότερα

Πανεπιστήµιο Θεσσαλίας, THMMY HY120, Σεπτέµβριος 2015 ΟΝΟΜΑΤΕΠΩΝΥΜΟ:

Πανεπιστήµιο Θεσσαλίας, THMMY HY120, Σεπτέµβριος 2015 ΟΝΟΜΑΤΕΠΩΝΥΜΟ: ΟΝΟΜΑΤΕΠΩΝΥΜΟ: AEM: ΜΕΡΟΣ Α: ΕΡΩΤΗΣΕΙΣ ΠΟΛΛΑΠΛΩΝ ΕΠΙΛΟΓΩΝ [15 µονάδες] ΣΗΜΑΝΤΙΚΕΣ ΔΙΕΥΚΡΙΝΙΣΕΙΣ: Επιλέξτε ΜΙΑ σωστή απάντηση για κάθε ερώτηση. Λάθος απαντήσεις βαθµολογούνται αρνητικά Σε ερωτήσεις που

Διαβάστε περισσότερα

Σκοπός. Εργαστήριο 6 Εντολές Επανάληψης

Σκοπός. Εργαστήριο 6 Εντολές Επανάληψης Εργαστήριο 6 Εντολές Επανάληψης Η δομή Επιλογής στη PASCAL H δομή Επανάληψης στη PASCAL. Ρεύμα Εισόδου / Εξόδου.. Ρεύμα Εισόδου / Εξόδου. To πρόγραμμα γραφικών gnuplot. Γραφικά στη PASCAL. Σκοπός 6.1 ΕΠΙΔΙΩΞΗ

Διαβάστε περισσότερα

ΗΥ240: οµές εδοµένων Χειµερινό Εξάµηνο Ακαδηµαϊκό Έτος Παναγιώτα Φατούρου. Προγραµµατιστική Εργασία 3 ο Μέρος

ΗΥ240: οµές εδοµένων Χειµερινό Εξάµηνο Ακαδηµαϊκό Έτος Παναγιώτα Φατούρου. Προγραµµατιστική Εργασία 3 ο Μέρος Πανεπιστήµιο Κρήτης, Τµήµα Επιστήµης Υπολογιστών 6 εκεµβρίου 2008 ΗΥ240: οµές εδοµένων Χειµερινό Εξάµηνο Ακαδηµαϊκό Έτος 2008-09 Παναγιώτα Φατούρου Προγραµµατιστική Εργασία 3 ο Μέρος Ηµεροµηνία Παράδοσης:

Διαβάστε περισσότερα

TO ΥΠΟΠΡΟΓΡΑΜΜΑ ΣΥΝΑΡΤΗΣΗ

TO ΥΠΟΠΡΟΓΡΑΜΜΑ ΣΥΝΑΡΤΗΣΗ Μάθημα 7 - Υποπρογράμματα Εργαστήριο 11 Ο TO ΥΠΟΠΡΟΓΡΑΜΜΑ ΣΥΝΑΡΤΗΣΗ Βασικές Έννοιες: Υποπρόγραμμα, Ανάλυση προβλήματος, top down σχεδίαση, Συνάρτηση, Διαδικασία, Παράμετρος, Κλήση συνάρτησης, Μετάβαση

Διαβάστε περισσότερα

for for for for( . */

for for for for( . */ Εισαγωγή Στον Προγραµµατισµό «C» Βρόχοι Επανάληψης Πανεπιστήµιο Πελοποννήσου Τµήµα Πληροφορικής & Τηλεπικοινωνιών Νικόλαος Δ. Τσελίκας Νικόλαος Προγραµµατισµός Δ. Τσελίκας Ι Ο βρόχος for Η εντολή for χρησιµοποιείται

Διαβάστε περισσότερα

Διασυνδεδεμένες Δομές. Λίστες. Προγραμματισμός II 1

Διασυνδεδεμένες Δομές. Λίστες. Προγραμματισμός II 1 Διασυνδεδεμένες Δομές Λίστες Προγραμματισμός II 1 lalis@inf.uth.gr Διασυνδεδεμένες δομές Η μνήμη ενός πίνακα δεσμεύεται συνεχόμενα η πρόσβαση στο i-οστό στοιχείο είναι άμεση καθώς η διεύθυνση του είναι

Διαβάστε περισσότερα

#2 Αλγόριθµοι, οµές εδοµένων και Πολυπλοκότητα

#2 Αλγόριθµοι, οµές εδοµένων και Πολυπλοκότητα #2 Αλγόριθµοι, οµές εδοµένων και Πολυπλοκότητα ηµήτρης Ν. Σερπάνος Εργαστήριο Συστηµάτων Υπολογιστών Τµήµα Ηλεκτρολόγων Μηχ. & Τεχνολογίας Υπολογιστών Αλγόριθµοι, οµές εδοµένων και Πολυπλοκότητα Αλγόριθµοι:

Διαβάστε περισσότερα

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

Συλλογές, Στοίβες και Ουρές Συλλογές, Στοίβες και Ουρές Σε πολλές εφαρμογές μας αρκεί η αναπαράσταση ενός δυναμικού συνόλου με μια δομή δεδομένων η οποία δεν υποστηρίζει την αναζήτηση οποιουδήποτε στοιχείου. Συλλογή (bag) : Επιστρέφει

Διαβάστε περισσότερα

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

Κατ οίκον Εργασία 2 Σκελετοί Λύσεων Κατ οίκον Εργασία 2 Σκελετοί Λύσεων Άσκηση 1 Ο ζητούμενος ΑΤΔ μπορεί να υλοποιηθεί ως μια ακολουθία από στοιχεία τύπου window συνοδευόμενη από τις πράξεις: MakeNewWindow(L,w) Destroy(L,w) SwitchTo(L,w)

Διαβάστε περισσότερα

ΕΠΛ232 Προγραμματιστικές Τεχνικές και Εργαλεία Δυναμική Δέσμευση Μνήμης και Δομές Δεδομένων (Φροντιστήριο)

ΕΠΛ232 Προγραμματιστικές Τεχνικές και Εργαλεία Δυναμική Δέσμευση Μνήμης και Δομές Δεδομένων (Φροντιστήριο) ΕΠΛ232 Προγραμματιστικές Τεχνικές και Εργαλεία Δυναμική Δέσμευση Μνήμης και Δομές Δεδομένων (Φροντιστήριο) Τμήμα Πληροφορικής, Πανεπιστήμιο Κύπρου http://www.cs.ucy.ac.cy/courses/epl232 Το μάθημα αυτό

Διαβάστε περισσότερα

Κεφάλαιο 7: Υποπρογράμματα. Αρχές Γλωσσών Προγραμματισμού και Μεταφραστών

Κεφάλαιο 7: Υποπρογράμματα. Αρχές Γλωσσών Προγραμματισμού και Μεταφραστών Κεφάλαιο 7: Υποπρογράμματα Αρχές Γλωσσών Προγραμματισμού και Μεταφραστών Ορισμός Αφαίρεση με χρήση υποπρογραμμάτων (subprogram abstraction) είναι η αντιστοίχιση ενός συνόλου εισόδων σε ένα σύνολο εξόδων

Διαβάστε περισσότερα

Στοιχειώδεις Δομές Δεδομένων

Στοιχειώδεις Δομές Δεδομένων Στοιχειώδεις Δομές Δεδομένων Τύποι δεδομένων στη Java Ακέραιοι (int, long) Αριθμοί κινητής υποδιαστολής (float, double) Χαρακτήρες (char) Δυαδικοί (boolean) Από τους παραπάνω μπορούμε να φτιάξουμε σύνθετους

Διαβάστε περισσότερα

Αναδρομή (Recursion) Πώς να λύσουμε ένα πρόβλημα κάνοντας λίγη δουλειά και ανάγοντας το υπόλοιπο να λυθεί με τον ίδιο τρόπο.

Αναδρομή (Recursion) Πώς να λύσουμε ένα πρόβλημα κάνοντας λίγη δουλειά και ανάγοντας το υπόλοιπο να λυθεί με τον ίδιο τρόπο. Αναδρομή (Recursion) Πώς να λύσουμε ένα πρόβλημα κάνοντας λίγη δουλειά και ανάγοντας το υπόλοιπο να λυθεί με τον ίδιο τρόπο. Πού χρειάζεται; Πολλές μαθηματικές συναρτήσεις ορίζονται αναδρομικά. Δεν είναι

Διαβάστε περισσότερα

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

Ενότητα 2: Στοίβες Ουρές - Λίστες Ασκήσεις και Λύσεις Ενότητα 2: Στοίβες Ουρές - Λίστες Ασκήσεις και Λύσεις Άσκηση 1 Έστω ότι μια βιβλιοθήκη σας παρέχει πρόσβαση σε στοίβες ακεραίων. Η βιβλιοθήκη σας επιτρέπει να ορίσετε μια στοίβα και να καλέσετε τις 5 βασικές

Διαβάστε περισσότερα

Κεφάλαιο 7: Υπορουτίνες

Κεφάλαιο 7: Υπορουτίνες Κεφάλαιο 7: Υπορουτίνες Αρχές Γλωσσών Προγραμματισμού και Μεταφραστών Ορισμός Αφαίρεση με χρήση υπορουτινών (subroutine abstraction) είναι η αντιστοίχιση ενός συνόλου εισόδων σε ένα σύνολο εξόδων που μπορεί

Διαβάστε περισσότερα

Προγραμματισμός Δομές Δεδομένων

Προγραμματισμός Δομές Δεδομένων Προγραμματισμός Δομές Δεδομένων Προγραμματισμός Δομές Δεδομένων (Data Structures) Καινούργιοι τύποι δεδομένων που αποτελούνται από την ομαδοποίηση υπαρχόντων τύπων δεδομένων Ομαδοποίηση πληροφορίας που

Διαβάστε περισσότερα