ΗΜΜΥ 1 1 1

243
ΗΜΜΥ 1 ΗΜΜΥ 1 1 1 1 1 ΔΟΜΗΜΕΝΟΣ ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΚΩΣΤΑΣ ΚΟΝΤΟΓΙΑΝΝΗΣ ΚΩΣΤΑΣ ΚΟΝΤΟΓΙΑΝΝΗΣ Αναπληρωτής Καθηγητής Αναπληρωτής Καθηγητής Τμήμα ΗΜΜΥ Τμήμα ΗΜΜΥ Πολυτεχνείο Κρήτης Πολυτεχνείο Κρήτης

Upload: yoshino-gen

Post on 03-Jan-2016

33 views

Category:

Documents


2 download

DESCRIPTION

ΗΜΜΥ 1 1 1. ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΚΩΣΤΑΣ ΚΟΝΤΟΓΙΑΝΝΗΣ Αναπληρωτής Καθηγητής Τμήμα ΗΜΜΥ Πολυτεχνείο Κρήτης. ΚΑΛΩΣ ΗΡΘΑΤΕ !. Καλώς ήρθατε στο Μάθημα «Δομημένος Προγραμματισμός». Αυτό το Μάθημα ουσιαστικά εισάγει έννοιες σχετικές με την σχεδίαση και την κατασκευή λογισμικού. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: ΗΜΜΥ 1 1 1

ΗΜΜΥ 1ΗΜΜΥ 11111

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

ΚΩΣΤΑΣ ΚΟΝΤΟΓΙΑΝΝΗΣΚΩΣΤΑΣ ΚΟΝΤΟΓΙΑΝΝΗΣ

Αναπληρωτής ΚαθηγητήςΑναπληρωτής ΚαθηγητήςΤμήμα ΗΜΜΥ Τμήμα ΗΜΜΥ

Πολυτεχνείο ΚρήτηςΠολυτεχνείο Κρήτης

Page 2: ΗΜΜΥ 1 1 1

ΚΑΛΩΣ ΗΡΘΑΤΕ !ΚΑΛΩΣ ΗΡΘΑΤΕ !

Καλώς ήρθατε στο Μάθημα «Δομημένος Καλώς ήρθατε στο Μάθημα «Δομημένος Προγραμματισμός». Προγραμματισμός».

Αυτό το Μάθημα ουσιαστικά εισάγει Αυτό το Μάθημα ουσιαστικά εισάγει έννοιες σχετικές με την σχεδίαση και την έννοιες σχετικές με την σχεδίαση και την κατασκευή λογισμικού. κατασκευή λογισμικού.

Σας εύχομαι ολόψυχα καλή επιτυχία. Σας εύχομαι ολόψυχα καλή επιτυχία.

Page 3: ΗΜΜΥ 1 1 1

ΛΙΓΑ ΛΟΓΙΑ ΓΙΑ ΕΜΕΝΑΛΙΓΑ ΛΟΓΙΑ ΓΙΑ ΕΜΕΝΑΠτυχίο στά Εφαρμοσμένα Μαθηματικά απο το Παν/μιο Πτυχίο στά Εφαρμοσμένα Μαθηματικά απο το Παν/μιο ΠατρώνΠατρών..Μεταπτυχιακό από το Πανεπιστήμιο Μεταπτυχιακό από το Πανεπιστήμιο Leuven Leuven στό Βέλγιοστό ΒέλγιοΔιδακτορικό από το Πανεπιστήμιο Διδακτορικό από το Πανεπιστήμιο McGillMcGill στόν Καναδά στόν Καναδά..Μεταδιδακτορικό από το Πανεπιστήμιο του Μεταδιδακτορικό από το Πανεπιστήμιο του Toronto Toronto στόν στόν ΚαναδάΚαναδά..Επίκουρος και Αναπληρωτής Καθηγητής στο Επίκουρος και Αναπληρωτής Καθηγητής στο Πανεπιστήμιο Πανεπιστήμιο WaterlooWaterloo στον Καναδά στον Καναδά..Σύμβουλος στο Κέντρο Ανωτάτων Σπουδών της ΙΒΜΣύμβουλος στο Κέντρο Ανωτάτων Σπουδών της ΙΒΜΕπιστημονικός υπεύθυνος σε Ερευνητικά Προγράμματα Επιστημονικός υπεύθυνος σε Ερευνητικά Προγράμματα με την με την IBM, Bell, Nortel.IBM, Bell, Nortel.Βραβείο του Ιδρύματος Ανάπτυξης και Τεχνολογίας της Βραβείο του Ιδρύματος Ανάπτυξης και Τεχνολογίας της Ομοσπονδιακής Κυβέρνησης του Καναδά.Ομοσπονδιακής Κυβέρνησης του Καναδά.

Page 4: ΗΜΜΥ 1 1 1

ΑΝΤΙΚΕΙΜΕΝΟ ΤΟΥ ΜΑΘΗΜΑΤΟΣ (1)ΑΝΤΙΚΕΙΜΕΝΟ ΤΟΥ ΜΑΘΗΜΑΤΟΣ (1)

Καλύτερη γνώση και χρήση της γλώσσας Καλύτερη γνώση και χρήση της γλώσσας CC

Εισαγωγή στόν Δομημένο ΠρογραμματισμόΕισαγωγή στόν Δομημένο Προγραμματισμό

– Έννοιες που χρησιμοποιούνται για τη σχεδίαση Έννοιες που χρησιμοποιούνται για τη σχεδίαση αλγόριθμων και προγραμμάτωναλγόριθμων και προγραμμάτων

– Βασικές Βασικές δομέςδομές (κατασκευές) για την υλοποίηση (κατασκευές) για την υλοποίηση προγραμμάτωνπρογραμμάτων

– Απόκτηση εμπειρίας στο προγραμματισμό απλών Απόκτηση εμπειρίας στο προγραμματισμό απλών εφαρμογώνεφαρμογών

Page 5: ΗΜΜΥ 1 1 1

ΑΝΤΙΚΕΙΜΕΝΟ ΤΟΥ ΜΑΘΗΜΑΤΟΣ (2)ΑΝΤΙΚΕΙΜΕΝΟ ΤΟΥ ΜΑΘΗΜΑΤΟΣ (2)

Εβδομάδα 1 Ανασκόπηση της C - Δομή Προγράμματος – Εντολές

Εβδομάδα 2 Διατάξεις (με χρήση αρχείων) και πολυδιάστατοι πίνακες

Εβδομάδα 3 Δομές (με διαχείρηση μνήμης)

Εβδομάδα 4 Αλγόριθμοι

Εβδομάδα 5 Διασυνδεμένες Λίστες

Εβδομάδα 6 Ταξινόμηση

Εβδομάδα 7 Αφηρημένοι Τύποι Δεδομένων - Εισαγωγή σε Οντοκεντρικό Προγραμματισμό

Εβδομάδα 8 Στοίβες (με υλοποίηση διάταξης και διασυνδεμένης λίστας)

Εβδομάδα 9 Ουρές (με υλοποίηση διάταξης και δισυνδεμένης λίστας)

Εβδομάδα 10 Δυαδικά Δένδρα

Εβδομάδα 11 Πολυπλοκότητα

Εβδομάδα 12 Ανασκόπηση

Page 6: ΗΜΜΥ 1 1 1

ΣΤΟΙΧΕΙΑ ΓΙΑ ΤΟ ΜΑΘΗΜΑ (1)ΣΤΟΙΧΕΙΑ ΓΙΑ ΤΟ ΜΑΘΗΜΑ (1)

Το πρόγραμμαΤο πρόγραμμα::

– ΔιαλέξειςΔιαλέξεις (Στό Ξύλινο) (Στό Ξύλινο)Πέμπτη 10Πέμπτη 10::00 – 1200 – 12::0000Παρασκευή 1Παρασκευή 155:00 – 1:00 – 166:00:00Πέμπτη 12Πέμπτη 12::00 – 1300 – 13::0000 (Ώρα γραφείου) (Ώρα γραφείου)

– ΦροντιστήριοΦροντιστήριο (Στό Ξύλινο) (Στό Ξύλινο)Παρασκευή 1Παρασκευή 16:6:00 – 100 – 17:7:0000

– ΕργαστήριαΕργαστήρια (Στό Μηχανογραφικό Κέντρο) (Στό Μηχανογραφικό Κέντρο)Τρίτη 17:00 – 19:00Τρίτη 17:00 – 19:00Τετάρτη 17Τετάρτη 17::00 – 1900 – 19::0000

Page 7: ΗΜΜΥ 1 1 1

ΣΤΟΙΧΕΙΑ ΓΙΑ ΤΟ ΜΑΘΗΜΑ (2)ΣΤΟΙΧΕΙΑ ΓΙΑ ΤΟ ΜΑΘΗΜΑ (2)

ΒοηθοίΒοηθοί

Όνομ/πώνυμοΌνομ/πώνυμο E-mailE-mail ΤηλέφωνοΤηλέφωνο

κοςκος. . Γ. ΜαραγκουδάκηςΓ. Μαραγκουδάκης [email protected]@ced.tuc.gr 3739037390

κος. Γ. Ανέστηςκος. Γ. Ανέστης [email protected]@ced.tuc.gr 3739537395

κος. Χ. Σμαραγδάκηςκος. Χ. Σμαραγδάκης [email protected]@softnet.tuc.gr 3720837208

κα. Γ. Αδαμοπούλουκα. Γ. Αδαμοπούλου [email protected]@intelligence.tuc.gr 3737537375

Page 8: ΗΜΜΥ 1 1 1

ΣΤΟΙΧΕΙΑ ΓΙΑ ΤΟ ΜΑΘΗΜΑ (3)ΣΤΟΙΧΕΙΑ ΓΙΑ ΤΟ ΜΑΘΗΜΑ (3)ΒιβλίαΒιβλία

– «Εγχειρίδιο της «Εγχειρίδιο της CC» » Το βιβλίο που χρησιμοποιήσαμε στο ΗΜΜΥ 101.Το βιβλίο που χρησιμοποιήσαμε στο ΗΜΜΥ 101.

– «Δομές Δεδομένων με «Δομές Δεδομένων με CC»»Το βιβλίο έχει παραγγελθεί και ανατυπώνεται. Η παράδοση του βιβλίου θα γίνεται Το βιβλίο έχει παραγγελθεί και ανατυπώνεται. Η παράδοση του βιβλίου θα γίνεται μόνον από τη Γραμματεία του ΗΜΜΥ και θα πρέπειμόνον από τη Γραμματεία του ΗΜΜΥ και θα πρέπει

1.1. Να έχετε εισαχθεί το 2003Να έχετε εισαχθεί το 20032.2. Να έχετε αριθμό μητρώου ΗΜΜΥ, καίΝα έχετε αριθμό μητρώου ΗΜΜΥ, καί3.3. Να υπογράψετε τη σχετική φόρμα-λίστα πού υπάρχει στη Γραμματεία του ΗΜΜΥ Να υπογράψετε τη σχετική φόρμα-λίστα πού υπάρχει στη Γραμματεία του ΗΜΜΥ

Σημειώσεις και άλλο υλικό γιά το μάθημαΣημειώσεις και άλλο υλικό γιά το μάθημα– Σημειώσεις θα παρουσιάζονται σταδιακά στην Ιστοσελίδα του μαθήματος Σημειώσεις θα παρουσιάζονται σταδιακά στην Ιστοσελίδα του μαθήματος

http://courses.ced.tuc.grhttp://courses.ced.tuc.gr– Ασκήσεις, Φροντηστηριακό υλικό, καί Ανακοινώσεις θα παρουσιάζονται Ασκήσεις, Φροντηστηριακό υλικό, καί Ανακοινώσεις θα παρουσιάζονται

επίσης στην παραπάνω ιστοσελίδαεπίσης στην παραπάνω ιστοσελίδα

Λογαριασμοί για το υπολογιστικό σύστημαΛογαριασμοί για το υπολογιστικό σύστημα (για όσους δεν έχουν) (για όσους δεν έχουν)– Από το Υπολογιστικό Κέντρο με την ταυτότητά σας και τον αριθμό Μητρώου Από το Υπολογιστικό Κέντρο με την ταυτότητά σας και τον αριθμό Μητρώου

του ΗΜΜΥτου ΗΜΜΥ– Υπεύθυνοι για την έκδοση των λογαριασμών στό Υπολογιστικό Κέντρο είναι οιΥπεύθυνοι για την έκδοση των λογαριασμών στό Υπολογιστικό Κέντρο είναι οι

Κα. Κυρούση (εσωτ. 7571)Κα. Κυρούση (εσωτ. 7571)Κος. Μαραγκουδάκης (εσωτ. 7352)Κος. Μαραγκουδάκης (εσωτ. 7352)

– Δήλωση γιά την τήρηση της υπεύθυνης λειτουργίας και χρήσης των Δήλωση γιά την τήρηση της υπεύθυνης λειτουργίας και χρήσης των υπολογιστών και χώρων του Κέντρουυπολογιστών και χώρων του Κέντρου

Page 9: ΗΜΜΥ 1 1 1

ΣΤΟΙΧΕΙΑ ΓΙΑ ΤΟ ΜΑΘΗΜΑ (4)ΣΤΟΙΧΕΙΑ ΓΙΑ ΤΟ ΜΑΘΗΜΑ (4)

Η βαθμολογία θα υπολογίζεται ως εξήςΗ βαθμολογία θα υπολογίζεται ως εξής::– Τελικό διαγώνισμα (50%)Τελικό διαγώνισμα (50%)– Πρόοδος (20%)Πρόοδος (20%)– Τρεις ασκήσεις Τρεις ασκήσεις (30%)(30%)

Άσκηση 1 Άσκηση 1 Άσκηση 2Άσκηση 2Άσκηση 3Άσκηση 3

Εναλλακτικό σχήμα βαθμολογίαςΕναλλακτικό σχήμα βαθμολογίας::– Τελικό διαγώνισμα (70%)Τελικό διαγώνισμα (70%)– Ασκήσεις Ασκήσεις (30%)(30%)

Η Πρόοδος είναι προαιρετική καί γιά την τελική βαθμολογία θα Η Πρόοδος είναι προαιρετική καί γιά την τελική βαθμολογία θα υπολογίζεται ο μεγαλύτερος βαθμός ανάμεσα στα παραπάνω υπολογίζεται ο μεγαλύτερος βαθμός ανάμεσα στα παραπάνω σχήματα βαθμολογίας.σχήματα βαθμολογίας.

Page 10: ΗΜΜΥ 1 1 1

ΕΠΙΚΟΙΝΩΝΙΑΕΠΙΚΟΙΝΩΝΙΑ

Κώστας ΚοντογιάννηςΚώστας Κοντογιάννης

[email protected]@softnet.tuc.gr

Ας Αρχίσουμε λοιπόν......Ας Αρχίσουμε λοιπόν......

Page 11: ΗΜΜΥ 1 1 1

Διαφάνειες παρουσιάσεωνΔιαφάνειες παρουσιάσεων

Η γλώσσα προγραμματισμού Η γλώσσα προγραμματισμού CC

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

Page 12: ΗΜΜΥ 1 1 1

Η ιστορία της Η ιστορία της CC

1969-19731969-1973 AT&T Bell Labs, Dennis RitchieAT&T Bell Labs, Dennis Ritchie19781978 “The C Programming Language”“The C Programming Language”

K&R: Kernighan & RitchieK&R: Kernighan & Ritchie19831983 Σύσταση Σύσταση ANSI Standardization ANSI Standardization

Committee X3J11Committee X3J111989-19901989-1990 Αποδοχή Αποδοχή ANSI/ISO StandardANSI/ISO Standard

ANSI C ANSI C1990-19991990-1999 Αναθεώρηση του Αναθεώρηση του standard standard υπό υπό

εξέλιξη — C9Xεξέλιξη — C9X C99 C99

Page 13: ΗΜΜΥ 1 1 1

Χαρακτηριστικά της Χαρακτηριστικά της CC (i)(i)

Γλώσσα προστακτικού προγραμματισμούΓλώσσα προστακτικού προγραμματισμού

Γλώσσα μετρίου επιπέδουΓλώσσα μετρίου επιπέδου

Οικονομία στην έκφρασηΟικονομία στην έκφραση(λιτή και περιεκτική)(λιτή και περιεκτική)

Σχετικά χαλαρό σύστημα τύπωνΣχετικά χαλαρό σύστημα τύπων

Φιλοσοφία: Φιλοσοφία: ο προγραμματιστής έχει ο προγραμματιστής έχει πλήρη έλεγχο και ευθύνεται για τα πλήρη έλεγχο και ευθύνεται για τα σφάλματά τουσφάλματά του

Page 14: ΗΜΜΥ 1 1 1

Χαρακτηριστικά της Χαρακτηριστικά της CC (ii)(ii)

Ιδιαίτερα δημοφιλής στην πράξηΙδιαίτερα δημοφιλής στην πράξη

Έχει χρησιμοποιηθεί για τον Έχει χρησιμοποιηθεί για τον προγραμματισμό ευρέως φάσματος προγραμματισμό ευρέως φάσματος συστημάτων και εφαρμογώνσυστημάτων και εφαρμογών

Έχει χρησιμοποιηθεί ως βάση για Έχει χρησιμοποιηθεί ως βάση για πληθώρα άλλων γλωσσών: πληθώρα άλλων γλωσσών: C++, JavaC++, Java

Page 15: ΗΜΜΥ 1 1 1

Hello world!Hello world!

#include <stdio.h>#include <stdio.h>

void main ()void main (){{ printf("Hello world!\n");printf("Hello world!\n");}}

ΠαρατηρήσειςΠαρατηρήσεις– Η επικοινωνία με τον «έξω» κόσμο γίνεται μέσω Η επικοινωνία με τον «έξω» κόσμο γίνεται μέσω

της της βιβλιοθήκης συναρτήσεωνβιβλιοθήκης συναρτήσεων– Το σημείο έναρξης του προγράμματος είναι η Το σημείο έναρξης του προγράμματος είναι η

«κύρια» συνάρτηση «κύρια» συνάρτηση mainmain..

Page 16: ΗΜΜΥ 1 1 1

Εκτέλεση προγραμμάτωνΕκτέλεση προγραμμάτων

Πηγαίοςκώδικας(source)

ΜεταγλωττιστήςC (compiler)

Συνδέτης(linker)

Βιβλιοθήκη(library)

Αρχείαεπικεφαλίδας(header files)

Objectcode

Εκτελέσιμοπρόγραμμα(executable)

hello.c

hello.o

hello

printf

stdio.h

Page 17: ΗΜΜΥ 1 1 1

Τύποι δεδομένων (απλοί)Τύποι δεδομένων (απλοί)

Ακέραιοι αριθμοίΑκέραιοι αριθμοίintint charchar

Καθορισμός προσήμανσηςΚαθορισμός προσήμανσηςsignedsigned unsignedunsigned

Καθορισμός μεγέθουςΚαθορισμός μεγέθουςshortshort longlong

Αριθμοί κινητής υποδιαστολήςΑριθμοί κινητής υποδιαστολήςfloatfloat doubledouble

Page 18: ΗΜΜΥ 1 1 1

Πίνακας απλών τύπων Πίνακας απλών τύπων δεδομένωνδεδομένων

char , signed char , unsigned charchar , signed char , unsigned char

signedsigned short short intint , unsigned short , unsigned short intint

signedsigned int , unsigned int int , unsigned int

signedsigned long long intint , unsigned long , unsigned long intint

floatfloat

doubledouble

long doublelong double

Με Με κόκκινοκόκκινο χρώμα όσα μπορούν να παραλειφθούν. χρώμα όσα μπορούν να παραλειφθούν.

Page 19: ΗΜΜΥ 1 1 1

Ορισμός μεταβλητώνΟρισμός μεταβλητώνint x;int x;

int x, y, z;int x, y, z;

double r;double r;

unsigned long abc;unsigned long abc;

ΑρχικοποίησηΑρχικοποίησηint x = 1;int x = 1;

int x, y = 0, z = 2;int x, y = 0, z = 2;

double r = 1.87;double r = 1.87;

unsigned long abc = 42000000;unsigned long abc = 42000000;

Page 20: ΗΜΜΥ 1 1 1

ΣταθερέςΣταθερές (i)(i)

ΑκέραιεςΑκέραιες4242 00 -1-1 δεκαδικέςδεκαδικές

037037 οκταδικέςοκταδικές

00x1fx1f δεκαεξαδικέςδεκαεξαδικές

42U42U 42L42L 42UL42UL unsigned & longunsigned & long

Κινητής υποδιαστολήςΚινητής υποδιαστολής42.042.0 -1.3-1.3 δεκαδικέςδεκαδικές

2.99e82.99e8 με δύναμη του 10με δύναμη του 10

42.0F42.0F 42.0L42.0L float & long doublefloat & long double

Page 21: ΗΜΜΥ 1 1 1

ΣταθερέςΣταθερές (ii)(ii)

ΧαρακτήραΧαρακτήρα'a''a' '0''0' '$''$'

Ειδικοί χαρακτήρεςΕιδικοί χαρακτήρες\\nn αλλαγή γραμμήςαλλαγή γραμμής\'\' απόστροφοςαπόστροφος\\\\ χαρακτήρας χαρακτήρας \\ ( (backslash)backslash)\\tt αλλαγή στήλης (αλλαγή στήλης (tab)tab)\"\" εισαγωγικόεισαγωγικό\0\0 χαρακτήρας με χαρακτήρας με ASCII ASCII = 0 (null)= 0 (null)\037\037 » » με με ASCII ASCII = 37 (οκταδικό)= 37 (οκταδικό)\\x1fx1f » » με με ASCII ASCII = 1f (δεκαεξαδικό)= 1f (δεκαεξαδικό)

Page 22: ΗΜΜΥ 1 1 1

ΣταθερέςΣταθερές (iii)(iii)

ΣυμβολοσειρέςΣυμβολοσειρές"a"abcbc"" "Hello world!\n""Hello world!\n" "a\"51\"""a\"51\""

Δηλώσεις σταθερώνΔηλώσεις σταθερώνconst int size = 10, num = 5;const int size = 10, num = 5;

const double pi = 3.14159;const double pi = 3.14159;

const char newline = '\n';const char newline = '\n';

Page 23: ΗΜΜΥ 1 1 1

ΣχόλιαΣχόλια

Μεταξύ Μεταξύ /*/* και και */*/#include <stdio.h>#include <stdio.h>

/* /* This simple program greets theThis simple program greets the

world by saying "hello"world by saying "hello" */ */

void main ()void main ()

{{

printf( printf( /* /* eh?eh? */ */ "Hello world!\n"); "Hello world!\n");

}}

Το παρακάτω είναι λάθοςΤο παρακάτω είναι λάθος/* /* Nested Nested /* /* comments comments */*/ are wrong!are wrong! */ */

Page 24: ΗΜΜΥ 1 1 1

Εκτύπωση με την Εκτύπωση με την printfprintf

Απλοί τύποι δεδομένωνΑπλοί τύποι δεδομένων– intint %d%d– charchar %c%c– doubledouble %lf%lf– stringstring %s%s

ΠαράδειγμαΠαράδειγμαprintf("%d %lf %c %s\n",printf("%d %lf %c %s\n",42, 1.2, 'a', "hello");42, 1.2, 'a', "hello");

ΑποτέλεσμαΑποτέλεσμα42 1.200000 a hello42 1.200000 a hello

Page 25: ΗΜΜΥ 1 1 1

Εισαγωγή με την Εισαγωγή με την scanfscanf

Ίδιοι κωδικοί για τους απλούς τύπουςΊδιοι κωδικοί για τους απλούς τύπους

ΠαράδειγμαΠαράδειγμαint n;int n;

double d;double d;

char c;char c;

scanf("%d", &n);scanf("%d", &n);

scanf("%lf", &d);scanf("%lf", &d);

scanf("%c", &c);scanf("%c", &c);

Page 26: ΗΜΜΥ 1 1 1

Ένα πιο σύνθετο παράδειγμαΈνα πιο σύνθετο παράδειγμα#include <stdio.h>#include <stdio.h>

void main ()void main (){{int celcius;int celcius;double farenheit;double farenheit;

printf("Give the temperature (C): ");printf("Give the temperature (C): ");scanf("%d", &celcius);scanf("%d", &celcius);farenheit = 9.0 * celcius / 5.0 + 32.0;farenheit = 9.0 * celcius / 5.0 + 32.0;printf("%d degrees Celcius printf("%d degrees Celcius "" "is %lf degrees Farenheit"is %lf degrees Farenheit\n\n",", celcius, farenheit);celcius, farenheit);

}}

Page 27: ΗΜΜΥ 1 1 1

Τελεστές και εκφράσειςΤελεστές και εκφράσεις (i)(i)

Αριθμητικοί τελεστέςΑριθμητικοί τελεστές++ -- ** // %%

Σχεσιακοί τελεστέςΣχεσιακοί τελεστές==== !=!= << >> <=<= >=>=

Λογικοί τελεστέςΛογικοί τελεστές&&&& λογική σύζευξηλογική σύζευξη (και)(και)

|||| λογική διάζευξηλογική διάζευξη (ή)(ή)

!! λογική άρνησηλογική άρνηση (όχι)(όχι)

π.χ.π.χ. ((x % 3 != 0) && !finishedx % 3 != 0) && !finished

Page 28: ΗΜΜΥ 1 1 1

Τελεστές και εκφράσειςΤελεστές και εκφράσεις ((ii)ii)

Τελεστές Τελεστές bit bit προς προς bit (bitwise)bit (bitwise)&& σύζευξη σύζευξη bitbit (AND)(AND)

|| διάζευξη bitδιάζευξη bit (OR)(OR)

^̂ αποκλειστική διάζευξη bitαποκλειστική διάζευξη bit (XOR)(XOR)

~~ άρνησηάρνηση (NOT)(NOT)

<<<< ολίσθηση ολίσθηση bit bit αριστεράαριστερά

>>>> ολίσθηση ολίσθηση bit bit δεξιάδεξιά

ΠαράδειγμαΠαράδειγμα(0x0101 & 0xfff0) << 2(0x0101 & 0xfff0) << 2

0x04000x0400

Page 29: ΗΜΜΥ 1 1 1

Τελεστές και εκφράσειςΤελεστές και εκφράσεις ((iii)iii)

Τελεστής συνθήκηςΤελεστής συνθήκης(a >= b) ? a : b(a >= b) ? a : b

Τελεστής παράθεσηςΤελεστής παράθεσηςa-1, b+5a-1, b+5

Τελεστές ανάθεσηςΤελεστές ανάθεσηςa = b+1a = b+1

a += xa += x ισοδύναμο μεισοδύναμο με a = a + xa = a + x

Τελεστές αύξησης και μείωσηςΤελεστές αύξησης και μείωσηςa++a++ a--a-- τιμή πριν τη μεταβολήτιμή πριν τη μεταβολή

++a++a --a--a τιμή μετά τη μεταβολήτιμή μετά τη μεταβολή

Page 30: ΗΜΜΥ 1 1 1

Eντολές και έλεγχος ροήςEντολές και έλεγχος ροής ((i)i)

Κενή εντολήΚενή εντολή;;

Εντολή έκφρασηςΕντολή έκφρασηςa = b+5;a = b+5;

a++;a++;

Εντολή Εντολή ififif (a >= b)if (a >= b)

max = a;max = a;

elseelse

max = b;max = b;

Page 31: ΗΜΜΥ 1 1 1

Eντολές και έλεγχος ροήςEντολές και έλεγχος ροής ((ii)ii)

Σύνθετη εντολήΣύνθετη εντολή

if (a >= b) {if (a >= b) {min = b;min = b;max = a;max = a;

}}else {else {max = b;max = b;min = a;min = a;

}}

Ορίζει νέα εμβέλειαΟρίζει νέα εμβέλεια

if (x < y) {if (x < y) {

int temp = x;int temp = x;

x = y;x = y;y = temp;y = temp;

}}

Page 32: ΗΜΜΥ 1 1 1

Eντολές και έλεγχος ροήςEντολές και έλεγχος ροής ((iii)iii)

Εντολή Εντολή whilewhileint i = 1, s = 0;int i = 1, s = 0;

while (i <= 10) {while (i <= 10) {

s += i;s += i;

i++;i++;

}}

συνθήκη

εντολή

αληθής

ψευδής

while (συνθήκη) εντολή

Page 33: ΗΜΜΥ 1 1 1

Eντολές και έλεγχος ροήςEντολές και έλεγχος ροής ((iv)iv)

Εντολή do-Εντολή do-whilewhileint i = 1, s = 0;int i = 1, s = 0;

dodo

s += i++;s += i++;

while (i <= 10);while (i <= 10);

συνθήκη

εντολή

ψευδήςαληθής

do εντολήwhile (συνθήκη);

Page 34: ΗΜΜΥ 1 1 1

Eντολές και έλεγχος ροήςEντολές και έλεγχος ροής ((v)v)

Εντολή Εντολή forforint i, s;int i, s;

for (i=1, s=0; i <= 10; i++)for (i=1, s=0; i <= 10; i++)

s += i;s += i;

for (αρχικοποίηση ;συνθήκη ;βήμα)

εντολήσυνθήκη

εντολή

αληθής

ψευδής

βήμα

αρχικοποίηση

Page 35: ΗΜΜΥ 1 1 1

Εντολή Εντολή breakbreakint s;int s;

for (i=0, s=0; i < 10; i++) {for (i=0, s=0; i < 10; i++) {

int x;int x;

scanf("%d", &x);scanf("%d", &x);

s += x;s += x;

}}

printf("Sum is: %d\n", s);printf("Sum is: %d\n", s);

Eντολές και έλεγχος ροήςEντολές και έλεγχος ροής ((vi)vi)

if (x < 0)if (x < 0)

break;break;

Page 36: ΗΜΜΥ 1 1 1

Eντολές και έλεγχος ροήςEντολές και έλεγχος ροής ((vii)vii)

Εντολή Εντολή continuecontinueint s;int s;

for (i=0, s=0; i < 10; i++) {for (i=0, s=0; i < 10; i++) {

int x;int x;

scanf("%d", &x);scanf("%d", &x);

s += x;s += x;

}}

printf("Sum is: %d\n", s);printf("Sum is: %d\n", s);

if (x < 0)if (x < 0)

continue;continue;

Page 37: ΗΜΜΥ 1 1 1

Eντολές και έλεγχος ροήςEντολές και έλεγχος ροής ((viii)viii)

Εντολή Εντολή switchswitch

switch (ch) {switch (ch) { case 'a':case 'a': printf("alpha\n");printf("alpha\n"); break;break; case 'b':case 'b': case 'c':case 'c': printf("beta or c\n");printf("beta or c\n"); break;break; default:default: printf("other\n");printf("other\n");}}

Page 38: ΗΜΜΥ 1 1 1

Eντολές και έλεγχος ροήςEντολές και έλεγχος ροής ((ix)ix)

Ετικέτες και εντολή Ετικέτες και εντολή gotogoto

int i = 1, s = 0;int i = 1, s = 0;

loop:loop:

s += i++;s += i++;

if (i < 10)if (i < 10)

goto loop;goto loop;

printf("The sum is %d\n", s);printf("The sum is %d\n", s);

Όχι Όχι goto: goto: δομημένος προγραμματισμός!δομημένος προγραμματισμός!

Page 39: ΗΜΜΥ 1 1 1

Δομή του προγράμματοςΔομή του προγράμματος

Το πρόγραμμα αποτελείται από:Το πρόγραμμα αποτελείται από:– συναρτήσειςσυναρτήσεις– καθολικές μεταβλητέςκαθολικές μεταβλητές

Διαφορές από την Διαφορές από την Pascal:Pascal:– κύριο πρόγραμμα, διαδικασίες και συναρτήσεις δε κύριο πρόγραμμα, διαδικασίες και συναρτήσεις δε

διαφοροποιούνταιδιαφοροποιούνται– το κύριο πρόγραμμα ονομάζεται το κύριο πρόγραμμα ονομάζεται mainmain– οι διαδικασίες έχουν αποτέλεσμα οι διαδικασίες έχουν αποτέλεσμα voidvoid– όλες οι συναρτήσεις στο ίδιο επίπεδοόλες οι συναρτήσεις στο ίδιο επίπεδο– δεν επιτρέπονται φωλιασμένες συναρτήσειςδεν επιτρέπονται φωλιασμένες συναρτήσεις– μόνο πέρασμα κατά τιμή (μόνο πέρασμα κατά τιμή (call by value)call by value)

Page 40: ΗΜΜΥ 1 1 1

ΠαράδειγμαΠαράδειγμα

int f (int x, int y)int f (int x, int y){{ return x * y;return x * y;}}

int a;int a;

void p (int x)void p (int x){{ a = f(x, x+1);a = f(x, x+1);}}

void main ()void main (){{ p(6);p(6);}}

Page 41: ΗΜΜΥ 1 1 1

Πίνακες (arrays)Πίνακες (arrays) ((i)i)

Ακολουθία μεταβλητώνΑκολουθία μεταβλητών– με το ίδιο όνομα,με το ίδιο όνομα,– με τον ίδιο τύπο δεδομένων,με τον ίδιο τύπο δεδομένων,– σε συνεχόμενες θέσεις μνήμης.σε συνεχόμενες θέσεις μνήμης.

ΠαράδειγμαΠαράδειγμαint a[50];int a[50];

double d1[5], d2[10];double d1[5], d2[10];

Η αρίθμηση αρχίζει από το 0 !Η αρίθμηση αρχίζει από το 0 !for (i = 0; i < 50; i++)for (i = 0; i < 50; i++)

a[i] = i;a[i] = i;

Page 42: ΗΜΜΥ 1 1 1

Πίνακες (arrays)Πίνακες (arrays) (i(ii)i)

Αρχικοποίηση πινάκωνΑρχικοποίηση πινάκωνint a[3] = {6, 7, 42};int a[3] = {6, 7, 42};

char c[] = {'a', 'b', 'c', 'd', 'e'};char c[] = {'a', 'b', 'c', 'd', 'e'};

ΣυμβολοσειρέςΣυμβολοσειρές– Είναι πίνακες χαρακτήρωνΕίναι πίνακες χαρακτήρωνchar s[6] = "abcde";char s[6] = "abcde";

– Τερματίζονται με τον κενό χαρακτήρα Τερματίζονται με τον κενό χαρακτήρα '\0''\0'

char s[6] = {'a', 'b', 'c',char s[6] = {'a', 'b', 'c',

'd', 'e', '\0'};'d', 'e', '\0'};

Page 43: ΗΜΜΥ 1 1 1

Πίνακες (arrays)Πίνακες (arrays) (ii(iii)i)

ΠαράδειγμαΠαράδειγμαint a[3] = {5, 6, 7};int a[3] = {5, 6, 7};int b[3] = {2, 3, 1};int b[3] = {2, 3, 1};int i;int i;

for (i = 0; i < 3; i++)for (i = 0; i < 3; i++) printf("%d times %d is %d\n",printf("%d times %d is %d\n", a[i], b[i], a[i]*b[i]);a[i], b[i], a[i]*b[i]);

5 times 2 is 106 times 3 is 187 times 1 is 7

5 times 2 is 106 times 3 is 187 times 1 is 7

Page 44: ΗΜΜΥ 1 1 1

Πολυδιάστατοι πίνακεςΠολυδιάστατοι πίνακες (i(i))

ΠαράδειγμαΠαράδειγμαint a[3][5];int a[3][5];

char c[5][10][4];char c[5][10][4];

ΑρχικοποίησηΑρχικοποίησηint i[3][3] = { {1, 0, 0},int i[3][3] = { {1, 0, 0},

{0, 1, 0},{0, 1, 0},

{0, 0, 1} };{0, 0, 1} };

char s[][10] = {char s[][10] = {

"my", "name", "is", "joe""my", "name", "is", "joe"

};};

Page 45: ΗΜΜΥ 1 1 1

Πολυδιάστατοι πίνακεςΠολυδιάστατοι πίνακες (i(ii)i)

Παράδειγμα: πολλαπλασιασμός πινάκωνΠαράδειγμα: πολλαπλασιασμός πινάκων

double a[3][4] = ... ,double a[3][4] = ... , b[4][5] = ... ,b[4][5] = ... , c[3][5];c[3][5];int i, j, k;int i, j, k;

for (i=0; i<3; i++)for (i=0; i<3; i++) for (j=0; j<5; j++) {for (j=0; j<5; j++) { c[i][j] = 0.0;c[i][j] = 0.0; for (k=0; k<4; k++)for (k=0; k<4; k++) c[i][j] += a[i][k] * b[k][j];c[i][j] += a[i][k] * b[k][j]; }}

Page 46: ΗΜΜΥ 1 1 1

Εισαγωγή στις δομές Εισαγωγή στις δομές δεδομένωνδεδομένων (i(i))

ΑλγόριθμοςΑλγόριθμοςΠεπερασμένο σύνολο εντολών που,Πεπερασμένο σύνολο εντολών που,όταν εκτελεστούν,όταν εκτελεστούν,επιτυγχάνουν κάποιο επιθυμητό αποτέλεσμαεπιτυγχάνουν κάποιο επιθυμητό αποτέλεσμα

– Δεδομένα εισόδου και εξόδουΔεδομένα εισόδου και εξόδου– Κάθε εντολή πρέπει να είναι:Κάθε εντολή πρέπει να είναι:

καλά ορισμένηκαλά ορισμένη

απλήαπλή– Η εκτέλεση πρέπει να σταματάΗ εκτέλεση πρέπει να σταματά

Page 47: ΗΜΜΥ 1 1 1

Εισαγωγή στις δομές Εισαγωγή στις δομές δεδομένωνδεδομένων (i(ii)i)

ΠολυπλοκότηταΠολυπλοκότηταΜέτρο εκτίμησης της απόδοσης αλγορίθμωνΜέτρο εκτίμησης της απόδοσης αλγορίθμωνως συνάρτηση του μεγέθουςως συνάρτηση του μεγέθουςτου προβλήματος που επιλύουντου προβλήματος που επιλύουν

– Χρόνος εκτέλεσηςΧρόνος εκτέλεσης– Χωρητικότητα μνήμης που απαιτείταιΧωρητικότητα μνήμης που απαιτείται

Ακριβής μέτρηση πολυπλοκότηταςΑκριβής μέτρηση πολυπλοκότηταςt = f(n)t = f(n)

Τάξη μεγέθους, συμβολισμοί Ο, Ω, ΘΤάξη μεγέθους, συμβολισμοί Ο, Ω, Θt = O(f(n))t = O(f(n))

Page 48: ΗΜΜΥ 1 1 1

Εισαγωγή στις δομές Εισαγωγή στις δομές δεδομένωνδεδομένων (i(iii)ii)

Ορισμός των κλάσεων Ορισμός των κλάσεων Ο, Ω, ΘΟ, Ω, Θ– Άνω όριοΆνω όριο

g = O(f)g = O(f)Ϋ� Ϋ� c. c. nn00. . n > nn > n00. g(n) < c f(n). g(n) < c f(n)– Κάτω όριοΚάτω όριο

g = g = ΩΩ(f)(f)Ϋ� Ϋ� c. c. nn00. . n > nn > n00. g(n) > c f(n). g(n) > c f(n)– Τάξη μεγέθουςΤάξη μεγέθους

g = Θ(f)g = Θ(f)Ϋ� Ϋ� cc11, c, c22. . nn00. . n > nn > n00..cc11 f(n) < g(n) < c f(n) < g(n) < c22 f(n) f(n)

Διάταξη μερικών κλάσεων πολυπλοκότηταςΔιάταξη μερικών κλάσεων πολυπλοκότηταςO(1) < O(logO(1) < O(lognn) < O() < O(nn) < O() < O(nn) < O() < O(nnloglognn))

< O(< O(nn22) < O() < O(nn33) < O(2) < O(2nn) < O() < O(nn!) < O(!) < O(nnnn))

Page 49: ΗΜΜΥ 1 1 1

Εισαγωγή στις δομές Εισαγωγή στις δομές δεδομένωνδεδομένων (i(iv)v)

Αφαίρεση δεδομένων (Αφαίρεση δεδομένων (data abstraction)data abstraction)– Διαχωρισμός Διαχωρισμός ιδιοτήτωνιδιοτήτων και και υλοποίησηςυλοποίησης– Ιδιότητες Ιδιότητες ενός τύπου δεδομένων:ενός τύπου δεδομένων:

ο τρόπος με τον οποίο δημιουργεί κανείς και ο τρόπος με τον οποίο δημιουργεί κανείς και χρησιμοποιεί δεδομένα αυτού του τύπουχρησιμοποιεί δεδομένα αυτού του τύπου

– Υλοποίηση Υλοποίηση ενός τύπου δεδομένων:ενός τύπου δεδομένων:ο τρόπος με τον οποίο αναπαρίστανται τα ο τρόπος με τον οποίο αναπαρίστανται τα δεδομένα στη μνήμη του υπολογιστή και δεδομένα στη μνήμη του υπολογιστή και προγραμματίζονται οι διαθέσιμες πράξειςπρογραμματίζονται οι διαθέσιμες πράξεις

Page 50: ΗΜΜΥ 1 1 1

Εισαγωγή στις δομές Εισαγωγή στις δομές δεδομένωνδεδομένων (v(v))

Οι λεπτομέρειες υλοποίησης επηρεάζουνΟι λεπτομέρειες υλοποίησης επηρεάζουντην την πολυπλοκότηταπολυπλοκότητα των αλγορίθμων των αλγορίθμων

Είναι συχνή επομένως η Είναι συχνή επομένως η αλλαγή τρόπουαλλαγή τρόπου υλοποίησηςυλοποίησης κάποιου τύπου δεδομένων κάποιου τύπου δεδομένων

Η Η αφαίρεση δεδομένωναφαίρεση δεδομένων ελαχιστοποιεί τις ελαχιστοποιεί τις αλλαγές που απαιτούνται στο πρόγραμμα αλλαγές που απαιτούνται στο πρόγραμμα που χρησιμοποιεί έναν τύπο δεδομένων, που χρησιμοποιεί έναν τύπο δεδομένων, όταν αλλάξει ο τρόπος υλοποίησηςόταν αλλάξει ο τρόπος υλοποίησης

Page 51: ΗΜΜΥ 1 1 1

Αφηρημένοι τύποι δεδομένωνΑφηρημένοι τύποι δεδομένων

Αφηρημένος τύπος δεδομένων – ΑΤΔΑφηρημένος τύπος δεδομένων – ΑΤΔ((abstract data typeabstract data type))– καθορίζει τις καθορίζει τις ιδιότητεςιδιότητες του τύπου δεδομένων του τύπου δεδομένων– δεν καθορίζει την δεν καθορίζει την υλοποίησήυλοποίησή του του

Αλγεβρικός ορισμός ΑΤΔΑλγεβρικός ορισμός ΑΤΔ– σύνταξησύνταξη: όνομα του τύπου και επικεφαλίδες : όνομα του τύπου και επικεφαλίδες

των πράξεωντων πράξεων– σημασιολογίασημασιολογία: κανόνες που περιγράφουν τη : κανόνες που περιγράφουν τη

λειτουργία των πράξεωνλειτουργία των πράξεων

Page 52: ΗΜΜΥ 1 1 1

Παράδειγμα ΑΤΔ: ΣύνολαΠαράδειγμα ΑΤΔ: Σύνολα((i)i)

ΣύνταξηΣύνταξη– Όνομα τύπου: Όνομα τύπου: setset ((σύνολα ακεραίωνσύνολα ακεραίων))– Επικεφαλίδες πράξεων:Επικεφαλίδες πράξεων:const set const set emptyempty;;

set set addadd (int x, set s); (int x, set s);

boolean boolean membermember (int x, set s); (int x, set s);

set set unionunion (set s1, set s2); (set s1, set s2);

boolean boolean subsetsubset (set s1, set s2); (set s1, set s2);

boolean boolean equalequal (set s1, set s2); (set s1, set s2);

Σημείωση: Σημείωση: θεωρούμε ότι έχει οριστεί κατάλληλα ο θεωρούμε ότι έχει οριστεί κατάλληλα ο τύποςτύπος booleanboolean..

Page 53: ΗΜΜΥ 1 1 1

Παράδειγμα ΑΤΔ: ΣύνολαΠαράδειγμα ΑΤΔ: Σύνολα((ii)ii)ΣημασιολογίαΣημασιολογία– Αξιωματικός ορισμός Αξιωματικός ορισμός membermember::member(x, empty) = falsemember(x, empty) = false

member(x, add(x, s)) = truemember(x, add(x, s)) = true

member(x, add(y, s)) = member(x, s)member(x, add(y, s)) = member(x, s) αναν x != yx != y

– Αξιωματικός ορισμός Αξιωματικός ορισμός unionunion::union(empty, s) = sunion(empty, s) = s

union(add(x, s1), s2) = union(add(x, s1), s2) = add(x, union(s1, s2)) add(x, union(s1, s2))

Page 54: ΗΜΜΥ 1 1 1

Παράδειγμα ΑΤΔ: ΣύνολαΠαράδειγμα ΑΤΔ: Σύνολα((iii)iii)ΣημασιολογίαΣημασιολογία– Αξιωματικός ορισμός Αξιωματικός ορισμός subsetsubset::subset(empty, s) = truesubset(empty, s) = true

subset(add(x, s1), s2) =subset(add(x, s1), s2) = band(member(x, s2), subset(s1, s2)) band(member(x, s2), subset(s1, s2))

– Αξιωματικός ορισμός Αξιωματικός ορισμός equalequal::equal(s1, s2) =equal(s1, s2) = band(subset(s1, s2), subset(s2, s1)) band(subset(s1, s2), subset(s2, s1))

Page 55: ΗΜΜΥ 1 1 1

Συγκεκριμένοι τύποι δεδομένωνΣυγκεκριμένοι τύποι δεδομένων

Συγκεκριμένος τύπος δεδομένων – ΣΤΔΣυγκεκριμένος τύπος δεδομένων – ΣΤΔ((concrete data typeconcrete data type))– καθορίζει τις καθορίζει τις ιδιότητεςιδιότητες του τύπου δεδομένων του τύπου δεδομένων– καθορίζει επακριβώς την καθορίζει επακριβώς την υλοποίησήυλοποίησή του του

Κάθε γλώσσα προγραμματισμού υποστηρίζει Κάθε γλώσσα προγραμματισμού υποστηρίζει ορισμένους ΣΤΔ, π.χ.ορισμένους ΣΤΔ, π.χ.– απλοί τύποιαπλοί τύποι: ακέραιοι αριθμοί, πραγματικοί : ακέραιοι αριθμοί, πραγματικοί

αριθμοί, χαρακτήρες, λογικές τιμέςαριθμοί, χαρακτήρες, λογικές τιμές– σύνθετοι τύποισύνθετοι τύποι: πίνακες (: πίνακες (arrays), arrays), εγγραφές εγγραφές

((records), records), δείκτες (δείκτες (pointers), pointers), σύνολα (σύνολα (sets)sets)

Page 56: ΗΜΜΥ 1 1 1

Σχέση ΑΤΔ και ΣΤΔΣχέση ΑΤΔ και ΣΤΔ ((i)i)

ΑΤΔ ΑΤΔ setset: : σύνολα ακεραίωνσύνολα ακεραίων ss = { 1, 3, 7, 9 } = { 1, 3, 7, 9 }

Υλοποίηση 1:Υλοποίηση 1: πίνακας από πίνακας από booleanbooleanfalsetrue falsetrue true truefalse false false false false

s[2]s[1] s[8]s[3] s[7] s[9]s[0] s[4] s[5] s[6] s[10]

Υλοποίηση 2:Υλοποίηση 2: bits bits ενός πίνακα από ενός πίνακα από intint

0

s[1] s[3] s[7] s[9]

1 0 1 0 0 0 1 0 1 0 0 0 0 0 0

– ΣτατικόςΣτατικός τρόπος υλοποίησης ΣΤΔ τρόπος υλοποίησης ΣΤΔ

Page 57: ΗΜΜΥ 1 1 1

Σχέση ΑΤΔ και ΣΤΔΣχέση ΑΤΔ και ΣΤΔ (i(ii)i)

Υλοποίηση 3:Υλοποίηση 3: απλά συνδεδεμένη λίστα απλά συνδεδεμένη λίστα

– ΔυναμικόςΔυναμικός τρόπος υλοποίησης ΣΤΔ τρόπος υλοποίησης ΣΤΔ

Υλοποίηση 4:Υλοποίηση 4: συμβολοσειρά που περιέχει συμβολοσειρά που περιέχει το μαθηματικό ορισμό του συνόλουτο μαθηματικό ορισμό του συνόλου

"{x | x=1 \/ x=3 \/ x=7 \/ x=9}""{x | x=1 \/ x=3 \/ x=7 \/ x=9}"

"{x | 1<=x<=10 /\ x%2=1 /\ x<>5}""{x | 1<=x<=10 /\ x%2=1 /\ x<>5}"

– Δύσκολη η υλοποίηση των πράξεωνΔύσκολη η υλοποίηση των πράξεων– Απειροσύνολα:Απειροσύνολα: "{x | x > 100}""{x | x > 100}"

1 3 7 9

Page 58: ΗΜΜΥ 1 1 1

Πίνακες ως ΑΤΔΠίνακες ως ΑΤΔ ((ii))

Βασική πράξη: Βασική πράξη: προσπέλασηπροσπέλαση στοιχείου στοιχείουa[i]a[i]

Συνήθως υλοποιούνται με κάποιο ΣΤΔ Συνήθως υλοποιούνται με κάποιο ΣΤΔ πινάκων (πινάκων (arrays)arrays)– Κόστος προσπέλασης: Κόστος προσπέλασης: O(1)O(1)

Ο ΣΤΔ του Ο ΣΤΔ του μονοδιάστατου πίνακαμονοδιάστατου πίνακα επαρκεί για επαρκεί για την υλοποίηση κάθε ΑΤΔ πίνακατην υλοποίηση κάθε ΑΤΔ πίνακα– Συνάρτηση Συνάρτηση locloc υπολογίζει τη θέση ενός στοιχείου υπολογίζει τη θέση ενός στοιχείου

του ΑΤΔ πίνακα στο μονοδιάστατο ΣΤΔ πίνακα της του ΑΤΔ πίνακα στο μονοδιάστατο ΣΤΔ πίνακα της υλοποίησηςυλοποίησης

Page 59: ΗΜΜΥ 1 1 1

Πίνακες ως ΑΤΔΠίνακες ως ΑΤΔ ((iiii))

ΑΤΔ πίνακα δύο διαστάσεων ΑΤΔ πίνακα δύο διαστάσεων nn mm

loc loc ((nn, , mm, , ii, , jj) = ) = mm ( (i i – 1) + – 1) + jj – 1 – 1

Αρίθμηση κατά στήλεςΑρίθμηση κατά στήλεςloc loc ((nn, , mm, , ii, , jj) = ) = nn ( (j j – 1) + – 1) + ii – 1 – 1

0 1 2 3 4 5

6 7 8 9 10 11

12 13 14 15 16 17

i = 1

i = 2

i = 3

j = 1 2 4 5 63

n = 3

m = 6

Page 60: ΗΜΜΥ 1 1 1

Πίνακες ως ΑΤΔΠίνακες ως ΑΤΔ (i(iiiii))

ΑΤΔ κάτω τριγωνικού πίνακα ΑΤΔ κάτω τριγωνικού πίνακα nn nn

loc loc ((nn, , ii, , jj) = ) = ii ( (i i – 1) / 2 + – 1) / 2 + jj – 1 – 1

Ομοίως για συμμετρικούς πίνακεςΟμοίως για συμμετρικούς πίνακες

0

1 2

3 4 5

i = 1

i = 2

i = 3

j = 1 2 4 53

n = 5

6 7 8 9

10 11 12 13 14

i = 4

i = 5

Page 61: ΗΜΜΥ 1 1 1

Πίνακες ως ΑΤΔΠίνακες ως ΑΤΔ (i(ivv))

ΑΤΔ τριδιαγώνιου πίνακα ΑΤΔ τριδιαγώνιου πίνακα nn nn

loc loc ((nn, , ii, , jj) = 2 ) = 2 i i + + jj – 3 – 3

0 1

2 3 4

5 6 7

i = 1

i = 2

i = 3

j = 1 2 4 53

n = 5

8 9 10

11 12

i = 4

i = 5

Page 62: ΗΜΜΥ 1 1 1

Πίνακες ως ΑΤΔΠίνακες ως ΑΤΔ ((vv))

ΑΤΔ αραιού πίνακα ΑΤΔ αραιού πίνακα nn mm

– Υλοποίηση με δυαδικό πίνακαΥλοποίηση με δυαδικό πίνακα– Υλοποίηση με τρεις πίνακεςΥλοποίηση με τρεις πίνακες

rowrow = [ 1, 2, 3, 3, 4 ] = [ 1, 2, 3, 3, 4 ] colcol = [ 1, 3, 2, 3, 5 ] = [ 1, 3, 2, 3, 5 ]valval = [ = [ aa11, , aa22, , aa33, , aa44, , aa55 ] ]

a1

a2

a3 a4

i = 1

i = 2

i = 3

j = 1 2 4 53

n = 4

a5i = 4

m = 5

Page 63: ΗΜΜΥ 1 1 1

Αναζήτηση σε πίνακεςΑναζήτηση σε πίνακες (i)(i)

Σειριακή αναζήτησηΣειριακή αναζήτηση– Τα στοιχεία διατρέχονται κατά σειράΤα στοιχεία διατρέχονται κατά σειρά– Κόστος: Κόστος: O(O(nn))

12 9 72 22 42 99 14 61n = 8x = 42

(1) (3)(2) (4) (5)

– Βελτίωση: στοιχείο Βελτίωση: στοιχείο ““φρουρόςφρουρός” (sentinel)” (sentinel)

12 9 72 22 42 99 14 61n = 8x = 77

Page 64: ΗΜΜΥ 1 1 1

Αναζήτηση σε πίνακεςΑναζήτηση σε πίνακες (ii)(ii)

Υλοποίηση σε Υλοποίηση σε CC

int ssearch (int a[], int n, int x)int ssearch (int a[], int n, int x){{ int i;int i;

for (i = 0; i < n; i++)for (i = 0; i < n; i++) if (a[i] == x)if (a[i] == x) return i;return i; return -1;return -1;}}

Page 65: ΗΜΜΥ 1 1 1

Αναζήτηση σε πίνακεςΑναζήτηση σε πίνακες (iii)(iii)

Υλοποίηση σε Υλοποίηση σε CC με φρουρό με φρουρό

int int sssearch_s (int a[], int n, int x)search_s (int a[], int n, int x){{ int i;int i;

a[n] = x;a[n] = x; for (i = 0; a[i] != x; i++);for (i = 0; a[i] != x; i++); return (i < n) ? i : -1;return (i < n) ? i : -1;}}

Page 66: ΗΜΜΥ 1 1 1

Αναζήτηση σε πίνακεςΑναζήτηση σε πίνακες (iv)(iv)

Δυαδική αναζήτησηΔυαδική αναζήτηση– Ο πίνακας πρέπει να είναι Ο πίνακας πρέπει να είναι ταξινομημένοςταξινομημένος– Κόστος: Κόστος: O(logO(lognn))

3 7 14 22 42 61 72 99n = 8x = 42

(1) (3) (2)

Άλλες μέθοδοι αναζήτησηςΆλλες μέθοδοι αναζήτησης– Μικρότερο κόστος Μικρότερο κόστος περισσότερος χώροςπερισσότερος χώρος – Πίνακες Πίνακες κατακερματισμούκατακερματισμού ( (hash tables)hash tables)

Page 67: ΗΜΜΥ 1 1 1

Ταξινόμηση πινάκωνΤαξινόμηση πινάκων ((i)i)

Ταξινόμηση επιλογής Ταξινόμηση επιλογής ((selection sort)selection sort)– Ιδέα:Ιδέα:

για κάθε για κάθε ii κατ’ αύξουσα σειρά κατ’ αύξουσα σειρά

βρες το μικρότερο των στοιχείων μετά το βρες το μικρότερο των στοιχείων μετά το aa[[ii]]

αντιμετάθεσέ το με το αντιμετάθεσέ το με το aa[[ii]]

– Κόστος: Κόστος: Ο(Ο(nn22))– Βελτίωση: στοιχείο φρουρόςΒελτίωση: στοιχείο φρουρός

Page 68: ΗΜΜΥ 1 1 1

Ταξινόμηση πινάκωνΤαξινόμηση πινάκων (i(ii)i)

Ταξινόμηση επιλογής, υλοποίηση σε Ταξινόμηση επιλογής, υλοποίηση σε CCvoid ssort (int a[], int n)void ssort (int a[], int n){{ int i, j;int i, j;

for (i = 0; i < n-1; i++) {for (i = 0; i < n-1; i++) { int min = a[i], minj = i;int min = a[i], minj = i;

for (j = i+1; j < n; j++)for (j = i+1; j < n; j++) if (a[j] < min)if (a[j] < min) min = a[minj = j];min = a[minj = j];

a[minj] = a[i];a[minj] = a[i]; a[i] = min;a[i] = min; }}}}

Page 69: ΗΜΜΥ 1 1 1

Ταξινόμηση πινάκωνΤαξινόμηση πινάκων (ii(iii)i)

Ταξινόμηση εισαγωγής Ταξινόμηση εισαγωγής ((insertion sort)insertion sort)– Χρησιμοποιούμε αυτό τον τρόπο όταν ταξινομούμε Χρησιμοποιούμε αυτό τον τρόπο όταν ταξινομούμε

τα χαρτιά μιας τράπουλαςτα χαρτιά μιας τράπουλας– Ιδέα:Ιδέα:

για κάθε για κάθε ii από το δεύτερο και κατ’ αύξουσα σειρά από το δεύτερο και κατ’ αύξουσα σειρά

τοποθέτησε το τοποθέτησε το aa[[ii]] στη σωστή του θέση στη σωστή του θέσημεταξύ των στοιχείων που είναι πριν από αυτόμεταξύ των στοιχείων που είναι πριν από αυτό

– Κόστος: Κόστος: Ο(Ο(nn22))– Βελτιώσεις:Βελτιώσεις:

στοιχείο φρουρόςστοιχείο φρουρόςδυαδική εισαγωγήδυαδική εισαγωγή

Page 70: ΗΜΜΥ 1 1 1

Ταξινόμηση πινάκωνΤαξινόμηση πινάκων ((iv)iv)

Ταξινόμηση εισαγωγής, υλοποίηση σε Ταξινόμηση εισαγωγής, υλοποίηση σε CCvoid isort (int a[], int n)void isort (int a[], int n){{ int i, j;int i, j;

for (i = 1; i < n; i++) {for (i = 1; i < n; i++) { int x = a[i];int x = a[i];

for (j = i-1; j >= 0; j--)for (j = i-1; j >= 0; j--) if (x < a[j])if (x < a[j]) a[j+1] = a[j];a[j+1] = a[j]; elseelse break;break;

a[j+1] = x;a[j+1] = x; }}}}

Page 71: ΗΜΜΥ 1 1 1

Ταξινόμηση πινάκωνΤαξινόμηση πινάκων ((v)v)

Ταξινόμηση φυσαλίδας Ταξινόμηση φυσαλίδας ((bubble sort)bubble sort)– Ιδέα:Ιδέα:

για κάθε για κάθε ii κατ’ αύξουσα σειρά κατ’ αύξουσα σειρά

για κάθε για κάθε j j > > ii κατά φθίνουσα σειράκατά φθίνουσα σειρά

αν αν aa[[jj-1]-1] > > aa[[jj] ] αντιμετάθεσε τα αντιμετάθεσε τα aa[[jj-1]-1] και και aa[[jj]]

– Κόστος: Κόστος: Ο(Ο(nn22))– Βελτιώσεις:Βελτιώσεις:

σταματά αν σε ένα πέρασμα δεν γίνει αντιμετάθεσησταματά αν σε ένα πέρασμα δεν γίνει αντιμετάθεσησε ποιο σημείο έγινε η τελευταία αντιμετάθεσησε ποιο σημείο έγινε η τελευταία αντιμετάθεσηαλλαγή κατεύθυνσης μεταξύ διαδοχικών περασμάτων αλλαγή κατεύθυνσης μεταξύ διαδοχικών περασμάτων ((shake sort)shake sort)

Page 72: ΗΜΜΥ 1 1 1

Ταξινόμηση πινάκωνΤαξινόμηση πινάκων ((vi)vi)

Ταξινόμηση φυσαλίδας, υλοποίηση σε Ταξινόμηση φυσαλίδας, υλοποίηση σε CC

void bsort (int a[], int n)void bsort (int a[], int n){{ int i, j;int i, j;

for (i = 0; i < n; i++)for (i = 0; i < n; i++) for (j = n-1; j > i; j--)for (j = n-1; j > i; j--) if (a[j-1] > a[j]) {if (a[j-1] > a[j]) { int temp = a[j-1];int temp = a[j-1];

a[j-1] = a[j];a[j-1] = a[j]; a[j] = temp;a[j] = temp; }}}}

Page 73: ΗΜΜΥ 1 1 1

Ταξινόμηση πινάκωνΤαξινόμηση πινάκων ((vii)vii)

Ταξινόμηση με διαμέριση Ταξινόμηση με διαμέριση ((quick sort)quick sort)– Ιδέα:Ιδέα:

διάλεξε ένα τυχαίο στοιχείο διάλεξε ένα τυχαίο στοιχείο xx του πίνακατου πίνακα

διαμέρισε τον πίνακα, μεταφέροντας:διαμέρισε τον πίνακα, μεταφέροντας:– τα στοιχεία μικρότερα του τα στοιχεία μικρότερα του xx στην αρχήστην αρχή– τα στοιχεία μεγαλύτερα του τα στοιχεία μεγαλύτερα του x x στο τέλοςστο τέλος

αναδρομικά, ταξινόμησε τα δύο μέρηαναδρομικά, ταξινόμησε τα δύο μέρη

– Κόστος:Κόστος: Ο(Ο(nn22) ) στη χειρότερη περίπτωσηστη χειρότερη περίπτωσηΟ(Ο(n n loglognn)) κατά μέσο όροκατά μέσο όρο

Page 74: ΗΜΜΥ 1 1 1

Ταξινόμηση πινάκωνΤαξινόμηση πινάκων ((viii)viii)

Quick sort, υλοποίηση σε Quick sort, υλοποίηση σε CCvoid qsort (int a[], int n)void qsort (int a[], int n){{ qsort_auxil(a, 0, n-1);qsort_auxil(a, 0, n-1);}}

void qsort_auxil (int a[], int lower,void qsort_auxil (int a[], int lower, int upper)int upper){{ if (lower < upper) {if (lower < upper) { int x = a[(lower + upper) / 2];int x = a[(lower + upper) / 2]; int i, j;int i, j;

for (i = lower, j = upper;for (i = lower, j = upper; i <= j; i++, j--) {i <= j; i++, j--) { while (a[i] < x) i++;while (a[i] < x) i++; while (a[j] > x) j--;while (a[j] > x) j--;

Page 75: ΗΜΜΥ 1 1 1

Ταξινόμηση πινάκωνΤαξινόμηση πινάκων ((ix)ix)

Quick sort, υλοποίηση σε Quick sort, υλοποίηση σε CC (συνέχεια)(συνέχεια) if (i <= j) {if (i <= j) { int temp = a[i];int temp = a[i];

a[i] = a[j];a[i] = a[j]; a[j] = temp;a[j] = temp; }} }} qsort_auxil(a, lower, j);qsort_auxil(a, lower, j); qsort_auxil(a, i, upper);qsort_auxil(a, i, upper); }}}}

Page 76: ΗΜΜΥ 1 1 1

Ταξινόμηση πινάκωνΤαξινόμηση πινάκων ((x)x)

Άλλοι τρόποι ταξινόμησηςΆλλοι τρόποι ταξινόμησης– Ταξινόμηση του Ταξινόμηση του ShellShell ((shell sort)shell sort),,

κόστος: κόστος: Ο(Ο(nn22))– Ταξινόμηση σε σωρό Ταξινόμηση σε σωρό ((heap sort),heap sort),

κόστος: κόστος: Ο(Ο(n n loglognn))– Ταξινόμηση με συγχώνευση (Ταξινόμηση με συγχώνευση (merge sort),merge sort),

κόστος: κόστος: Ο(Ο(n n loglognn))

Page 77: ΗΜΜΥ 1 1 1

Ορισμοί τύπωνΟρισμοί τύπων

Συνώνυμα απλών τύπωνΣυνώνυμα απλών τύπωνtypedef double real;typedef double real;

real x, y;real x, y;

Συνώνυμα σύνθετων τύπωνΣυνώνυμα σύνθετων τύπωνtypedef double vector [10];typedef double vector [10];

vector v;vector v;

for (i = 0; i < 10; i++)for (i = 0; i < 10; i++)

v[i] = i;v[i] = i;

Page 78: ΗΜΜΥ 1 1 1

Απαριθμήσεις (enumerations)Απαριθμήσεις (enumerations)

Ο τύπος Ο τύπος enumenumenum color_tag {enum color_tag {

GREEN, RED, BLUE, WHITE, BLACKGREEN, RED, BLUE, WHITE, BLACK

};};

enum color_tag c;enum color_tag c;

c = GREEN;c = GREEN;

typedef enum {typedef enum {

GREEN, RED, BLUE, WHITE, BLACKGREEN, RED, BLUE, WHITE, BLACK

} color;} color;

color c = WHITE;color c = WHITE;

Page 79: ΗΜΜΥ 1 1 1

Δομές (Δομές (structures)structures) (i)(i)

Ο τύπος Ο τύπος structstructstruct complex_tag {struct complex_tag {

double re, im;double re, im;

};};

struct complex_tag z;struct complex_tag z;z.re = 1.0;z.re = 1.0;

z.im = -1.0;z.im = -1.0;

typedef struct complex_tag complex;typedef struct complex_tag complex;

complex z;complex z;

complex zs [100];complex zs [100];

re

im

z

Page 80: ΗΜΜΥ 1 1 1

Δομές (Δομές (structures)structures) (ii)(ii)

ΠαράδειγμαΠαράδειγμα

complex complement (complex z)complex complement (complex z){{ complex result;complex result;

result.re = z.re;result.re = z.re; result.im = -z.imresult.im = -z.im return result;return result;}}

Page 81: ΗΜΜΥ 1 1 1

Δομές (Δομές (structures)structures) (iii)(iii)

ΠαράδειγμαΠαράδειγμαtypedef struct {typedef struct {

char firstName [30];char firstName [30];

char lastName [50];char lastName [50];

char phone [10];char phone [10];

int age;int age;

double salary;double salary;

} record;} record;

record r [1000];record r [1000];

r[423].age = 32;r[423].age = 32;

Page 82: ΗΜΜΥ 1 1 1

Ενώσεις (Ενώσεις (unions)unions)

Ο τύπος Ο τύπος unionunionunion number_tag {union number_tag {

int i;int i;

double d;double d;

};};

union number_tag n;union number_tag n;

d

in

n.d = 1.2;n.d = 1.2;

printf("%lf\n", n.d);printf("%lf\n", n.d);

n.i = 42;n.i = 42;

printf("%d\n", n.i);printf("%d\n", n.i);

printf("%lf\n", n.d); /* wrong! */printf("%lf\n", n.d); /* wrong! */

Page 83: ΗΜΜΥ 1 1 1

Δείκτες (Δείκτες (pointerspointers)) ((i)i)

ΜεταβλητέςΜεταβλητές– που δεν περιέχουν μια τιμή κάποιου απλού που δεν περιέχουν μια τιμή κάποιου απλού

τύπου δεδομένωντύπου δεδομένων– αλλά τη αλλά τη διεύθυνσηδιεύθυνση μιας άλλης μεταβλητής μιας άλλης μεταβλητής

ΠαράδειγμαΠαράδειγμαint x, *p;int x, *p;

x

δ124

p

δ247

42

δ124

Page 84: ΗΜΜΥ 1 1 1

Δείκτες (Δείκτες (pointerspointers)) ((ii)ii)

Δεικτοδότηση: &Δεικτοδότηση: &– η διεύθυνση μιας μεταβλητήςη διεύθυνση μιας μεταβλητήςp = &x;p = &x;

Αποδεικτοδότηση: *Αποδεικτοδότηση: *– το περιεχόμενο μιας διεύθυνσηςτο περιεχόμενο μιας διεύθυνσηςprintf("%d", *p);printf("%d", *p);*p = 7;*p = 7;

x

δ124

p

δ247

42

δ124

Page 85: ΗΜΜΥ 1 1 1

Πίνακες και δείκτεςΠίνακες και δείκτες ((i)i)

Αριθμητική δεικτώνΑριθμητική δεικτώνint a[3] = {7, 6, 42};int a[3] = {7, 6, 42};int *p;int *p;

p

δ247

a

δ124 7

δ125 6

δ126 42

δ124

p = &(a[0]);p = &(a[0]);p = &a;p = &a;p = a;p = a;

printf("%d\n", *p);printf("%d\n", *p);printf("%d\n", *(p+1));printf("%d\n", *(p+1));p = p+2;p = p+2;printf("%d\n", *p);printf("%d\n", *p);

Page 86: ΗΜΜΥ 1 1 1

Πίνακες και δείκτεςΠίνακες και δείκτες ((ii)ii)

Ισοδυναμία πινάκων και δεικτώνΙσοδυναμία πινάκων και δεικτών– Ένας πίνακας είναι ένας δείκτης στο πρώτο Ένας πίνακας είναι ένας δείκτης στο πρώτο

στοιχείο.στοιχείο.– a[i]a[i] ισοδύναμο μεισοδύναμο με *(a+i)*(a+i)

– Οι πίνακες όμως είναι σταθεροί δείκτες, δηλαδή Οι πίνακες όμως είναι σταθεροί δείκτες, δηλαδή δεν μπορούν να αλλάξουν τιμήδεν μπορούν να αλλάξουν τιμή

int a[3] = {7, 6, 42};int a[3] = {7, 6, 42};

int *p = &a;int *p = &a;

p++; /* correct */p++; /* correct */

a++; /* wrong! */a++; /* wrong! */

Page 87: ΗΜΜΥ 1 1 1

Πίνακες και δείκτεςΠίνακες και δείκτες (i(iii)ii)

Παράδειγμα: αντιγραφή πινάκωνΠαράδειγμα: αντιγραφή πινάκων

int a[10], b[10];int a[10], b[10];

int *p = a, *q = b, i;int *p = a, *q = b, i;

/* assume b initialized *//* assume b initialized */

for (i=0; i<10; i++)for (i=0; i<10; i++)

*p++ = *q++;*p++ = *q++;

Page 88: ΗΜΜΥ 1 1 1

Πίνακες και δείκτεςΠίνακες και δείκτες ((iv)iv)

Παράδειγμα: εκτύπωση συμβολοσειράςΠαράδειγμα: εκτύπωση συμβολοσειράς

void putchar (char c);void putchar (char c);

char s[] = "Hello world!\n";char s[] = "Hello world!\n";

char *p;char *p;

for (p = s; *p != '\0'; p++)for (p = s; *p != '\0'; p++)

putchar(*p);putchar(*p);

Page 89: ΗΜΜΥ 1 1 1

Κενός δείκτης και δείκτης σε Κενός δείκτης και δείκτης σε κενόκενό

Ο κενός δείκτης: Ο κενός δείκτης: NULLNULL– Απαγορεύεται να αποδεικτοδοτηθεί!Απαγορεύεται να αποδεικτοδοτηθεί!int *p = NULL;int *p = NULL;

*p = 42; /* wrong! */*p = 42; /* wrong! */

– Ο μόνος δείκτης που αντιστοιχεί στην ψευδή Ο μόνος δείκτης που αντιστοιχεί στην ψευδή λογική τιμή, όταν χρησιμοποιείται σε συνθήκηλογική τιμή, όταν χρησιμοποιείται σε συνθήκη

Ο δείκτης σε κενό: Ο δείκτης σε κενό: void *void *– Γενική μορφή δείκτηΓενική μορφή δείκτη– Απαγορεύεται να αποδεικτοδοτηθεί!Απαγορεύεται να αποδεικτοδοτηθεί!– Απαγορεύεται η αριθμητική δεικτών!Απαγορεύεται η αριθμητική δεικτών!

Page 90: ΗΜΜΥ 1 1 1

Δείκτες αντί περάσματος με Δείκτες αντί περάσματος με αναφοράαναφορά

Κώδικας Κώδικας PascalPascalprocedure inc (var x : integer);procedure inc (var x : integer);beginbegin x := x+1x := x+1end;end;

... inc(a) ...... inc(a) ...

Ισοδύναμος κώδικας Ισοδύναμος κώδικας CCvoid inc (int * px)void inc (int * px){{ (*px)++;(*px)++;}}

... inc(&a) ...... inc(&a) ...

Page 91: ΗΜΜΥ 1 1 1

Δείκτες σε εγγραφέςΔείκτες σε εγγραφές

ΣυντομογραφίαΣυντομογραφίαp->xp->x είναι ισοδύναμο μεείναι ισοδύναμο με (*p).x(*p).x

ΠαράδειγμαΠαράδειγμαstruct {struct { int x, y;int x, y;} coordinates, *p;} coordinates, *p;

coordinates.x = 1;coordinates.x = 1;coordinates.y = 3;coordinates.y = 3;

p = &coordinates;p = &coordinates;

printf("%d\n", p->x);printf("%d\n", p->x);printf("%d\n", p->y);printf("%d\n", p->y);

Page 92: ΗΜΜΥ 1 1 1

Μετατροπές τύπωνΜετατροπές τύπων (i)(i)

Έμμεσες (coercions)Έμμεσες (coercions)double d = 3;double d = 3; (με ανάθεση)(με ανάθεση)int x = 3.14;int x = 3.14;

int f (int x); int f (int x); (με πέρασμα παραμέτρου)(με πέρασμα παραμέτρου)f(3.14);f(3.14);

Άμεσες (type casting)Άμεσες (type casting)(( τύπος τύπος )) έκφρασηέκφραση(double) 3(double) 3(int) 3.14(int) 3.14(int *) NULL(int *) NULL

Page 93: ΗΜΜΥ 1 1 1

Μετατροπές τύπωνΜετατροπές τύπων ((ii)ii)

Πρόβλημα:Πρόβλημα: πώς μπορώ να τυπώσω το πώς μπορώ να τυπώσω το αποτέλεσμα της πραγματικής διαίρεσης δυο αποτέλεσμα της πραγματικής διαίρεσης δυο ακεραίων αριθμών, χωρίς νέες μεταβλητές;ακεραίων αριθμών, χωρίς νέες μεταβλητές;

int x = 5, int x = 5, y = 3y = 3;;

Λάθος λύση #1:Λάθος λύση #1: printf("%d", x/printf("%d", x/yy););

Λάθος λύση #2:Λάθος λύση #2: printf("%lf", x/y);printf("%lf", x/y);

Σωστές λύσεις:Σωστές λύσεις:printf("%lf", 1.0 * x / y);printf("%lf", 1.0 * x / y);printf("%lf", (double) x / (double) y);printf("%lf", (double) x / (double) y);printf("%lf", (double) x / y);printf("%lf", (double) x / y);

Page 94: ΗΜΜΥ 1 1 1

Δυναμική παραχώρηση μνήμηςΔυναμική παραχώρηση μνήμης((i)i)

Συναρτήσεις βιβλιοθήκηςΣυναρτήσεις βιβλιοθήκης <stdlib.h><stdlib.h>– void * malloc (size_t n);void * malloc (size_t n);

Δυναμική παραχώρηση μνήμης μήκους Δυναμική παραχώρηση μνήμης μήκους nn bytesbytes..Το αποτέλεσμα πρέπει να μετατραπεί στο σωστό τύπο.Το αποτέλεσμα πρέπει να μετατραπεί στο σωστό τύπο.Επιστρέφεται Επιστρέφεται NULLNULL αν εξαντληθεί η μνήμη. αν εξαντληθεί η μνήμη.

– void free (void * p);void free (void * p);

Αποδέσμευση της μνήμης στην οποία δείχνει το Αποδέσμευση της μνήμης στην οποία δείχνει το pp..Το Το pp πρέπει να έχει δημιουργηθεί με προηγούμενη κλήση στη πρέπει να έχει δημιουργηθεί με προηγούμενη κλήση στη mallocmalloc..

Πόσα Πόσα bytes bytes χρειάζονται;χρειάζονται;– sizeof(sizeof(typetype)) π.χ.π.χ. sizeof(int) sizeof(int)– sizeof(sizeof(variablevariable) ) π.χ.π.χ. sizeof(x) sizeof(x)

Page 95: ΗΜΜΥ 1 1 1

Δυναμική παραχώρηση μνήμηςΔυναμική παραχώρηση μνήμης(ii)(ii)

ΠαράδειγμαΠαράδειγμαint *p;int *p;int i;int i;

p = (int *) malloc(sizeof(int));p = (int *) malloc(sizeof(int));*p = 42;*p = 42;free(p);free(p);

p = (int *) malloc(10 * sizeof(int));p = (int *) malloc(10 * sizeof(int));for (i = 0; i < 10; i++)for (i = 0; i < 10; i++) p[i] = 42;p[i] = 42;free(p);free(p);

Το αποτέλεσμα της malloc πρέπεινα ελεγχθεί ότι δεν είναι NULL!

Page 96: ΗΜΜΥ 1 1 1

Δυναμικοί ΣΤΔΔυναμικοί ΣΤΔ ((i)i)

Χρησιμοποιούνται για την υλοποίηση ΑΤΔΧρησιμοποιούνται για την υλοποίηση ΑΤΔ

ΠαραδείγματαΠαραδείγματα– συνδεδεμένες λίστεςσυνδεδεμένες λίστες– δέντραδέντρα– γράφοιγράφοι

Πώς υλοποιούνται στη Πώς υλοποιούνται στη CC;;– με κατάλληλο συνδυασμό με κατάλληλο συνδυασμό δομώνδομών ( (structstruct))

και και δεικτώνδεικτών ( (pointers), pointers), καικαι– με με δυναμική παραχώρησηδυναμική παραχώρηση μνήμης μνήμης

Page 97: ΗΜΜΥ 1 1 1

Δυναμικοί ΣΤΔΔυναμικοί ΣΤΔ ((ii)ii)

Πλεονεκτήματα έναντι στατικών ΣΤΔΠλεονεκτήματα έναντι στατικών ΣΤΔ– Δεν επιβάλλουν περιορισμούς στο Δεν επιβάλλουν περιορισμούς στο μέγιστο μέγιστο

πλήθοςπλήθος των δεδομένων των δεδομένων– Η μνήμη που χρησιμοποιείται είναι ανάλογη του Η μνήμη που χρησιμοποιείται είναι ανάλογη του

πραγματικού πλήθουςπραγματικού πλήθους των δεδομένων των δεδομένων– Κάποιες πράξεις υλοποιούνται αποδοτικότερα Κάποιες πράξεις υλοποιούνται αποδοτικότερα

Μειονεκτήματα έναντι στατικών ΣΤΔΜειονεκτήματα έναντι στατικών ΣΤΔ– Για σταθερό και γνωστό πλήθος δεδομένων, Για σταθερό και γνωστό πλήθος δεδομένων,

χρησιμοποιούν συνήθως περισσότερη μνήμηχρησιμοποιούν συνήθως περισσότερη μνήμη– Κάποιες πράξεις υλοποιούνται λιγότερο Κάποιες πράξεις υλοποιούνται λιγότερο

αποδοτικάαποδοτικά

Page 98: ΗΜΜΥ 1 1 1

Δυναμικοί ΣΤΔΔυναμικοί ΣΤΔ (iii)(iii)

ΙδέαΙδέα– Κατασκευάζεται ένα σύνολο Κατασκευάζεται ένα σύνολο κόμβωνκόμβων– Κάθε κόμβος περιέχει Κάθε κόμβος περιέχει πληροφορίεςπληροφορίες και και

συνδέσμουςσυνδέσμους προς άλλους κόμβους προς άλλους κόμβους

Π Σ

Page 99: ΗΜΜΥ 1 1 1

Απλά συνδεδεμένες λίστεςΑπλά συνδεδεμένες λίστες (i)(i)

Είναι γραμμικές διατάξειςΕίναι γραμμικές διατάξεις

Κάθε κόμβος περιέχει ένα σύνδεσμο στον Κάθε κόμβος περιέχει ένα σύνδεσμο στον επόμενοεπόμενο κόμβο κόμβο

Ο τελευταίος κόμβος έχει Ο τελευταίος κόμβος έχει κενόκενό σύνδεσμο σύνδεσμο

Page 100: ΗΜΜΥ 1 1 1

Απλά συνδεδεμένες λίστεςΑπλά συνδεδεμένες λίστες ((ii)ii)

Παράδειγμα: λίστα ακεραίωνΠαράδειγμα: λίστα ακεραίων

struct node_tag {struct node_tag { int data;int data; struct node_tag * next;struct node_tag * next;};};

typedef struct node_tagtypedef struct node_tag Node, * LinkedList; Node, * LinkedList;

Κενή λίσταΚενή λίστα

Page 101: ΗΜΜΥ 1 1 1

Απλά συνδεδεμένες λίστεςΑπλά συνδεδεμένες λίστες(i(iii)ii)

Προσθήκη στοιχείωνΠροσθήκη στοιχείων– απόφαση πούαπόφαση πού

θα προστεθείθα προστεθεί– δημιουργίαδημιουργία

νέου κόμβουνέου κόμβου– αντιγραφήαντιγραφή

πληροφορίαςπληροφορίας– σύνδεσησύνδεση

νέου κόμβουνέου κόμβου

ii

εδώ

Page 102: ΗΜΜΥ 1 1 1

Απλά συνδεδεμένες λίστεςΑπλά συνδεδεμένες λίστες(iv(iv))

Αφαίρεση στοιχείωνΑφαίρεση στοιχείων– απόφαση ποιοαπόφαση ποιο

στοιχείοστοιχείοθα αφαιρεθείθα αφαιρεθεί

– καταστροφήκαταστροφήκόμβουκόμβου

– σύνδεσησύνδεσηυπόλοιπωνυπόλοιπωνκόμβωνκόμβων

αυτό

Page 103: ΗΜΜΥ 1 1 1

ΟυρέςΟυρές (i)(i)

First In First Out (FIFO)First In First Out (FIFO)ό,τι μπαίνει πρώτο, βγαίνει πρώτοό,τι μπαίνει πρώτο, βγαίνει πρώτο

Ουρά ακεραίωνΟυρά ακεραίων– ΑΤΔ: ΑΤΔ: queuequeue– const queue queueEmpty;const queue queueEmpty;– void queueInsert (queue * qp, int t);void queueInsert (queue * qp, int t);– int queueRemove (queue * qp);int queueRemove (queue * qp);– int queueHead (queue q);int queueHead (queue q);

Page 104: ΗΜΜΥ 1 1 1

ΟυρέςΟυρές (ii)(ii)

Υλοποίηση με απλά συνδεδεμένη λίσταΥλοποίηση με απλά συνδεδεμένη λίστα

first last

Page 105: ΗΜΜΥ 1 1 1

Υλοποίηση ουράς σε Υλοποίηση ουράς σε CC ((i)i)

Υλοποίηση με απλά συνδεδεμένη λίσταΥλοποίηση με απλά συνδεδεμένη λίσταtypedef struct list_tag {typedef struct list_tag { int data;int data; struct list_tag * next;struct list_tag * next;} ListNode;} ListNode;

Τύπος Τύπος queuequeuetypedef struct {typedef struct { ListNode * first;ListNode * first; ListNode * last;ListNode * last;} queue;} queue;

Page 106: ΗΜΜΥ 1 1 1

Υλοποίηση ουράς σε Υλοποίηση ουράς σε CC ((ii)ii)Άδεια ουράΆδεια ουράconst queue queueEmpty = { NULL, NULL };const queue queueEmpty = { NULL, NULL };

Εισαγωγή στοιχείουΕισαγωγή στοιχείουvoid queueInsert (queue * qp, int t)void queueInsert (queue * qp, int t){{ ListNode * n = (ListNode *) ListNode * n = (ListNode *) malloc(sizeof(ListNode)); malloc(sizeof(ListNode));

if (n == NULL) {if (n == NULL) { printf("Out of memory\n");printf("Out of memory\n"); exit(1);exit(1); }}

Page 107: ΗΜΜΥ 1 1 1

Υλοποίηση ουράς σε Υλοποίηση ουράς σε CC ((iii)iii)

Εισαγωγή στοιχείου (συνέχεια)Εισαγωγή στοιχείου (συνέχεια)

n->data = t;n->data = t; n->next = NULL;n->next = NULL;

if (qp->last == NULL)if (qp->last == NULL) qp->first = qp->last = n;qp->first = qp->last = n; else {else { qp->last->next = n;qp->last->next = n; qp->last = n;qp->last = n; }}}}

Page 108: ΗΜΜΥ 1 1 1

Υλοποίηση ουράςΥλοποίηση ουράς ((iv)iv)Αφαίρεση στοιχείουΑφαίρεση στοιχείουint queueRemove (queue * qp)int queueRemove (queue * qp){{ ListNode * n;ListNode * n; int result;int result;

if (qp->first == NULL) {if (qp->first == NULL) { printf("Nothing to remove"printf("Nothing to remove" " from an empty queue\n");" from an empty queue\n"); exit(1);exit(1); }}

Page 109: ΗΜΜΥ 1 1 1

Υλοποίηση ουράςΥλοποίηση ουράς ((v)v)Αφαίρεση στοιχείου (συνέχεια)Αφαίρεση στοιχείου (συνέχεια) n = qp->first;n = qp->first; result = qp->first->data;result = qp->first->data; qp->first = qp->first->next;qp->first = qp->first->next; free(n);free(n);

if (qp->first == NULL)if (qp->first == NULL) qp->last = NULL;qp->last = NULL;

return result;return result;}}

Page 110: ΗΜΜΥ 1 1 1

Υλοποίηση ουράςΥλοποίηση ουράς ((vi)vi)Εξέταση στοιχείουΕξέταση στοιχείουint queueHead (queue q)int queueHead (queue q){{ if (q.first == NULL) {if (q.first == NULL) { fprintf(stderr, "Nothing to see"fprintf(stderr, "Nothing to see" " in an empty queue\n"); " in an empty queue\n");

exit(1);exit(1); }}

return q.first->data;return q.first->data;}}

Page 111: ΗΜΜΥ 1 1 1

ΣτοίβεςΣτοίβες (i)(i)

Last In First Out (LIFO)Last In First Out (LIFO)ό,τι μπαίνει τελευταίο, βγαίνει πρώτοό,τι μπαίνει τελευταίο, βγαίνει πρώτο

Στοίβα ακεραίωνΣτοίβα ακεραίων– ΑΤΔ: ΑΤΔ: stackstack– const stack stackEmpty;const stack stackEmpty;– void stackPush (stack * sp, int t);void stackPush (stack * sp, int t);– int stackPop (stack * sp);int stackPop (stack * sp);– int stackTop (stack s);int stackTop (stack s);

Page 112: ΗΜΜΥ 1 1 1

ΣτοίβεςΣτοίβες (ii)(ii)

Υλοποίηση με απλά συνδεδεμένη λίσταΥλοποίηση με απλά συνδεδεμένη λίστα

top

Page 113: ΗΜΜΥ 1 1 1

Υλοποίηση στοίβας σε Υλοποίηση στοίβας σε CC ((i)i)Τύπος Τύπος stackstacktypedef ListNode * stack;typedef ListNode * stack;

Άδεια στοίβαΆδεια στοίβαconst stack stackEmpty = NULL;const stack stackEmpty = NULL;

Εισαγωγή στοιχείουΕισαγωγή στοιχείουvoid stackPush (stack * sp, int t)void stackPush (stack * sp, int t){{ ListNode * n = (ListNode *)ListNode * n = (ListNode *) malloc(sizeof(ListNode)); malloc(sizeof(ListNode));

if (n == NULL) {if (n == NULL) { printf("Out of memory\n");printf("Out of memory\n"); exit(1);exit(1); }}

Page 114: ΗΜΜΥ 1 1 1

Υλοποίηση στοίβας σε Υλοποίηση στοίβας σε CC ((ii)ii)Εισαγωγή στοιχείου (συνέχεια)Εισαγωγή στοιχείου (συνέχεια) n->data = t;n->data = t; n->next = *sp;n->next = *sp; *sp = n;*sp = n;}}

Αφαίρεση στοιχείουΑφαίρεση στοιχείουint stackPop (stack * sp)int stackPop (stack * sp){{ ListNode * n;ListNode * n; int result;int result;

if (*sp == NULL) {if (*sp == NULL) { printf("Nothing to remove"printf("Nothing to remove" " from an empty stack\n");" from an empty stack\n"); exit(1);exit(1); }}

Page 115: ΗΜΜΥ 1 1 1

Υλοποίηση στοίβας σε Υλοποίηση στοίβας σε CC ((iii)iii)Αφαίρεση στοιχείου (συνέχεια)Αφαίρεση στοιχείου (συνέχεια) n = *sp;n = *sp; result = (*sp)->data;result = (*sp)->data; *sp = (*sp)->next;*sp = (*sp)->next; free(n);free(n); return result;return result;}}

Page 116: ΗΜΜΥ 1 1 1

Υλοποίηση στοίβας σε Υλοποίηση στοίβας σε CC ((iv)iv)Εξέταση στοιχείουΕξέταση στοιχείουint stackTop (stack s)int stackTop (stack s){{ if (s == NULL) {if (s == NULL) { printf("Nothing to see"printf("Nothing to see" " in an empty stack\n");" in an empty stack\n"); exit(1);exit(1); }}

return s->data;return s->data;}}

Page 117: ΗΜΜΥ 1 1 1

Διπλά συνδεδεμένες λίστεςΔιπλά συνδεδεμένες λίστες ((i)i)

first last

Επίσης γραμμικές διατάξειςΕπίσης γραμμικές διατάξειςΔυο σύνδεσμοι σε κάθε κόμβο, προς τον Δυο σύνδεσμοι σε κάθε κόμβο, προς τον επόμενοεπόμενο και προς τον και προς τον προηγούμενοπροηγούμενοΓενική μορφή, π.χ. για υλοποίηση ουράς:Γενική μορφή, π.χ. για υλοποίηση ουράς:

Page 118: ΗΜΜΥ 1 1 1

Διπλά συνδεδεμένες λίστεςΔιπλά συνδεδεμένες λίστες ((ii)ii)Τύπος κόμβου Τύπος κόμβου DListNodeDListNodetypedef struct DListNode_tag {typedef struct DListNode_tag { int data;int data; struct DListNode_tag * next;struct DListNode_tag * next; struct DListNode_tag * prev;struct DListNode_tag * prev;} DListNode;} DListNode;

Τύπος Τύπος dlistdlisttypedef struct {typedef struct { DListNode * first;DListNode * first; DListNode * last;DListNode * last;} dlist;} dlist;

Άδεια λίσταΆδεια λίσταconst dlist dlistEmpty = { NULL, NULL };const dlist dlistEmpty = { NULL, NULL };

Page 119: ΗΜΜΥ 1 1 1

Διπλά συνδεδεμένες λίστεςΔιπλά συνδεδεμένες λίστες((iii)iii)

Τύπος κόμβου Τύπος κόμβου DListNodeDListNodetypedef struct DListNode_tag {typedef struct DListNode_tag { int data;int data; struct struct DListNode_tag * next;DListNode_tag * next; struct struct DListNode_tag * prev;DListNode_tag * prev;} DListNode;} DListNode;

Τύπος Τύπος dlistdlisttypedef struct {typedef struct { DListNode * first;DListNode * first; DListNode * last;DListNode * last;} dlist;} dlist;

first last

Page 120: ΗΜΜΥ 1 1 1

Διπλά συνδεδεμένες λίστεςΔιπλά συνδεδεμένες λίστες((iv)iv)

Εισαγωγή στοιχείου στην αρχήΕισαγωγή στοιχείου στην αρχή

first last

Page 121: ΗΜΜΥ 1 1 1

Διπλά συνδεδεμένες λίστεςΔιπλά συνδεδεμένες λίστες ((v)v)Εισαγωγή στοιχείου στην αρχήΕισαγωγή στοιχείου στην αρχήvoid dlistInsert (dlist * lp, int t)void dlistInsert (dlist * lp, int t){{ DListNode * n = (DListNode *)DListNode * n = (DListNode *) malloc(sizeof(DListNode)); malloc(sizeof(DListNode));

if (n == NULL) {if (n == NULL) { fprintf(stderr, "Out of memory\n");fprintf(stderr, "Out of memory\n"); exit(1);exit(1); }}

n->data = t;n->data = t;

Page 122: ΗΜΜΥ 1 1 1

Διπλά συνδεδεμένες λίστεςΔιπλά συνδεδεμένες λίστες((vi)vi)

Εισαγωγή στοιχείου στην αρχή (συνέχεια)Εισαγωγή στοιχείου στην αρχή (συνέχεια) if (lp->first == NULL) {if (lp->first == NULL) { n->prev = n->next = NULL;n->prev = n->next = NULL; lp->first = lp->last = n;lp->first = lp->last = n; }} else {else { n->prev = NULL;n->prev = NULL; n->next = lp->first;n->next = lp->first; lp->first->prev = n;lp->first->prev = n; lp->first = n;lp->first = n; }}}}

Page 123: ΗΜΜΥ 1 1 1

Διπλά συνδεδεμένες λίστεςΔιπλά συνδεδεμένες λίστες((vii)vii)

if (lp->first == NULL) {if (lp->first == NULL) { n->prev = n->next = NULL;n->prev = n->next = NULL; lp->first = lp->last = n;lp->first = lp->last = n; }} else {else { n->prev = NULL;n->prev = NULL; n->next = lp->first;n->next = lp->first; lp->first->prev = n;lp->first->prev = n; lp->first = n;lp->first = n; }}}}

first last

n

Page 124: ΗΜΜΥ 1 1 1

Κυκλικές λίστεςΚυκλικές λίστες ((i)i)

Τύπος Τύπος clistclisttypedef struct {typedef struct { ListNode * first;ListNode * first; ListNode * last;ListNode * last;} clist;} clist;

Άδεια λίσταΆδεια λίσταconst clist clistEmpty = { NULL, NULL };const clist clistEmpty = { NULL, NULL };

first last

Page 125: ΗΜΜΥ 1 1 1

Κυκλικές λίστεςΚυκλικές λίστες ((ii)ii)Εισαγωγή στοιχείουΕισαγωγή στοιχείουvoid clistInsert (clist * lp, int t)void clistInsert (clist * lp, int t){{ ListNode * n = (ListNode *)ListNode * n = (ListNode *) malloc(sizeof(ListNode)); malloc(sizeof(ListNode));

if (n == NULL) {if (n == NULL) { fprintf(stderr, "Out of memory\n");fprintf(stderr, "Out of memory\n"); exit(1);exit(1); }}

n->data = t;n->data = t;

Page 126: ΗΜΜΥ 1 1 1

Κυκλικές λίστεςΚυκλικές λίστες ((iii)iii)Εισαγωγή στοιχείου (συνέχεια)Εισαγωγή στοιχείου (συνέχεια) if (lp->first == NULL) {if (lp->first == NULL) { lp->first = lp->last = n;lp->first = lp->last = n; n->next = n;n->next = n; }} else {else { n->next = lp->first;n->next = lp->first; lp->last->next = n;lp->last->next = n; lp->last = n;lp->last = n; }}}}

Page 127: ΗΜΜΥ 1 1 1

Κυκλικές λίστεςΚυκλικές λίστες ((iv)iv)

if (lp->first == NULL) {if (lp->first == NULL) { lp->first = lp->last = n;lp->first = lp->last = n; n->next = n;n->next = n; }} else {else { n->next = lp->first;n->next = lp->first; lp->last->next = n;lp->last->next = n; lp->last = n;lp->last = n; }}}} first last n

Page 128: ΗΜΜΥ 1 1 1

Κυκλικές λίστεςΚυκλικές λίστες ((v)v)Αφαίρεση στοιχείουΑφαίρεση στοιχείουint clistRemove (clist * lp)int clistRemove (clist * lp){{ int result;int result;

if (lp->first == NULL) {if (lp->first == NULL) { fprintf(stderr, "Nothing to remove"fprintf(stderr, "Nothing to remove" " from empty list\n"); " from empty list\n");

exit(1);exit(1); }}

result = lp->first->data;result = lp->first->data;

Page 129: ΗΜΜΥ 1 1 1

Κυκλικές λίστεςΚυκλικές λίστες ((vi)vi)Αφαίρεση στοιχείου (συνέχεια)Αφαίρεση στοιχείου (συνέχεια) if (lp->first == lp->last) {if (lp->first == lp->last) { free(lp->first);free(lp->first); lp->first = lp->last = NULL;lp->first = lp->last = NULL; }} else {else { lp->first = lp->first->next;lp->first = lp->first->next; free(lp->last->next);free(lp->last->next); lp->last->next = lp->first;lp->last->next = lp->first; }}

return result;return result;}}

Page 130: ΗΜΜΥ 1 1 1

Κυκλικές λίστεςΚυκλικές λίστες ((vii)vii)if (lp->first == lp->last) {if (lp->first == lp->last) { free(lp->first);free(lp->first); lp->first = lp->last = NULL;lp->first = lp->last = NULL; }} else {else { lp->first = lp->first->next;lp->first = lp->first->next; free(lp->last->next);free(lp->last->next); lp->last->next = lp->first;lp->last->next = lp->first; }}

return result;return result;}}

first last

Page 131: ΗΜΜΥ 1 1 1

Κυκλικές λίστεςΚυκλικές λίστες ((viii)viii)Εκτύπωση στοιχείωνΕκτύπωση στοιχείων ( (λάθος!)λάθος!)void clistPrint (clist l)void clistPrint (clist l){{ ListNode * n;ListNode * n;

for (n = l.first; n != NULL;for (n = l.first; n != NULL; n = n->next) { n = n->next) {

printf("%d\n", n->data);printf("%d\n", n->data); }}}}

Page 132: ΗΜΜΥ 1 1 1

Κυκλικές λίστεςΚυκλικές λίστες ((ix)ix)Εκτύπωση στοιχείων (σωστό!)Εκτύπωση στοιχείων (σωστό!)void clistPrint (clist l)void clistPrint (clist l){{ ListNode * n;ListNode * n;

for (n = l.first; n != NULL;for (n = l.first; n != NULL; n = n->next) { n = n->next) {

printf("%d\n", n->data);printf("%d\n", n->data); if (n->next == l.first)if (n->next == l.first) break;break; }}}}

Page 133: ΗΜΜΥ 1 1 1

Ταξινομημένες λίστεςΤαξινομημένες λίστες ((i)i)Τύπος Τύπος slistslisttypedef ListNode * slist;typedef ListNode * slist;

Άδεια λίσταΆδεια λίσταconst slist slistEmpty = NULL;const slist slistEmpty = NULL;

Εισαγωγή στοιχείουΕισαγωγή στοιχείουvoid slistInsert (slist * lp, int t)void slistInsert (slist * lp, int t){{ ListNode * n = (ListNode *)ListNode * n = (ListNode *) malloc(sizeof(ListNode)); malloc(sizeof(ListNode));

if (n == NULL) {if (n == NULL) { printf("Out of memory\n");printf("Out of memory\n"); exit(1);exit(1); }}

Page 134: ΗΜΜΥ 1 1 1

Ταξινομημένες λίστεςΤαξινομημένες λίστες ((ii)ii)Εισαγωγή στοιχείου (συνέχεια)Εισαγωγή στοιχείου (συνέχεια) n->data = t;n->data = t;

while (*lp != NULL && (*lp)->data < t)while (*lp != NULL && (*lp)->data < t) lp = &((*lp)->next);lp = &((*lp)->next);

n->next = *lp;n->next = *lp; *lp = n;*lp = n;}}

12 19 24 50

n

20

lp

Page 135: ΗΜΜΥ 1 1 1

Ταξινομημένες λίστες Ταξινομημένες λίστες ((iii)iii)Αφαίρεση στοιχείουΑφαίρεση στοιχείουvoid slistRemove (slist * lp, int t)void slistRemove (slist * lp, int t){{ ListNode * n;ListNode * n;

while (*lp != NULL && (*lp)->data < t)while (*lp != NULL && (*lp)->data < t) lp = &((*lp)->next);lp = &((*lp)->next);

if (*lp == NULL) {if (*lp == NULL) { printf(”%d was not found\n”, t);printf(”%d was not found\n”, t); exit(1);exit(1); }}

n = *lp;n = *lp; *lp = (*lp)->next;*lp = (*lp)->next; free(n);free(n);}}

Page 136: ΗΜΜΥ 1 1 1

lp

Ταξινομημένες λίστες Ταξινομημένες λίστες ((iv)iv)void slistRemove (slist * lp, int t)void slistRemove (slist * lp, int t)

{{ ListNode * n;ListNode * n;

while (*lp != NULL && (*lp)->data < t)while (*lp != NULL && (*lp)->data < t) lp = &((*lp)->next);lp = &((*lp)->next);

if (*lp == NULL) {if (*lp == NULL) { printf(”%d was not found\n”, t);printf(”%d was not found\n”, t); exit(1);exit(1); }}

n = *lp;n = *lp; *lp = (*lp)->next;*lp = (*lp)->next; free(n);free(n);}}

12 19 24 50

t=24n

Page 137: ΗΜΜΥ 1 1 1

Παράμετροι του προγράμματοςΠαράμετροι του προγράμματος(i)(i)

Επικεφαλίδα του προγράμματοςΕπικεφαλίδα του προγράμματοςint main (int argc, char * argv[]);int main (int argc, char * argv[]);

ΠαράμετροιΠαράμετροι– argcargc ο ο αριθμός των παραμέτρωναριθμός των παραμέτρων– argvargv[i][i] η η i-i-οστή παράμετροςοστή παράμετρος– argvargv[0][0] το όνομα του προγράμματοςτο όνομα του προγράμματος

ΑποτέλεσμαΑποτέλεσμα– ακέραιος αριθμός που επιστρέφεται στο ακέραιος αριθμός που επιστρέφεται στο

λειτουργικό σύστημαλειτουργικό σύστημα– συνήθως 0 για επιτυχή τερματισμόσυνήθως 0 για επιτυχή τερματισμό

Page 138: ΗΜΜΥ 1 1 1

Παράμετροι του προγράμματοςΠαράμετροι του προγράμματος((iii)i)

ΠαράδειγμαΠαράδειγμα

int main (int argc, char * argv[])int main (int argc, char * argv[]){{ int i;int i;

printf("Program %s called with "printf("Program %s called with " "%d parameters:\n", argv[0],"%d parameters:\n", argv[0], argc-1);argc-1); for (i = 1; i < argc; i++)for (i = 1; i < argc; i++) printf(" %s", argv[i]);printf(" %s", argv[i]); printf("\nand will return 0\n");printf("\nand will return 0\n");

return 0;return 0;}}

Page 139: ΗΜΜΥ 1 1 1

Συναρτήσεις εισόδου-εξόδουΣυναρτήσεις εισόδου-εξόδου (i)(i)

Βασικές συναρτήσεις εισόδου-εξόδουΒασικές συναρτήσεις εισόδου-εξόδουint printf (const char * format, ...);int printf (const char * format, ...);

int scanf (const char * format, ...);int scanf (const char * format, ...);

Ειδικοί χαρακτήρες στο Ειδικοί χαρακτήρες στο formatformat– Ακέραιοι αριθμοίΑκέραιοι αριθμοί

%d%d στοστο δεκαδικό σύστημαδεκαδικό σύστημα

%u%u χωρίς πρόσημο στοχωρίς πρόσημο στο δεκαδικό σύστημαδεκαδικό σύστημα

%o%o χωρίς πρόσημο στοχωρίς πρόσημο στο οκταδικό σύστημαοκταδικό σύστημα

%x %x χωρίς πρόσημο στο δεκαεξαδικό σύστημαχωρίς πρόσημο στο δεκαεξαδικό σύστημα

Page 140: ΗΜΜΥ 1 1 1

Συναρτήσεις εισόδου-εξόδουΣυναρτήσεις εισόδου-εξόδου (ii)(ii)

Ειδικοί χαρακτήρες στο Ειδικοί χαρακτήρες στο formatformat– Αριθμοί κινητής υποδιαστολήςΑριθμοί κινητής υποδιαστολής%f%f σε μορφή: σε μορφή: [-][-]ddd.ddddddddd.dddddd

%e%e σε μορφή: σε μορφή: [-][-]ddd.dddddd e [+/-]dddddd.dddddd e [+/-]ddd

%g%g σε μορφή σε μορφή %f%f ή ή %%ee

– Άλλοι τύποιΆλλοι τύποι%c%c χαρακτήρεςχαρακτήρες

%s%s συμβολοσειρέςσυμβολοσειρές

%p%p δείκτεςδείκτες

Page 141: ΗΜΜΥ 1 1 1

Συναρτήσεις εισόδου-εξόδουΣυναρτήσεις εισόδου-εξόδου(iii)(iii)

Παραλλαγές στο Παραλλαγές στο formatformat– Μέγεθος αριθμώνΜέγεθος αριθμών%h%h αριθμοί αριθμοί shortshort π.χ. π.χ. %%hdhd, , %hx%hx

%l%l αριθμοί αριθμοί longlong ή ή doubledouble π.χ. π.χ. %ld%ld, , %lf%lf

%L%L αριθμοί αριθμοί long doublelong double π.χ. π.χ. %Lf%Lf

– Μήκος αποτελέσματοςΜήκος αποτελέσματος%8d%8d αριθμός σε μήκος 8 χαρακτήρωναριθμός σε μήκος 8 χαρακτήρων

%20s%20s συμβολοσειρά σε μήκος 20 χαρακτήρωνσυμβολοσειρά σε μήκος 20 χαρακτήρων

%+8d%+8d αριθμός σε μήκος 8 χαρακτήρων με αριθμός σε μήκος 8 χαρακτήρων με ++

%08d%08d αριθμός σε μήκος 8 χαρακτήρων, τα πρώτα αριθμός σε μήκος 8 χαρακτήρων, τα πρώτα 00

%-8d%-8d όπως το όπως το %8d%8d με στοίχιση αριστεράμε στοίχιση αριστερά

Page 142: ΗΜΜΥ 1 1 1

Συναρτήσεις εισόδου-εξόδουΣυναρτήσεις εισόδου-εξόδου(iv)(iv)

Είσοδος-έξοδος χαρακτήρωνΕίσοδος-έξοδος χαρακτήρωνint putchar (int c);int putchar (int c);

int getchar ();int getchar ();

Είσοδος-έξοδος συμβολοσειρώνΕίσοδος-έξοδος συμβολοσειρώνint puts (const char * s);int puts (const char * s);

char * gets (char * s);char * gets (char * s);

Έλεγχος τέλους δεδομένωνΈλεγχος τέλους δεδομένωνint eof ();int eof ();

– Η σταθερά Η σταθερά EOFEOF παριστάνει το τέλος των δεδομένων παριστάνει το τέλος των δεδομένων και έχει τύπο και έχει τύπο intint..

Page 143: ΗΜΜΥ 1 1 1

ΠαράδειγμαΠαράδειγμα

Αντιγραφή δεδομένωνΑντιγραφή δεδομένων– οι χαρακτήρες που διαβάζονται εκτυπώνονται, οι χαρακτήρες που διαβάζονται εκτυπώνονται,

μέχρι να παρουσιαστεί τέλος δεδομένωνμέχρι να παρουσιαστεί τέλος δεδομένων

void main ()void main (){{ int c;int c;

while ((c = getchar()) != EOF)while ((c = getchar()) != EOF) putchar(c);putchar(c);}}

Page 144: ΗΜΜΥ 1 1 1

Συναρτήσεις διαχείρισης Συναρτήσεις διαχείρισης αρχείωναρχείων (i)(i)

Τύπος αρχείουΤύπος αρχείουFILE * fp;FILE * fp;

Άνοιγμα αρχείωνΆνοιγμα αρχείωνFILE * fopen (const char * filename,FILE * fopen (const char * filename, const char * mode); const char * mode);

– Παράμετρος Παράμετρος modemoderr ανάγνωση (read)ανάγνωση (read)ww εγγραφή (εγγραφή (write)write)aa προσθήκη (προσθήκη (append)append)tt κείμενο (κείμενο (text)text)bb δυαδικά δεδομένα (δυαδικά δεδομένα (binary)binary)

Page 145: ΗΜΜΥ 1 1 1

Συναρτήσεις διαχείρισης Συναρτήσεις διαχείρισης αρχείωναρχείων (ii)(ii)

Κλείσιμο αρχείωνΚλείσιμο αρχείωνint fclose (FILE * fp);int fclose (FILE * fp);

Είσοδος-έξοδος χαρακτήρωνΕίσοδος-έξοδος χαρακτήρωνint fputc (int c, FILE * fp);int fputc (int c, FILE * fp);

int fgetc (FILE * fp);int fgetc (FILE * fp);

Είσοδος-έξοδος συμβολοσειρώνΕίσοδος-έξοδος συμβολοσειρώνint fputs (const char * s, FILE * fp);int fputs (const char * s, FILE * fp);

char * fgets (char * s, int n,char * fgets (char * s, int n, FILE * fp); FILE * fp);

Page 146: ΗΜΜΥ 1 1 1

Συναρτήσεις διαχείρισης Συναρτήσεις διαχείρισης αρχείωναρχείων (iii)(iii)

Βασικές συναρτήσεις εισόδου-εξόδουΒασικές συναρτήσεις εισόδου-εξόδουint fprintf (FILE * fp,int fprintf (FILE * fp, const char * format, ...); const char * format, ...);

int fscanf (FILE * fp,int fscanf (FILE * fp, const char * format, ...); const char * format, ...);

Έλεγχος τέλους αρχείουΈλεγχος τέλους αρχείουint feof (FILE * fp);int feof (FILE * fp);

Page 147: ΗΜΜΥ 1 1 1

Συναρτήσεις διαχείρισης Συναρτήσεις διαχείρισης αρχείωναρχείων (iv)(iv)

Είσοδος-έξοδος πολλών δεδομένωνΕίσοδος-έξοδος πολλών δεδομένωνsize_t fwrite (const void * p,size_t fwrite (const void * p,size_t size, size_t num, FILE * fp);size_t size, size_t num, FILE * fp);

size_t fread (void * p,size_t fread (void * p,size_t size, size_t num, FILE * fp);size_t size, size_t num, FILE * fp);

– Ο ακέραιος τύπος Ο ακέραιος τύπος size_tsize_t χρησιμοποιείται για χρησιμοποιείται για τη μέτρηση χώρου μνήμης σε τη μέτρηση χώρου μνήμης σε bytes.bytes.

Page 148: ΗΜΜΥ 1 1 1

ΠαράδειγμαΠαράδειγμα (i)(i)

Αντιγραφή δυαδικών αρχείωνΑντιγραφή δυαδικών αρχείωνint main (int argc, char * argv[])int main (int argc, char * argv[]){{ FILE * fin, * fout;FILE * fin, * fout; unsigned char buffer[1000];unsigned char buffer[1000]; size_t count;size_t count;

fin = fopen(argv[1], "rb");fin = fopen(argv[1], "rb"); if (fin == NULL)if (fin == NULL) return 1;return 1;

fout = fopen(argv[2], "wb");fout = fopen(argv[2], "wb"); if (fout == NULL)if (fout == NULL) return 2;return 2;

Page 149: ΗΜΜΥ 1 1 1

ΠαράδειγμαΠαράδειγμα (ii)(ii)

(συνεχίζεται)(συνεχίζεται) while (!feof(fin)) {while (!feof(fin)) { count = fread(buffer, 1,count = fread(buffer, 1, 1000, fin); 1000, fin);

fwrite(buffer, 1, count, fout);fwrite(buffer, 1, count, fout); }}

fclose(fin);fclose(fin); fclose(fout);fclose(fout);

return 0;return 0;}}

Page 150: ΗΜΜΥ 1 1 1

Συναρτήσεις βιβλιοθήκηςΣυναρτήσεις βιβλιοθήκης (i)(i)

Είσοδος και έξοδος Είσοδος και έξοδος <stdio.h><stdio.h>– Περιέχει όλες τις συναρτήσεις εισόδου-εξόδουΠεριέχει όλες τις συναρτήσεις εισόδου-εξόδου– Προκαθορισμένα αρχείαΠροκαθορισμένα αρχείαFILE * FILE * stdinstdin;; τυπική είσοδοςτυπική είσοδοςFILE * FILE * stdoutstdout;; τυπική έξοδοςτυπική έξοδοςFILE * FILE * stderrstderr;; τυπική έξοδος σφαλμάτωντυπική έξοδος σφαλμάτων

– ΙσοδυναμίεςΙσοδυναμίεςprintf(...) printf(...) fprintf(stdout, ...) fprintf(stdout, ...)scanf(...) scanf(...) fscanf(stdin, ...) fscanf(stdin, ...)κ.λπ.κ.λπ.

– Συναρτήσεις διαχείρισης αρχείων με Συναρτήσεις διαχείρισης αρχείων με τυχαία τυχαία πρόσβασηπρόσβαση ( (random access)random access)

Page 151: ΗΜΜΥ 1 1 1

Συναρτήσεις βιβλιοθήκηςΣυναρτήσεις βιβλιοθήκης (ii)(ii)

Διαχείριση συμβολοσειρών Διαχείριση συμβολοσειρών <string.h><string.h>– size_t strlen (const char * s);size_t strlen (const char * s);

Μέτρηση αριθμού χαρακτήρων της συμβολοσειράς Μέτρηση αριθμού χαρακτήρων της συμβολοσειράς ss..– char * strcpy (char * s1,char * strcpy (char * s1, const char * s2); const char * s2);Αντιγραφή της συμβολοσειράς Αντιγραφή της συμβολοσειράς s2s2 στην στην s1s1..

– char * strcat (char * s1,char * strcat (char * s1, const char * s2); const char * s2);Προσθήκη της συμβολοσειράς Προσθήκη της συμβολοσειράς s2s2 στο τέλος της στο τέλος της s1s1..

– int strcmp (const char * s1,int strcmp (const char * s1, const char * s2);const char * s2);

Σύγκριση των συμβολοσειρών Σύγκριση των συμβολοσειρών s1s1 και και s2s2..

Page 152: ΗΜΜΥ 1 1 1

Συναρτήσεις βιβλιοθήκηςΣυναρτήσεις βιβλιοθήκης (iii)(iii)

Μετατροπή συμβολοσειρών Μετατροπή συμβολοσειρών <stdlib.h><stdlib.h>– int atoi (const char * s);int atoi (const char * s);

Μετατροπή της συμβολοσειράς Μετατροπή της συμβολοσειράς ss σε σε intint..

– long int atol (const char * s);long int atol (const char * s);Μετατροπή της συμβολοσειράς Μετατροπή της συμβολοσειράς ss σε σε long intlong int..

– double atof (const char * s);double atof (const char * s);Μετατροπή της συμβολοσειράς Μετατροπή της συμβολοσειράς ss σε σε doubledouble..

Page 153: ΗΜΜΥ 1 1 1

ΠαράδειγμαΠαράδειγμα

Μια δυνατή υλοποίηση της Μια δυνατή υλοποίηση της strcmpstrcmpint strcmp (const char * s1,int strcmp (const char * s1, const char * s2)const char * s2){{ while (*s1 == *s2 && *s1 != '\0')while (*s1 == *s2 && *s1 != '\0') { s1++; s2++; }{ s1++; s2++; }

return (*s1)-(*s2);return (*s1)-(*s2);}}

– Υπόθεση:Υπόθεση: οι τιμές του τύπου οι τιμές του τύπου char char είναι στο είναι στο διάστημα 0-255 (όχι αρνητικές)διάστημα 0-255 (όχι αρνητικές)

while (*s1 && *s1++ == *s2++);

Page 154: ΗΜΜΥ 1 1 1

Προεπεξεργαστής Προεπεξεργαστής ((preprocessor)preprocessor)(i)(i)

Εντολή Εντολή #include#include#include <stdio.h>#include <stdio.h>

#include "myheader.h"#include "myheader.h"

Εντολή Εντολή #define#define#define MAX_CHARS 1000#define MAX_CHARS 1000

char s[MAX_CHARS];char s[MAX_CHARS];

#define INC(x) ((x)++)#define INC(x) ((x)++)

INC(a);INC(a);

INC(*p);INC(*p);

Page 155: ΗΜΜΥ 1 1 1

Προεπεξεργαστής Προεπεξεργαστής ((preprocessor)preprocessor)(ii)(ii)

Εντολές Εντολές #ifdef,#ifdef, #ifndef, #else #ifndef, #else και και #endif#endif#define DEBUG#define DEBUG

#ifdef DEBUG#ifdef DEBUG

printf("debugging is on\n");printf("debugging is on\n");

#else#else

printf("debugging is off\n")printf("debugging is off\n")

#endif#endif

#ifndef DEBUG#ifndef DEBUG

printf("optimizations allowed\n");printf("optimizations allowed\n");

#endif#endif

Page 156: ΗΜΜΥ 1 1 1

Δυαδικά δένδραΔυαδικά δένδρα ((i)i)Binary treesBinary treesΔυο σύνδεσμοι σε κάθε κόμβοΔυο σύνδεσμοι σε κάθε κόμβο– αριστερόαριστερό και και δεξίδεξί παιδί παιδί

Κάθε κόμβος έχειΚάθε κόμβος έχει0, 1 ή 20, 1 ή 2 παιδιά παιδιάΡίζαΡίζα: ο αρχικός κόμβος : ο αρχικός κόμβος του δένδρουτου δένδρουΦύλλαΦύλλα: κόμβοι χωρίς : κόμβοι χωρίς παιδιάπαιδιάΒάθοςΒάθος κόμβου: αριθμός κόμβου: αριθμός συνδέσμων από τη ρίζασυνδέσμων από τη ρίζα

Page 157: ΗΜΜΥ 1 1 1

Δυαδικά δένδραΔυαδικά δένδρα ((ii)ii)Τύπος κόμβου Τύπος κόμβου TreeNodeTreeNodetypedef struct TreeNode_tag {typedef struct TreeNode_tag { int data;int data; struct TreeNode_tag * left;struct TreeNode_tag * left; struct TreeNode_tag * right;struct TreeNode_tag * right;} TreeNode;} TreeNode;

Τύπος Τύπος treetreetypedef TreeNode * tree;typedef TreeNode * tree;

Κενό δένδροΚενό δένδροconst tree treeEmpty = NULL;const tree treeEmpty = NULL;

Page 158: ΗΜΜΥ 1 1 1

Δυαδικά δένδραΔυαδικά δένδρα ((iii)iii)Εισαγωγή σε δένδραΕισαγωγή σε δένδρα– Καθοριστική απόφαση: σε ποιο σημείο του Καθοριστική απόφαση: σε ποιο σημείο του

δένδρου θα εισαχθεί ο νέος κόμβοςδένδρου θα εισαχθεί ο νέος κόμβος– Ισοζυγισμένα δένδραΙσοζυγισμένα δένδρα ( (balanced trees): balanced trees): το το

βάθος δυο φύλλων διαφέρει το πολύ κατά 1βάθος δυο φύλλων διαφέρει το πολύ κατά 1

Συνάρτηση μέγιστου βάθουςΣυνάρτηση μέγιστου βάθουςint treeDepth (tree t)int treeDepth (tree t){{ if (t == NULL) return 0;if (t == NULL) return 0; return 1 + max(treeDepth(t->left),return 1 + max(treeDepth(t->left), treeDepth(t->right)); treeDepth(t->right)); }}

Page 159: ΗΜΜΥ 1 1 1

Δυαδικά δένδραΔυαδικά δένδρα ((iv)iv)Εισαγωγή σε ισοζυγισμένα δένδραΕισαγωγή σε ισοζυγισμένα δένδραvoid treeBalancedInsert (tree * t, int d)void treeBalancedInsert (tree * t, int d){{ if (*t == NULL) {if (*t == NULL) { *t = (TreeNode *)*t = (TreeNode *) malloc(sizeof(TreeNode)); malloc(sizeof(TreeNode));

if (*t == NULL) {if (*t == NULL) { printf("Out of memory\n");printf("Out of memory\n"); exit(1);exit(1); }}

(*t)->data = d;(*t)->data = d; (*t)->left = (*t)->right = NULL;(*t)->left = (*t)->right = NULL; }}

Page 160: ΗΜΜΥ 1 1 1

Δυαδικά δένδραΔυαδικά δένδρα ((v)v)Εισαγωγή σε ισοζυγισμένα δένδρα Εισαγωγή σε ισοζυγισμένα δένδρα (συνέχεια)(συνέχεια) else {else { int d1 = treeDepth((*t)->left);int d1 = treeDepth((*t)->left); int d2 = treeDepth((*t)->right);int d2 = treeDepth((*t)->right);

if (d1 <= d2)if (d1 <= d2) treeBalancedInsert(treeBalancedInsert( &((*t)->left), d); &((*t)->left), d);

elseelse treeBalancedInsert(treeBalancedInsert( &((*t)->right), d); &((*t)->right), d);

}}}}

Page 161: ΗΜΜΥ 1 1 1

Δένδρα γενικής μορφήςΔένδρα γενικής μορφής

Κάθε κόμβος Κάθε κόμβος kk έχειέχει nnkk

απογόνους,απογόνους, όπου όπου nnkkΝΝ

1

2 3 4

65 7

Κωδικοποίηση με δυαδικά δένδραΚωδικοποίηση με δυαδικά δένδρα

1

2

3

4

5

7

6

Page 162: ΗΜΜΥ 1 1 1

Σειρά με την οποία διασχίζονται οι κόμβοιΣειρά με την οποία διασχίζονται οι κόμβοι– κατά κατά βάθοςβάθος ( (depth first)depth first)– κατά κατά πλάτοςπλάτος (breadth first) (breadth first)

Διάσχιση δυαδικών δένδρωνΔιάσχιση δυαδικών δένδρων ((i)i)

42

10 50

7 55

523012

14

Κατά βάθοςΚατά βάθος42, 10, 7, 14, 12, 42, 10, 7, 14, 12,

30, 50, 55, 5230, 50, 55, 52

Κατά πλάτοςΚατά πλάτος42, 10, 50, 7, 14, 42, 10, 50, 7, 14,

55, 12, 30, 5255, 12, 30, 52

Page 163: ΗΜΜΥ 1 1 1

Διάσχιση δυαδικών δένδρωνΔιάσχιση δυαδικών δένδρων ((ii)ii)Εκτύπωση κατά βάθοςΕκτύπωση κατά βάθος– πολύ απλά, με χρήση αναδρομήςπολύ απλά, με χρήση αναδρομής

ΥλοποίησηΥλοποίησηvoid treePrintDF (tree t)void treePrintDF (tree t){{ if (t != NULL) {if (t != NULL) { printf("%d ", t->data);printf("%d ", t->data); treePrintDF(t->left);treePrintDF(t->left); treePrintDF(t->right);treePrintDF(t->right); }}}}

Page 164: ΗΜΜΥ 1 1 1

Διάσχιση δυαδικών δένδρωνΔιάσχιση δυαδικών δένδρων((iii)iii)

Εκτύπωση κατά πλάτοςΕκτύπωση κατά πλάτος– με τη βοήθεια με τη βοήθεια ουράςουράς για την αποθήκευση για την αποθήκευση

δεικτών προς τους κόμβους που δεν έχουμε δεικτών προς τους κόμβους που δεν έχουμε επισκεφθείεπισκεφθεί

ΥλοποίησηΥλοποίηση

void treePrintBF (tree t)void treePrintBF (tree t){{ queue q = queueEmpty;queue q = queueEmpty;

if (t != NULL)if (t != NULL) queueInsert(&q, t);queueInsert(&q, t);

Page 165: ΗΜΜΥ 1 1 1

Διάσχιση δυαδικών δένδρωνΔιάσχιση δυαδικών δένδρων((iv)iv)

Εκτύπωση κατά πλάτος, υλοποίηση Εκτύπωση κατά πλάτος, υλοποίηση (συνέχεια)(συνέχεια)

while (!queueIsEmpty(q)) {while (!queueIsEmpty(q)) { TreeNode * n = queueRemove(&q);TreeNode * n = queueRemove(&q);

printf("%d ", n->data);printf("%d ", n->data); if (n->left != NULL)if (n->left != NULL) queueInsert(&q, n->left);queueInsert(&q, n->left); if (n->right != NULL)if (n->right != NULL) queueInsert(&q, n->right);queueInsert(&q, n->right); }}}}

Page 166: ΗΜΜΥ 1 1 1

Αριθμητικές εκφράσειςΑριθμητικές εκφράσεις ((i)i)

ΠαράδειγμαΠαράδειγμα3 * (24 / 2) + (9 - 3)3 * (24 / 2) + (9 - 3)

Παράσταση σε μορφήΠαράσταση σε μορφήδυαδικού δένδρουδυαδικού δένδρου– οι οι αριθμοίαριθμοί

στα φύλλαστα φύλλα– οι οι τελεστέςτελεστές στους στους

υπόλοιπους κόμβουςυπόλοιπους κόμβους

+

* –

3 3

224

/ 9

Διάσχιση κατά βάθοςΔιάσχιση κατά βάθος

Page 167: ΗΜΜΥ 1 1 1

Αριθμητικές εκφράσειςΑριθμητικές εκφράσεις ((ii)ii)

ΕνθεματικήΕνθεματική παράσταση παράσταση– infix notationinfix notation– ο τελεστής ανάμεσα σταο τελεστής ανάμεσα στα

τελούμενατελούμενα– διφορούμενη:διφορούμενη:

χρειάζονταιχρειάζονταιπαρενθέσειςπαρενθέσεις

– η συνήθης μορφήη συνήθης μορφήγια τον άνθρωπογια τον άνθρωπο

ΑποτέλεσμαΑποτέλεσμα(3 * (24 / 2)) + (9 - 3)(3 * (24 / 2)) + (9 - 3)

+

* –

3 3

224

/ 9

Page 168: ΗΜΜΥ 1 1 1

Αριθμητικές εκφράσειςΑριθμητικές εκφράσεις ((iii)iii)

ΠροθεματικήΠροθεματική παράσταση παράσταση– prefix notationprefix notation– ο τελεστής πριν ταο τελεστής πριν τα

τελούμενατελούμενα– όχι διφορούμενη,όχι διφορούμενη,

δε χρειάζονταιδε χρειάζονταιπαρενθέσειςπαρενθέσεις

– απλή μηχανικήαπλή μηχανικήανάγνωσηανάγνωση

ΑποτέλεσμαΑποτέλεσμα+ * 3 / 24 2 - 9 3+ * 3 / 24 2 - 9 3

+

* –

3 3

224

/ 9

Page 169: ΗΜΜΥ 1 1 1

Αριθμητικές εκφράσειςΑριθμητικές εκφράσεις ((iv)iv)

ΕπιθεματικήΕπιθεματική παράσταση παράσταση– postfix notationpostfix notation– ο τελεστής μετά ταο τελεστής μετά τα

τελούμενατελούμενα– όχι διφορούμενη,όχι διφορούμενη,

δε χρειάζονταιδε χρειάζονταιπαρενθέσειςπαρενθέσεις

– απλή μηχανικήαπλή μηχανικήαποτίμησηαποτίμηση

ΑποτέλεσμαΑποτέλεσμα3 24 2 / * 9 3 - +3 24 2 / * 9 3 - +

+

* –

3 3

224

/ 9

Page 170: ΗΜΜΥ 1 1 1

Υλοποίηση αριθμητικών Υλοποίηση αριθμητικών εκφράσεωνεκφράσεων

ΈκφρασηΈκφραση: δυαδικό δένδρο ειδικής μορφής: δυαδικό δένδρο ειδικής μορφήςΚόμβοι δύο ειδών:Κόμβοι δύο ειδών:– αριθμητικές σταθερές (φύλλα)αριθμητικές σταθερές (φύλλα)– τελεστές τελεστές ((με δύο τελούμεναμε δύο τελούμενα))

Πληροφορία:Πληροφορία:– τιμή σταθεράς, ήτιμή σταθεράς, ή– σύμβολο τελεστήσύμβολο τελεστή

Σύνδεσμοι:Σύνδεσμοι:– τελούμενατελούμενα

Page 171: ΗΜΜΥ 1 1 1

Κόμβος δένδρουΚόμβος δένδρου

typedef struct ExprNode_tag {typedef struct ExprNode_tag { enum { EXP_constenum { EXP_const, , EXP_binop } EXP_binop } codecode;; union {union { double double constantconstant;; struct {struct { char char opop;; struct ExprNode_tagstruct ExprNode_tag **arg1arg1, *, *arg2arg2;; } } binopbinop;; } } datadata;;} ExprNode, *expr;} ExprNode, *expr;

code

data

constant

ή

binop

op

arg1

arg2

Page 172: ΗΜΜΥ 1 1 1

Κατασκευή σταθερώνΚατασκευή σταθερών

expr exprConst (double constant)expr exprConst (double constant){{ ExprNode * e = (ExprNode *)ExprNode * e = (ExprNode *) malloc(sizeof(ExprNode));malloc(sizeof(ExprNode));

if (e == NULL) {if (e == NULL) { printf("Out of memory\n");printf("Out of memory\n"); exit(1);exit(1); }}

e->code = EXP_const;e->code = EXP_const; e->data.constant = constant;e->data.constant = constant; return e;return e;}}

code

data

constant

ή

binop

op

arg1

arg2

Page 173: ΗΜΜΥ 1 1 1

Κατασκευή εκφράσεων με Κατασκευή εκφράσεων με τελεστήτελεστή

expr exprBinop (expr arg1, char op,expr exprBinop (expr arg1, char op, expr arg2)expr arg2){{ ExprNode * e = (ExprNode *)ExprNode * e = (ExprNode *) malloc(sizeof(ExprNode));malloc(sizeof(ExprNode));

if (e == NULL) {if (e == NULL) { printf("Out of memory\n");printf("Out of memory\n"); exit(1);exit(1); }}

e->code = EXP_binop;e->code = EXP_binop; e->data.binop.op = op;e->data.binop.op = op; e->data.binop.arg1 = arg1;e->data.binop.arg1 = arg1; e->data.binop.arg2 = arg2;e->data.binop.arg2 = arg2; return e;return e;}}

code

data

constant

ή

binop

op

arg1

arg2

Page 174: ΗΜΜΥ 1 1 1

Παράδειγμα κατασκευήςΠαράδειγμα κατασκευής

Έκφραση: Έκφραση: 3 * (24 / 2) + (9 - 3)3 * (24 / 2) + (9 - 3)

+

* –

3 3

224

/ 9

expr e =expr e = exprBinop(exprBinop( exprBinop(exprBinop( exprConst(3),'*',exprConst(3),'*', exprBinop(exprBinop( exprConst(24), '/',exprConst(24), '/', exprConst(2)exprConst(2) )) ), '+',), '+', exprBinop(exprBinop( exprConst(9), '-',exprConst(9), '-', exprConst(3)exprConst(3) )) ););

Page 175: ΗΜΜΥ 1 1 1

Καταστροφή έκφρασηςΚαταστροφή έκφρασης

void exprFree (expr e)void exprFree (expr e){{ switch (e->code) {switch (e->code) { case EXP_binop:case EXP_binop: exprFree(e->data.binop.arg1);exprFree(e->data.binop.arg1); exprFree(e->data.binop.arg2);exprFree(e->data.binop.arg2); break;break; }} free(e);free(e);}}

code

data

constant

ή

binop

op

arg1

arg2

Page 176: ΗΜΜΥ 1 1 1

Εκτύπωση έκφρασηςΕκτύπωση έκφρασηςvoid exprPrint (expr e)void exprPrint (expr e){{ switch (e->code) {switch (e->code) { case EXP_const:case EXP_const: printf("%lg", e->data.constant);printf("%lg", e->data.constant); break;break; case EXP_binop:case EXP_binop: printf("(");printf("("); exprPrint(e->data.binop.arg1);exprPrint(e->data.binop.arg1); printf("%c", e->data.binop.op);printf("%c", e->data.binop.op); exprPrint(e->data.binop.arg2);exprPrint(e->data.binop.arg2); printf(")");printf(")"); break;break; }}}}

code

data

constant

ή

binop

op

arg1

arg2

Page 177: ΗΜΜΥ 1 1 1

Υπολογισμός έκφρασηςΥπολογισμός έκφρασης

double exprCalc (expr e)double exprCalc (expr e){{ switch (e->code) {switch (e->code) { case EXP_const:case EXP_const: return e->data.constant;return e->data.constant;

case EXP_binop:case EXP_binop: switch (e->data.binop.op) {switch (e->data.binop.op) { case '+':case '+': return exprCalc(e->data.return exprCalc(e->data. binop.arg1)binop.arg1) + exprCalc(e->data.+ exprCalc(e->data. binop.arg2);binop.arg2); case '-':case '-': ......

Page 178: ΗΜΜΥ 1 1 1

Δυαδικά δένδρα αναζήτησηςΔυαδικά δένδρα αναζήτησης ((i)i)Binary Binary search search treestreesΔυαδικά δένδρα με τιςΔυαδικά δένδρα με τιςπαρακάτω ιδιότητεςπαρακάτω ιδιότητεςγια κάθε κόμβο:για κάθε κόμβο:– όλοι οι κόμβοι τουόλοι οι κόμβοι του

αριστερούαριστερού παιδιού έχουν παιδιού έχουντιμές τιμές μικρότερες ή ίσεςμικρότερες ή ίσεςτης τιμής του κόμβουτης τιμής του κόμβου

– όλοι οι κόμβοι τουόλοι οι κόμβοι τουδεξιούδεξιού παιδιού έχουν παιδιού έχουντιμές τιμές μεγαλύτερες ή ίσεςμεγαλύτερες ή ίσεςτης τιμής του κόμβουτης τιμής του κόμβου

10

5 34

58

71

17

Page 179: ΗΜΜΥ 1 1 1

Δυαδικά δένδρα αναζήτησηςΔυαδικά δένδρα αναζήτησης ((ii)ii)Τα δυαδικά δένδρα αναζήτησηςΤα δυαδικά δένδρα αναζήτησηςδιευκολύνουν την αναζήτηση στοιχείωνδιευκολύνουν την αναζήτηση στοιχείωνΑναδρομική αναζήτησηΑναδρομική αναζήτηση– αν η τιμή που ζητείται είναι στη ρίζα, βρέθηκεαν η τιμή που ζητείται είναι στη ρίζα, βρέθηκε– αν είναι μικρότερη από την τιμή της ρίζας,αν είναι μικρότερη από την τιμή της ρίζας,

αρκεί να αναζητηθεί στο αριστερό παιδίαρκεί να αναζητηθεί στο αριστερό παιδί– αν είναι μεγαλύτερη από την τιμή της ρίζας,αν είναι μεγαλύτερη από την τιμή της ρίζας,

αρκεί να αναζητηθεί στο δεξί παιδίαρκεί να αναζητηθεί στο δεξί παιδί

Κόστος αναζήτησης: Κόστος αναζήτησης: O(log O(log nn))– υπό την προϋπόθεση το δένδρο να είναι υπό την προϋπόθεση το δένδρο να είναι

ισοζυγισμένοισοζυγισμένο

Page 180: ΗΜΜΥ 1 1 1

Δυαδικά δένδρα αναζήτησηςΔυαδικά δένδρα αναζήτησης((iii)iii)

ΑναζήτησηΑναζήτησηTreeNode * treeSearch (tree t, int key)TreeNode * treeSearch (tree t, int key){{ if (t == NULL)if (t == NULL) return NULL; /* not found */return NULL; /* not found */

if (t->data == key)if (t->data == key) return t; /* found */return t; /* found */

if (t->data > key)if (t->data > key) return treeSearch(t->left, key);return treeSearch(t->left, key); elseelse return treeSearch(t->right, key);return treeSearch(t->right, key);}}

Page 181: ΗΜΜΥ 1 1 1

Δείκτες σε συναρτήσειςΔείκτες σε συναρτήσεις

Παράδειγμα 1Παράδειγμα 1int f (int n);int f (int n);int (*p) (int n);int (*p) (int n);

p = &f;p = &f;printf("%d", (*p)(3));printf("%d", (*p)(3));

Παράδειγμα 2Παράδειγμα 2double (*q) (double) = &sqrt;double (*q) (double) = &sqrt;

Δείκτες ισοδύναμοι με συναρτήσειςΔείκτες ισοδύναμοι με συναρτήσεις

p = f;p = f;printf("%d", p(3));printf("%d", p(3));

Page 182: ΗΜΜΥ 1 1 1

ΟλοκλήρωσηΟλοκλήρωση

double integral (double a, double b,double integral (double a, double b, double (*f) (double))double (*f) (double)){{ const double step = 1e-6;const double step = 1e-6; double result = 0.0;double result = 0.0; double x;double x; for (x=a; x<=b; x += step)for (x=a; x<=b; x += step) result += f(x) * step;result += f(x) * step; return result;return result;}}

......

result = integral(0, 3.14159, sin);result = integral(0, 3.14159, sin);

κακόςαλγόριθμος!

Page 183: ΗΜΜΥ 1 1 1

Ταξινόμηση φυσαλίδαςΤαξινόμηση φυσαλίδας ((i)i)

Τα δεδομένα:Τα δεδομένα:– void * avoid * a πού βρίσκονταιπού βρίσκονται– int nint n πόσα είναιπόσα είναι– int sizeint size τί μέγεθος έχει καθένατί μέγεθος έχει καθένα– comparison fcomparison f πώς γίνεται η σύγκρισηπώς γίνεται η σύγκριση

Η σύγκριση των δεδομένωνΗ σύγκριση των δεδομένων

typedef int (*comparison) (void * x,typedef int (*comparison) (void * x, void * y);void * y);

Page 184: ΗΜΜΥ 1 1 1

Ταξινόμηση φυσαλίδαςΤαξινόμηση φυσαλίδας ((ii)ii)

void bsort (void * a, int n,void bsort (void * a, int n, comparison f, int size)comparison f, int size){{ int i, j;int i, j;

for (i = 0; i < n; i++)for (i = 0; i < n; i++) for (j = n-1; j > i; j--) {for (j = n-1; j > i; j--) { unsigned char * px =unsigned char * px = (unsigned char *) a +(unsigned char *) a + (j-1) * size;(j-1) * size; unsigned char * py =unsigned char * py = (unsigned char *) a +(unsigned char *) a + j * size;j * size;

Page 185: ΗΜΜΥ 1 1 1

Ταξινόμηση φυσαλίδαςΤαξινόμηση φυσαλίδας (i(iii)ii)

(συνέχεια)(συνέχεια)

if (f(px, py) > 0) {if (f(px, py) > 0) { int k;int k;

for (k = 0; k < size; k++) {for (k = 0; k < size; k++) { unsigned char temp = *px;unsigned char temp = *px; *px++ = *py;*px++ = *py; *py++ = temp;*py++ = temp; }} }} }}}}

Page 186: ΗΜΜΥ 1 1 1

Ταξινόμηση φυσαλίδαςΤαξινόμηση φυσαλίδας (iv(iv))

Συνάρτηση σύγκρισης για ακέραιουςΣυνάρτηση σύγκρισης για ακέραιους

int intcompare (void * x, void * y)int intcompare (void * x, void * y){{ return *((int *) x) - *((int *) y);return *((int *) x) - *((int *) y);}}

Κλήση για πίνακα ακεραίωνΚλήση για πίνακα ακεραίων

int x[] = { 44, 55, 12, 42, ... };int x[] = { 44, 55, 12, 42, ... };......bsort(x, n, intcompare, sizeof(int));bsort(x, n, intcompare, sizeof(int));

Page 187: ΗΜΜΥ 1 1 1

Δέντρα δυαδικής αναζήτησηςΔέντρα δυαδικής αναζήτησης

Δενδρικές δομές δεδομένων στις οποίεςΔενδρικές δομές δεδομένων στις οποίες– Ολα τα στοιχεία στο αριστερό υποδέντρο της Ολα τα στοιχεία στο αριστερό υποδέντρο της

ρίζας είναι μικρότερα από την ρίζαρίζας είναι μικρότερα από την ρίζα– Ολα τα στοιχεία στο δεξί υποδέντρο της ρίζας Ολα τα στοιχεία στο δεξί υποδέντρο της ρίζας

είναι μεγαλύτερα ή ίσα με την ρίζαείναι μεγαλύτερα ή ίσα με την ρίζα– Το αριστερό και το δεξί υποδέντρο είναι Το αριστερό και το δεξί υποδέντρο είναι

δέντρα δυαδικής αναζήτησηςδέντρα δυαδικής αναζήτησης

Binary Search Trees - BSTsBinary Search Trees - BSTs

Page 188: ΗΜΜΥ 1 1 1

Δέντρα δυαδικής αναζήτησηςΔέντρα δυαδικής αναζήτησης

Η γενική εικόνα ενός τέτοιου δέντρουΗ γενική εικόνα ενός τέτοιου δέντρου

>=

Page 189: ΗΜΜΥ 1 1 1

Παραδείγματα δέντρων Παραδείγματα δέντρων BSTBST

Εγκυρα δέντραΕγκυρα δέντρα

Page 190: ΗΜΜΥ 1 1 1

Παραδείγματα δέντρων Παραδείγματα δέντρων BSTBST

Μη-έγκυρα δέντραΜη-έγκυρα δέντρα

Page 191: ΗΜΜΥ 1 1 1

Διάσχιση δυαδικών δέντρων Διάσχιση δυαδικών δέντρων

– Preorder: 23 18 12 20 44 35 52Preorder: 23 18 12 20 44 35 52– Postorder: 12 20 18 35 52 44 23Postorder: 12 20 18 35 52 44 23– Inorder: 12 18 20 23 35 44 52Inorder: 12 18 20 23 35 44 52

Page 192: ΗΜΜΥ 1 1 1

Ζύγισμα δέντρων Ζύγισμα δέντρων BSTBST

Ανάλογα με τη σειρά άφιξης των στοιχείων Ανάλογα με τη σειρά άφιξης των στοιχείων και τον τρόπο δημιουργίας του δέντρου και τον τρόπο δημιουργίας του δέντρου BST, BST, για τα ίδια στοιχεία δεν προκύπτει για τα ίδια στοιχεία δεν προκύπτει πάντα το ίδιο δέντροπάντα το ίδιο δέντρο

Το ύψος του δέντρου σχετίζεται με το Το ύψος του δέντρου σχετίζεται με το χρόνο αναζήτησης ενός στοιχείου μέσα χρόνο αναζήτησης ενός στοιχείου μέσα στο δέντροστο δέντρο

Page 193: ΗΜΜΥ 1 1 1

Ζύγισμα δέντρων Ζύγισμα δέντρων BSTBST

Αναζήτηση με πολυπλοκότητα Αναζήτηση με πολυπλοκότητα – Από Ο(Ν)Από Ο(Ν) [χειρότερη περίπτωση][χειρότερη περίπτωση]

– Μέχρι Ο(Μέχρι Ο(LogLog22N)N) [καλύτερη περίπτωση] [καλύτερη περίπτωση]

Page 194: ΗΜΜΥ 1 1 1

Ζύγισμα δέντρων Ζύγισμα δέντρων BSTBST

Προκειμένου μια αναζήτηση να διατρέχει Προκειμένου μια αναζήτηση να διατρέχει όσο το δυνατόν μικρότερο μέρος του όσο το δυνατόν μικρότερο μέρος του δέντρου, αυτό πρέπει να είναι «ζυγισμένο»δέντρου, αυτό πρέπει να είναι «ζυγισμένο»– «Ζυγισμένο»: το βάθος του αριστερού «Ζυγισμένο»: το βάθος του αριστερού

υποδέντρου δεν διαφέρει περισσότερο από 1 υποδέντρου δεν διαφέρει περισσότερο από 1 από αυτό του δεξιού (ιδανικά: είναι ίσα)από αυτό του δεξιού (ιδανικά: είναι ίσα)

Αν κατά την προσθήκη νέων στοιχείων στο Αν κατά την προσθήκη νέων στοιχείων στο δέντρο η ζυγαριά «γείρει» δεξιά ή αριστερά, δέντρο η ζυγαριά «γείρει» δεξιά ή αριστερά, απαιτείται διόρθωση του δέντρουαπαιτείται διόρθωση του δέντρου

Page 195: ΗΜΜΥ 1 1 1

Παραδείγματα ζυγισμένων Παραδείγματα ζυγισμένων δέντρωνδέντρων

1

2

3

4

5

6

7

1

2

3

4

5

6

7

31

2

4

6

75

Page 196: ΗΜΜΥ 1 1 1

Ζυγισμένα δέντραΖυγισμένα δέντρα

Η περίπτωση όπου το ύψος του αριστερού Η περίπτωση όπου το ύψος του αριστερού υποδέντρου είναι υποδέντρου είναι ακριβώς ίσοακριβώς ίσο με το ύψος με το ύψος του δεξιού, δεν επιτυγχάνεται εύκολατου δεξιού, δεν επιτυγχάνεται εύκολα

Αν από την παραπάνω περίπτωση Αν από την παραπάνω περίπτωση υπήρχαν υπήρχαν «μικρές» αποκλίσεις«μικρές» αποκλίσεις, οι , οι επιδόσεις του δέντρου στην αναζήτηση επιδόσεις του δέντρου στην αναζήτηση δεν θα επηρεάζονταν ιδιαίτεραδεν θα επηρεάζονταν ιδιαίτερα

Page 197: ΗΜΜΥ 1 1 1

Δέντρα Δέντρα AVLAVL

Ενα δέντρο Ενα δέντρο AVL (Adelson-Velskii and AVL (Adelson-Velskii and Landis) Landis) είναι ένα δέντρο είναι ένα δέντρο BST BST του οποίου του οποίου το το ύψος του αριστερού υποδέντρου διαφέρει ύψος του αριστερού υποδέντρου διαφέρει από αυτό του δεξιού το πολύ κατά 1από αυτό του δεξιού το πολύ κατά 1Το δεξί και αριστερό υποδέντρο ενός Το δεξί και αριστερό υποδέντρο ενός δέντρου δέντρου AVL AVL είναι επίσης δέντρα είναι επίσης δέντρα AVLAVLΤο κενό δέντρο είναι δέντρο Το κενό δέντρο είναι δέντρο AVLAVLΟι ιδιότητες αυτές διατηρούνται με παρεμβάσεις Οι ιδιότητες αυτές διατηρούνται με παρεμβάσεις (αναδιάταξη) καθώς νέα στοιχεία προστίθενται στο (αναδιάταξη) καθώς νέα στοιχεία προστίθενται στο δέντροδέντρο

Page 198: ΗΜΜΥ 1 1 1

Δέντρα Δέντρα AVLAVL

Page 199: ΗΜΜΥ 1 1 1

Δέντρα Δέντρα AVLAVL

Ενα δέντρο Ενα δέντρο AVLAVL λέγεται «ψηλό από λέγεται «ψηλό από αριστερά» όταν το ύψος του αριστερού αριστερά» όταν το ύψος του αριστερού υποδέντρου είναι μεγαλύτερο από αυτό υποδέντρου είναι μεγαλύτερο από αυτό του δεξιού (κατά πόσο;;;)του δεξιού (κατά πόσο;;;)

Αντίστοιχα για το «ψηλό από δεξιά»Αντίστοιχα για το «ψηλό από δεξιά»

Υπάρχουν αρκετοί τρόποι με τους οποίους Υπάρχουν αρκετοί τρόποι με τους οποίους η προσθήκη ή η διαγραφή στοιχείων σε η προσθήκη ή η διαγραφή στοιχείων σε ένα δέντρο ένα δέντρο AVL AVL παραβιάζει τη συνθήκη παραβιάζει τη συνθήκη χαρακτηρισμού τουχαρακτηρισμού του

Page 200: ΗΜΜΥ 1 1 1

Αναδιάταξη δέντρων Αναδιάταξη δέντρων AVLAVL

Η χαρακτηριστική ιδιότητα ενός δέντρου Η χαρακτηριστική ιδιότητα ενός δέντρου AVL AVL μπορεί να παύει να ισχύει με την μπορεί να παύει να ισχύει με την προσθήκη νέων στοιχείωνπροσθήκη νέων στοιχείων

Η επαναφορά της ιδιότητας σε ισχύ, Η επαναφορά της ιδιότητας σε ισχύ, γίνεται με γίνεται με περιστροφήπεριστροφή του δέντρου, του δέντρου, ανάλογα με την περίπτωση αναδιάταξης ανάλογα με την περίπτωση αναδιάταξης που συντρέχειπου συντρέχει

Page 201: ΗΜΜΥ 1 1 1

Απλή περιστροφήΑπλή περιστροφή

X Y

Z

k2

k1

h X

Y Z

k2

k1

New item

New Item

Page 202: ΗΜΜΥ 1 1 1

Διπλή περιστροφήΔιπλή περιστροφή ( (α)α)

k3

h

D

k2

k1

CB

A

k2

k1 k3

C

D

BA

Page 203: ΗΜΜΥ 1 1 1

Διπλή περιστροφήΔιπλή περιστροφή ( (β)β)k3

k2

k1

CB

A

D

k3

k1

k2

C

BA

D

Page 204: ΗΜΜΥ 1 1 1

Διπλή περιστροφήΔιπλή περιστροφή ( (γ)γ)k3

k1

k2

C

BA

D

k2

k1k3

CBA D

Page 205: ΗΜΜΥ 1 1 1

Αναδιάταξη δέντρων Αναδιάταξη δέντρων AVLAVL

Περιπτώσεις αναδιάταξηςΠεριπτώσεις αναδιάταξης– ΑΑ: ένα αριστερό υποδέντρο ενός δέντρου ΑΑ: ένα αριστερό υποδέντρο ενός δέντρου AVL AVL

που είναι ψηλό από αριστερά, γίνεται επίσης που είναι ψηλό από αριστερά, γίνεται επίσης ψηλό από αριστεράψηλό από αριστερά ( (left of leftleft of left))

– ΔΔ: τα αντίστοιχα για το δεξί υποδέντροΔΔ: τα αντίστοιχα για το δεξί υποδέντρο ( (right of right of rightright))

– ΔΑ: ένα υποδέντρο ενός δέντρου ΔΑ: ένα υποδέντρο ενός δέντρου AVL AVL ψηλού από ψηλού από αριστεράαριστερά, , γίνεται ψηλό από δεξιάγίνεται ψηλό από δεξιά ( (right of leftright of left))

– ΑΔ: ένα υποδέντρο ενός δέντρου ΑΔ: ένα υποδέντρο ενός δέντρου AVL AVL ψηλού από ψηλού από δεξιάδεξιά, , γίνεται ψηλό από αριστεράγίνεται ψηλό από αριστερά ( (left of rightleft of right))

Page 206: ΗΜΜΥ 1 1 1

Περιπτώσεις αναδιάταξης (α)Περιπτώσεις αναδιάταξης (α)

Page 207: ΗΜΜΥ 1 1 1

Περιπτώσεις αναδιάταξης (β)Περιπτώσεις αναδιάταξης (β)

Page 208: ΗΜΜΥ 1 1 1

Αναδιάταξη σε περίπτωση ΑΑΑναδιάταξη σε περίπτωση ΑΑ

Page 209: ΗΜΜΥ 1 1 1

Αναδιάταξη σε περίπτωση ΔΔΑναδιάταξη σε περίπτωση ΔΔ

Page 210: ΗΜΜΥ 1 1 1

Αναδιάταξη σε περίπτωση ΔΑΑναδιάταξη σε περίπτωση ΔΑ

Page 211: ΗΜΜΥ 1 1 1

Αναδιάταξη σε περίπτωση ΑΔΑναδιάταξη σε περίπτωση ΑΔ

Page 212: ΗΜΜΥ 1 1 1

Υλοποίηση δέντρων Υλοποίηση δέντρων AVLAVL στη στη CC

Μια δομή δεδομένωνΜια δομή δεδομένωνNodeNode

keykey <keyType><keyType>

datadata <dataType><dataType>

leftleft <pointer to Node><pointer to Node>

rightright <pointer to Node><pointer to Node>

balbal <LeftH, EvenH, RightH><LeftH, EvenH, RightH>

End NodeEnd Node

Page 213: ΗΜΜΥ 1 1 1

Εισαγωγή σε δέντρα Εισαγωγή σε δέντρα AVLAVL

HH εισαγωγή νέων στοιχείων γίνεται στα εισαγωγή νέων στοιχείων γίνεται στα φύλλα, όπως στα δέντρα φύλλα, όπως στα δέντρα BSTBST

Εντοπίζεται το φύλλο στο οποίο θα γίνει η Εντοπίζεται το φύλλο στο οποίο θα γίνει η εισαγωγή και δημιουργείται νέος κόμβοςεισαγωγή και δημιουργείται νέος κόμβος

Γίνεται οπισθοδρόμηση μέχρι την κορυφή Γίνεται οπισθοδρόμηση μέχρι την κορυφή του δέντρου, με έλεγχο της ισχύος της του δέντρου, με έλεγχο της ισχύος της συνθήκης ισορροπίας συνθήκης ισορροπίας AVL AVL σε κάθε βήμασε κάθε βήμα προς τα πίσω, και επαναφορά σε προς τα πίσω, και επαναφορά σε ισορροπία, όπου απαιτείταιισορροπία, όπου απαιτείται

Page 214: ΗΜΜΥ 1 1 1

Εισαγωγή σε δέντρα Εισαγωγή σε δέντρα AVLAVL

Διάγραμμα κλήσης μιας αναδρομικής Διάγραμμα κλήσης μιας αναδρομικής συνάρτησης εισαγωγήςσυνάρτησης εισαγωγής

Page 215: ΗΜΜΥ 1 1 1

ΑΛΓΟΡΙΘΜΟΣΑΛΓΟΡΙΘΜΟΣ AVLInsert( ref root <tree AVLInsert( ref root <tree pointer>, pointer>,

val newPtr <tree pointer>, ref taller val newPtr <tree pointer>, ref taller <Boolean>)<Boolean>)1 if (root null)1 if (root null)

1 root = newPtr1 root = newPtr 2 taller = true2 taller = true 3 return root3 return root2 end if2 end if3 if (newPtr->key < root->key)3 if (newPtr->key < root->key) 1 root->left = AVLInsert (root->left, newPtr, taller)1 root->left = AVLInsert (root->left, newPtr, taller) 2 if (taller) 2 if (taller) // Left subtree is taller// Left subtree is taller 1 if (root left-high)1 if (root left-high) 1 root = leftBalance (root, taller)1 root = leftBalance (root, taller) 2 elseif (root even-high)2 elseif (root even-high) 1 root->bal = left-high1 root->bal = left-high 3 else 3 else //Was right high -- now even high//Was right high -- now even high 1 root->bal = even-high1 root->bal = even-high 2 taller = false2 taller = false 4 end if4 end if4 else4 else // New data >= root data// New data >= root data

Page 216: ΗΜΜΥ 1 1 1

(Συνέχεια)(Συνέχεια) AVLInsert( ref root <tree AVLInsert( ref root <tree pointer>, pointer>,

val newPtr <tree pointer>, ref taller val newPtr <tree pointer>, ref taller <Boolean>)<Boolean>)......

4 else4 else // New data >= root data// New data >= root data 1 root-> right = AVLInsert (root->right , newPtr, taller)1 root-> right = AVLInsert (root->right , newPtr, taller) 2 if (taller)2 if (taller) // Right subtree is taller// Right subtree is taller 1 if (root left-high)1 if (root left-high) 1 root->bal = even-high1 root->bal = even-high 2 taller = false2 taller = false 2 elseif (root even-high)2 elseif (root even-high) // Was balanced -- now right high// Was balanced -- now right high 1 root->bal = right-high1 root->bal = right-high 3 else3 else 1 root = rightBalance (root, taller)1 root = rightBalance (root, taller) 4 end if4 end if 3 end if3 end if5 end if5 end if6 return root6 return root

end AVLInsertend AVLInsert

Page 217: ΗΜΜΥ 1 1 1

ΑΛΓΟΡΙΘΜΟΣ ΑΛΓΟΡΙΘΜΟΣ leftBalance (ref root <tree pointer>, ref leftBalance (ref root <tree pointer>, ref

taller <Boolean>)taller <Boolean>)1 leftTree = root-> left1 leftTree = root-> left2 if (leftTree left-high)2 if (leftTree left-high)

// Case 1: Left of left. Single rotation right.// Case 1: Left of left. Single rotation right. 1 rotateRight (root)1 rotateRight (root) 2 root->bal = even-high2 root->bal = even-high 3 leftTree->bal = even-high3 leftTree->bal = even-high 4 taller = false4 taller = false3 else3 else

// Case 2: Right of left. Double rotation required.// Case 2: Right of left. Double rotation required. 1 rightTree = leftTree->right1 rightTree = leftTree->right

// adjust balance factors// adjust balance factors 2 if (rightTree->bal left-high)2 if (rightTree->bal left-high) 1 root->bal = right-high1 root->bal = right-high 2 leftTree->bal = even-high2 leftTree->bal = even-high 3 elseif (rightTree->bal = even-high)3 elseif (rightTree->bal = even-high) 1 leftTree->bal = even-high1 leftTree->bal = even-high 4 else4 else

Page 218: ΗΜΜΥ 1 1 1

(Συνέχεια)(Συνέχεια)leftBalance (ref root <tree pointer>, ref leftBalance (ref root <tree pointer>, ref

taller <Boolean>)taller <Boolean>) 4 else4 else

// rightTree->bal is right-high// rightTree->bal is right-high 1 root->bal = even-high1 root->bal = even-high 2 leftTree->bal = left-high2 leftTree->bal = left-high 5 end if5 end if 6 rightTree->bal = even-high6 rightTree->bal = even-high 7 root->left = rotateLeft (leftTree)7 root->left = rotateLeft (leftTree) 8 root = rotateRight (root)8 root = rotateRight (root) 9 taller = false9 taller = false4 end if4 end if5 return root5 return root

end leftBalanceend leftBalance

Page 219: ΗΜΜΥ 1 1 1

Περισσότερα για δέντρα Περισσότερα για δέντρα AVLAVL

Διαγραφή στοιχείουΔιαγραφή στοιχείου– Διαβάστε αντίστοιχο Διαβάστε αντίστοιχο download download από τη σελίδα από τη σελίδα

του μαθήματοςτου μαθήματος

Βιβλιοθήκη συναρτήσεωνΒιβλιοθήκη συναρτήσεων– Μπορείτε να κατεβάσετε ένα σύνολο έτοιμων Μπορείτε να κατεβάσετε ένα σύνολο έτοιμων

συναρτήσεων συναρτήσεων C C για το χειρισμό δέντρων για το χειρισμό δέντρων AVL AVL από τη σελίδα από τη σελίδα web web του μαθήματοςτου μαθήματος

Page 220: ΗΜΜΥ 1 1 1

ΓράφοιΓράφοι ((i)i)

ΟρολογίαΟρολογία– γράφοςγράφος ή ή γράφημαγράφημα ( (graph)graph)

Ορισμός: Ορισμός: G = (V,G = (V, E)E) όπου όπου– VV :: ένα σύνολοένα σύνολο– EE :: μια διμελής σχέση στομια διμελής σχέση στο V V

Ορολογία (συνέχεια)Ορολογία (συνέχεια)– κάθε κάθε vv V V ονομάζεταιονομάζεται

κορυφήκορυφή ( (vertex) vertex) ή ή κόμβοςκόμβος ( (node)node)– κάθε κάθε ((vv11, , vv22) ) Ε ονομάζεται Ε ονομάζεται

ακμήακμή ( (edge) edge) ή ή τόξοτόξο (arrow) (arrow)

V = { v1, v2, v3, v4,v5, v6, v7 }

E = { (v1, v2), (v1, v3),(v2, v4), (v3, v4),(v5, v2), (v5, v3),(v1, v5), (v6, v7),(v7, v6), (v7, v7) }

v4

v3

v5

v2

v1

v6 v7

Page 221: ΗΜΜΥ 1 1 1

ΓράφοιΓράφοι ((ii)ii)Είδη γράφωνΕίδη γράφων– ΚατευθυνόμενοςΚατευθυνόμενος ( (directeddirected) )

γράφος, αν γράφος, αν ((vv11, , vv22) ) Ε είναι Ε είναι διατεταγμένοδιατεταγμένο ζεύγος ζεύγος

– Μη κατευθυνόμενος Μη κατευθυνόμενος ((undirectedundirected) γράφος, αν) γράφος, αν((vv11, , vv22) ) και και ((vv22, , vv11)) ταυτόσημα ταυτόσημα

ΟρισμοίΟρισμοί– Δύο κορυφές Δύο κορυφές vv11 και και vv22

ονομάζονται ονομάζονται γειτονικέςγειτονικές(adjacent) (adjacent) αν αν ((vv11, , vv22) ) Ε Ε μη κατευθυνόμενος

w1 w2

w4 w3

κατευθυνόμενος

v4

v3

v5

v2

v1

v6 v7

Page 222: ΗΜΜΥ 1 1 1

ΓράφοιΓράφοι ((iii)iii)

Ορισμοί (συνέχεια)Ορισμοί (συνέχεια)– ΒαθμόςΒαθμός (degree) (degree) μιας κορυφήςμιας κορυφής

vv V V είναι οείναι ο αριθμός τωναριθμός τωνγειτονικών κορυφών τηςγειτονικών κορυφών της

deg(deg(ww11)=2, deg()=2, deg(ww22)=1)=1

– Για κατευθυνόμενους γράφους: Για κατευθυνόμενους γράφους: μέσα-βαθμόςμέσα-βαθμός ((in-degree) in-degree) και και έξω-έξω-βαθμόςβαθμός ( (out-degree)out-degree)

indeg(indeg(vv11)=0, outdeg()=0, outdeg(vv11)=3,)=3,

indeg(indeg(vv22)=2, outdeg()=2, outdeg(vv22)=1)=1μη κατευθυνόμενος

w1 w2

w4 w3

κατευθυνόμενος

v4

v3

v5

v2

v1

v6 v7

Page 223: ΗΜΜΥ 1 1 1

ΓράφοιΓράφοι ((iv)iv)

Ορισμοί (συνέχεια)Ορισμοί (συνέχεια)– ΜονοπάτιΜονοπάτι ( (path) path) είναι μια είναι μια

ακολουθία κορυφών ακολουθία κορυφών vv11, , vv2 2 , ... , ... vvnn V V τέτοια ώστε τέτοια ώστε ((vvii, , vvii+1+1) ) Ε Ε, , ii

– Μήκος Μήκος μονοπατιούμονοπατιού– ΚύκλοςΚύκλος ( (cycle) cycle) είναι ένα είναι ένα

μονοπάτι με μονοπάτι με vv11 == vvnn

– ΑκυκλικόςΑκυκλικός ( (acyclic) acyclic) γράφος: γράφος: δεν περιέχει κύκλουςδεν περιέχει κύκλους

d

c

e

b

a

f

g

Μονοπάτι: a, b, c, e, g

d

c

e

b

a

f

g

Κύκλος: b, c, e, d, b

μήκος=4

Page 224: ΗΜΜΥ 1 1 1

ΓράφοιΓράφοι ((v)v)

Ορισμοί (συνέχεια)Ορισμοί (συνέχεια)– ΥπογράφοςΥπογράφος ( (subgraph) subgraph)

του του G = (V, E) G = (V, E) είναιείναι ένας ένας γράφος γράφος GG´́ = (V = (V´́, E, E´́) ) τέτοιος ώστε τέτοιος ώστε VV´ ´ V Vκαικαι E E´ ´ E E

G

d

c

e

b

a

f

g

G2 υπογράφος του G

d

c

e

b f

g

G1 υπογράφος του G

d

c

e

b

a

f

Page 225: ΗΜΜΥ 1 1 1

ΓράφοιΓράφοι ((vi)vi)

Ορισμοί (συνέχεια)Ορισμοί (συνέχεια)– ΣυνδεδεμένοςΣυνδεδεμένος ( (connected) connected) ή ή

συνεκτικός γράφος:συνεκτικός γράφος:για κάθε ζεύγος κορυφών για κάθε ζεύγος κορυφών vv11, , vv22 V V υπάρχει μονοπάτι από υπάρχει μονοπάτι από την την vv11 στη στη vv22

– Συνδεδεμένα συστατικάΣυνδεδεμένα συστατικά ((connected components):connected components): συνδεδεμένοι υπογράφοι συνδεδεμένοι υπογράφοι που περιέχουν όλες τις που περιέχουν όλες τις κορυφές και τις ακμέςκορυφές και τις ακμές

συνδεδεμένος

d

c

e

b

a

f

g

μη συνδεδεμένος

d

c

e

b

a

f

g

Page 226: ΗΜΜΥ 1 1 1

ΓράφοιΓράφοι ((vii)vii)

Ορισμοί (συνέχεια)Ορισμοί (συνέχεια)– Ισχυρά συνδεδεμένοςΙσχυρά συνδεδεμένος

((strongly connected) strongly connected) κατευθυνόμενος γράφοςκατευθυνόμενος γράφος:: όπως προηγουμένωςόπως προηγουμένως

– Ασθενώς συνδεδεμένοςΑσθενώς συνδεδεμένος ((weakly connected) weakly connected) κατευθυνόμενος γράφοςκατευθυνόμενος γράφος: : συνδεδεμένος, αν συνδεδεμένος, αν αγνοήσουμε τις αγνοήσουμε τις κατευθύνσεις των ακμώνκατευθύνσεις των ακμών

ασθενώς συνδεδεμένος

d

c

e

b

a

f

g

ισχυρά συνδεδεμένος

d

c

e

b

a

f

g

?

Page 227: ΗΜΜΥ 1 1 1

Γράφοι ως ΑΤΔΓράφοι ως ΑΤΔ

Υποθέτουμε ότι προϋπάρχει:Υποθέτουμε ότι προϋπάρχει:– Τύπος κορυφής: Τύπος κορυφής: vertexvertex

ΠράξειςΠράξεις– ΑΤΔ: ΑΤΔ: graphgraph– void empty (graph *g, int n);void empty (graph *g, int n);– int isAdjacent (graph g, int isAdjacent (graph g, vertexvertex v1, v1, vertex vertex v2); v2);

– void join (graph *g, void join (graph *g, vertexvertex v1, v1, vertexvertex v2); v2);

– void remove (graph *g, void remove (graph *g, vertexvertex v1, v1, vertexvertex v2); v2);

Page 228: ΗΜΜΥ 1 1 1

Αναπαράσταση γράφωνΑναπαράσταση γράφων με ΣΤΔμε ΣΤΔ

Δύο από τους κυριότερους τρόπους Δύο από τους κυριότερους τρόπους αναπαράστασηςαναπαράστασης– Πίνακας γειτονικών κορυφώνΠίνακας γειτονικών κορυφών

((adjacency matrix)adjacency matrix)– Λίστα γειτονικών κορυφώνΛίστα γειτονικών κορυφών

((adjacency list)adjacency list)

Άλλοι τρόποι αναπαράστασηςΆλλοι τρόποι αναπαράστασης– Λίστα ακμώνΛίστα ακμών

((edge list)edge list)

Page 229: ΗΜΜΥ 1 1 1

Πίνακας γειτονικών κορυφώνΠίνακας γειτονικών κορυφών (i)(i)

Τρόπος αναπαράστασηςΤρόπος αναπαράστασης– Έστω ο γράφοςΈστω ο γράφος G = (V, E)G = (V, E) καικαι nn = |V| = |V|– Ο γράφος Ο γράφος G G αναπαρίσταται μεαναπαρίσταται με

ένανέναν πίνακαπίνακα aa διαστάσεων διαστάσεων nn n n τα στοιχεία του οποίου είναι τα στοιχεία του οποίου είναι TRUETRUE ή ή FALSEFALSE

– aa[[ii, , jj] = ] = TRUETRUE αν και μόνο αναν και μόνο αν ((vvii, , vvjj) ) E E

v0 v1

v3 v2

v0 v1

v3 v2

0 0 1 10 0 1 00 0 0 00 0 1 0

0 0 1 10 0 1 01 1 0 11 0 1 0

Page 230: ΗΜΜΥ 1 1 1

Πίνακας γειτονικών κορυφώνΠίνακας γειτονικών κορυφών (ii)(ii)

Μέγιστο πλήθος κορυφώνΜέγιστο πλήθος κορυφών#define #define MAXMAX 10 10

Τύπος κορυφήςΤύπος κορυφήςtypedef unsigned vertex;typedef unsigned vertex;

Τύπος για τις λογικές τιμέςΤύπος για τις λογικές τιμέςtypedef enum { FALSE=0, TRUE=1 } bool;typedef enum { FALSE=0, TRUE=1 } bool;

Ορισμός τύπου Ορισμός τύπου graphgraphtypedef bool graph[MAX][MAX];typedef bool graph[MAX][MAX];

Page 231: ΗΜΜΥ 1 1 1

Πίνακας γειτονικών κορυφώνΠίνακας γειτονικών κορυφών(iii)(iii)

Κενός γράφοςΚενός γράφοςvoid empty (graph *g, int n)void empty (graph *g, int n){{ vertex v1, v2;vertex v1, v2; for (v1=0; v1<n; v1++)for (v1=0; v1<n; v1++) for (v2=0; v2<n; v2++)for (v2=0; v2<n; v2++) (*g)[v1][v2] = FALSE;(*g)[v1][v2] = FALSE;}}

Έλεγχος ύπαρξης ακμήςΈλεγχος ύπαρξης ακμήςbool isAdjacent (graph g, vertex v1,bool isAdjacent (graph g, vertex v1, vertex v2)vertex v2){{ return g[v1][v2];return g[v1][v2];}}

Page 232: ΗΜΜΥ 1 1 1

Πίνακας γειτονικών κορυφώνΠίνακας γειτονικών κορυφών(iv)(iv)

Προσθήκη ακμήςΠροσθήκη ακμήςvoid join (graph *g, void join (graph *g, vertexvertex vv1,1, vertex vvertex v2)2){{ (*g)[(*g)[v1v1][][v2v2] = ] = TRUETRUE;;}}

Αφαίρεση ακμήςΑφαίρεση ακμήςvoid void removeremove (graph *g, (graph *g, vertexvertex vv1,1, vertex vvertex v2)2){{ (*g)[(*g)[v1v1][][v2v2] = ] = FALSEFALSE;;}}

Page 233: ΗΜΜΥ 1 1 1

Λίστα γειτονικών κορυφώνΛίστα γειτονικών κορυφών (i)(i)

Τρόπος αναπαράστασηςΤρόπος αναπαράστασης– Έστω ο γράφοςΈστω ο γράφος G = (V, E)G = (V, E)

καικαι nn = |V| = |V|– Ο γράφος Ο γράφος G G αναπαρίσταται μεαναπαρίσταται με

ένανέναν πίνακαπίνακα aa διάστασης διάστασης n n τα στοιχεία του οποίου είναιτα στοιχεία του οποίου είναιγραμμικές λίστεςγραμμικές λίστεςπου περιέχουν κορυφέςπου περιέχουν κορυφές

– η λίστα η λίστα aa[[ii] ] περιέχειπεριέχειτην κορυφή την κορυφή j j αν και μόνοαν και μόνοαναν ( (vvii, , vvjj) ) E E

v0 v1

v3 v2

a[0]

a[1]

a[2]

a[3]

2

2

2

3

Page 234: ΗΜΜΥ 1 1 1

Λίστα γειτονικών κορυφώνΛίστα γειτονικών κορυφών (ii)(ii)

Τύπος κορυφήςΤύπος κορυφήςtypedef unsigned vertex;typedef unsigned vertex;

Ορισμός τύπου Ορισμός τύπου graphgraphtypedef struct node_tag {typedef struct node_tag { vertexvertex vv;; struct node_tag * next;struct node_tag * next;} node, * graph[];} node, * graph[];

Page 235: ΗΜΜΥ 1 1 1

Λίστα γειτονικών κορυφώνΛίστα γειτονικών κορυφών(iii)(iii)

Κενός γράφοςΚενός γράφοςvoid empty (graph *g, int n)void empty (graph *g, int n){{ vertex v;vertex v;

*g = malloc(n * sizeof(node *));*g = malloc(n * sizeof(node *));

if (*g == NULL) {if (*g == NULL) { fprintf(stderr, "Out of memory\n");fprintf(stderr, "Out of memory\n"); exit(1);exit(1); }}

for (v=0; v<n; v++)for (v=0; v<n; v++) (*g)[v] = NULL;(*g)[v] = NULL;}}

Page 236: ΗΜΜΥ 1 1 1

Λίστα γειτονικών κορυφώνΛίστα γειτονικών κορυφών(iv)(iv)

Έλεγχος ύπαρξης ακμήςΈλεγχος ύπαρξης ακμήςbool isAdjacent (graph g, vertex v1,bool isAdjacent (graph g, vertex v1, vertex v2)vertex v2){{ node * n;node * n;

for (n=g[v1]; n != NULL; n=n->next)for (n=g[v1]; n != NULL; n=n->next) if (n->v == v2)if (n->v == v2) return TRUE;return TRUE;

return FALSE;return FALSE;}}

Page 237: ΗΜΜΥ 1 1 1

Λίστα γειτονικών κορυφώνΛίστα γειτονικών κορυφών (v)(v)

Προσθήκη ακμήςΠροσθήκη ακμήςvoid join (graph *g, vertex v1,void join (graph *g, vertex v1, vertex v2)vertex v2){{ node * new = malloc(sizeof(node));node * new = malloc(sizeof(node));

if (new == NULL) {if (new == NULL) { fprintf(stderr, "Out of memory\n");fprintf(stderr, "Out of memory\n"); exit(1);exit(1); }}

new->v = v2;new->v = v2; new->next = (*g)[v1];new->next = (*g)[v1]; (*g)[v1] = new;(*g)[v1] = new;}}

Page 238: ΗΜΜΥ 1 1 1

Λίστα γειτονικών κορυφώνΛίστα γειτονικών κορυφών(vi)(vi)

Αφαίρεση ακμήςΑφαίρεση ακμήςvoid void removeremove (graph *g, vertex v1, (graph *g, vertex v1, vertex v2)vertex v2){{ node *node *** temp = temp = &(&((*g)[v1](*g)[v1]));;

while (*temp != NULL)while (*temp != NULL) if ((*temp)->v == v2) {if ((*temp)->v == v2) { node * del = *temp;node * del = *temp;

*temp = (*temp)->next;*temp = (*temp)->next; free(del);free(del); }} elseelse temp = &((*temp)->next);temp = &((*temp)->next);}}

Page 239: ΗΜΜΥ 1 1 1

Διάσχιση γράφωνΔιάσχιση γράφων ((i)i)

Κατά βάθοςΚατά βάθος– ξεκινώντας από τηνξεκινώντας από την

κορυφή 0:κορυφή 0:– 0, 1, 2, 6, 3, 4, 5, 70, 1, 2, 6, 3, 4, 5, 7

Κατά πλάτοςΚατά πλάτος– ξεκινώντας από τηνξεκινώντας από την

κορυφή 0:κορυφή 0:– 0, 1, 4, 2, 3, 5, 7, 60, 1, 4, 2, 3, 5, 7, 6

6

2 3

1

0

75

4

Page 240: ΗΜΜΥ 1 1 1

Διάσχιση γράφωνΔιάσχιση γράφων ((ii)ii)

Υλοποίηση διάσχισης κατά βάθος σε Υλοποίηση διάσχισης κατά βάθος σε παράσταση λίστας γειτονικών κορυφώνπαράσταση λίστας γειτονικών κορυφώνvoid traverseDFS (graph g)void traverseDFS (graph g){{ bool visited[N];bool visited[N]; vertexvertex vv;;

for (for (vv=0; =0; vv<N; <N; vv++)++) visited[visited[vv] = false;] = false;

traverseDFS_aux(g, visited, 0);traverseDFS_aux(g, visited, 0);}}

Page 241: ΗΜΜΥ 1 1 1

Διάσχιση γράφωνΔιάσχιση γράφων ((iii)iii)

void traverseDFS_aux (graph g,void traverseDFS_aux (graph g, bool visited[N],bool visited[N], vertexvertex current) current){{ nodenode * adj; * adj;

printf("Vertex %d\n", current);printf("Vertex %d\n", current); visited[current] = true;visited[current] = true;

for (adj = g[current];for (adj = g[current]; adj != NULL;adj != NULL; adj = adj->adj = adj->nextnext)) if (!visited[adj->vertex])if (!visited[adj->vertex]) traverseDFS_aux(g, visited,traverseDFS_aux(g, visited, adj->vertex);adj->vertex);}}

Page 242: ΗΜΜΥ 1 1 1

Διάσχιση γράφωνΔιάσχιση γράφων ((iv)iv)

Υλοποίηση διάσχισης κατά πλάτος σε Υλοποίηση διάσχισης κατά πλάτος σε παράσταση λίστας γειτονικών κορυφώνπαράσταση λίστας γειτονικών κορυφώνvoid traverseBFS (graph g)void traverseBFS (graph g){{ node * adj;node * adj; bool bool visited[N];visited[N]; queue queue q;q; vertexvertex vv;;

for (for (vv=0; =0; vv<N; <N; vv++)++) visited[visited[vv] = false;] = false;

q = queueEmpty;q = queueEmpty; queueInsert(&q, 0);queueInsert(&q, 0);

Page 243: ΗΜΜΥ 1 1 1

Διάσχιση γράφωνΔιάσχιση γράφων ((v)v)

while (!queueIsEmpty(q)) {while (!queueIsEmpty(q)) { vertexvertex current = queueRemove(&q); current = queueRemove(&q);

printf("Vertex %d\n", current);printf("Vertex %d\n", current); visited[current] = true;visited[current] = true;

for (adj = g[current];for (adj = g[current]; adj != NULL;adj != NULL; adj = adj->adj = adj->nextnext)) if (!visited[adj->vertex])if (!visited[adj->vertex]) queueInsert(&q, adj->vertex);queueInsert(&q, adj->vertex); }}}}