ΗΜΜΥ 1 1 1

Post on 03-Jan-2016

33 Views

Category:

Documents

2 Downloads

Preview:

Click to see full reader

DESCRIPTION

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

TRANSCRIPT

ΗΜΜΥ 1ΗΜΜΥ 11111

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ΣΤΟΙΧΕΙΑ ΓΙΑ ΤΟ ΜΑΘΗΜΑ (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

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

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

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

κοςκος. . Γ. ΜαραγκουδάκηςΓ. Μαραγκουδάκης imarag@ced.tuc.grimarag@ced.tuc.gr 3739037390

κος. Γ. Ανέστηςκος. Γ. Ανέστης ganest@ced.tuc.grganest@ced.tuc.gr 3739537395

κος. Χ. Σμαραγδάκηςκος. Χ. Σμαραγδάκης smaragd@softnet.tuc.grsmaragd@softnet.tuc.gr 3720837208

κα. Γ. Αδαμοπούλουκα. Γ. Αδαμοπούλου adamop@intelligence.tuc.gradamop@intelligence.tuc.gr 3737537375

ΣΤΟΙΧΕΙΑ ΓΙΑ ΤΟ ΜΑΘΗΜΑ (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)

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

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

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

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

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

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

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

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

kkontog@softnet.tuc.grkkontog@softnet.tuc.gr

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

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

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

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

Η ιστορία της Η ιστορία της 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

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

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

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

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

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

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

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

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

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

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

Hello world!Hello world!

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

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

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

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

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

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

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

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

Συνδέτης(linker)

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

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

Objectcode

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

hello.c

hello.o

hello

printf

stdio.h

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

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

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

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

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

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

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

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

Ορισμός μεταβλητώνΟρισμός μεταβλητών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;

ΣταθερέςΣταθερές (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

ΣταθερέςΣταθερές (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 (δεκαεξαδικό)

ΣταθερέςΣταθερές (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';

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

Μεταξύ Μεταξύ /*/* και και */*/#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! */ */

Εκτύπωση με την Εκτύπωση με την 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

Εισαγωγή με την Εισαγωγή με την 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);

Ένα πιο σύνθετο παράδειγμαΈνα πιο σύνθετο παράδειγμα#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);

}}

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

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

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

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

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

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

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

Τελεστές και εκφράσειςΤελεστές και εκφράσεις ((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

Τελεστές και εκφράσειςΤελεστές και εκφράσεις ((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 τιμή μετά τη μεταβολήτιμή μετά τη μεταβολή

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;

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;

}}

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 (συνθήκη) εντολή

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 (συνθήκη);

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 (αρχικοποίηση ;συνθήκη ;βήμα)

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

εντολή

αληθής

ψευδής

βήμα

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

Εντολή Εντολή 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;

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;

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");}}

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: δομημένος προγραμματισμός!δομημένος προγραμματισμός!

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

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

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

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

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

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);}}

Πίνακες (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;

Πίνακες (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'};

Πίνακες (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

Πολυδιάστατοι πίνακεςΠολυδιάστατοι πίνακες (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"

};};

Πολυδιάστατοι πίνακεςΠολυδιάστατοι πίνακες (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]; }}

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

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

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

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

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

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

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

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

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

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

Εισαγωγή στις δομές Εισαγωγή στις δομές δεδομένωνδεδομένων (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))

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

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

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

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

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

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

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

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

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

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

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

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

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

Παράδειγμα ΑΤΔ: ΣύνολαΠαράδειγμα ΑΤΔ: Σύνολα((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..

Παράδειγμα ΑΤΔ: ΣύνολαΠαράδειγμα ΑΤΔ: Σύνολα((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))

Παράδειγμα ΑΤΔ: ΣύνολαΠαράδειγμα ΑΤΔ: Σύνολα((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))

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

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

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

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

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

Σχέση ΑΤΔ και ΣΤΔΣχέση ΑΤΔ και ΣΤΔ ((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

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

Σχέση ΑΤΔ και ΣΤΔΣχέση ΑΤΔ και ΣΤΔ (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

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

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

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

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

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

Πίνακες ως ΑΤΔΠίνακες ως ΑΤΔ ((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

Πίνακες ως ΑΤΔΠίνακες ως ΑΤΔ (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

Πίνακες ως ΑΤΔΠίνακες ως ΑΤΔ (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

Πίνακες ως ΑΤΔΠίνακες ως ΑΤΔ ((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

Αναζήτηση σε πίνακεςΑναζήτηση σε πίνακες (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

Αναζήτηση σε πίνακεςΑναζήτηση σε πίνακες (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;}}

Αναζήτηση σε πίνακεςΑναζήτηση σε πίνακες (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;}}

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

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

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

(1) (3) (2)

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

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

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

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

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

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

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

Ταξινόμηση πινάκωνΤαξινόμηση πινάκων (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; }}}}

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

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

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

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

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

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

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

Ταξινόμηση πινάκωνΤαξινόμηση πινάκων ((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; }}}}

Ταξινόμηση πινάκωνΤαξινόμηση πινάκων ((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)

Ταξινόμηση πινάκωνΤαξινόμηση πινάκων ((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; }}}}

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

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

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

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

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

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

Ταξινόμηση πινάκωνΤαξινόμηση πινάκων ((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--;

Ταξινόμηση πινάκωνΤαξινόμηση πινάκων ((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); }}}}

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

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

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

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

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

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

Συνώνυμα απλών τύπωνΣυνώνυμα απλών τύπων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;

Απαριθμήσεις (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;

Δομές (Δομές (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

Δομές (Δομές (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;}}

Δομές (Δομές (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;

Ενώσεις (Ενώσεις (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! */

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

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

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

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

x

δ124

p

δ247

42

δ124

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

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

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

x

δ124

p

δ247

42

δ124

Πίνακες και δείκτεςΠίνακες και δείκτες ((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);

Πίνακες και δείκτεςΠίνακες και δείκτες ((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! */

Πίνακες και δείκτεςΠίνακες και δείκτες (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++;

Πίνακες και δείκτεςΠίνακες και δείκτες ((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);

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

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

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

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

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

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

Κώδικας Κώδικας 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) ...

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

ΣυντομογραφίαΣυντομογραφία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);

Μετατροπές τύπωνΜετατροπές τύπων (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

Μετατροπές τύπωνΜετατροπές τύπων ((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);

Δυναμική παραχώρηση μνήμηςΔυναμική παραχώρηση μνήμης((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)

Δυναμική παραχώρηση μνήμηςΔυναμική παραχώρηση μνήμης(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!

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Π Σ

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

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

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

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

Απλά συνδεδεμένες λίστεςΑπλά συνδεδεμένες λίστες ((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;

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

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

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

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

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

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

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

ii

εδώ

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

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

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

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

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

αυτό

ΟυρέςΟυρές (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);

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

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

first last

Υλοποίηση ουράς σε Υλοποίηση ουράς σε 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;

Υλοποίηση ουράς σε Υλοποίηση ουράς σε 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); }}

Υλοποίηση ουράς σε Υλοποίηση ουράς σε 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; }}}}

Υλοποίηση ουράςΥλοποίηση ουράς ((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); }}

Υλοποίηση ουράςΥλοποίηση ουράς ((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;}}

Υλοποίηση ουράςΥλοποίηση ουράς ((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;}}

ΣτοίβεςΣτοίβες (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);

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

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

top

Υλοποίηση στοίβας σε Υλοποίηση στοίβας σε 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); }}

Υλοποίηση στοίβας σε Υλοποίηση στοίβας σε 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); }}

Υλοποίηση στοίβας σε Υλοποίηση στοίβας σε 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;}}

Υλοποίηση στοίβας σε Υλοποίηση στοίβας σε 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;}}

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

first last

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

Διπλά συνδεδεμένες λίστεςΔιπλά συνδεδεμένες λίστες ((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 };

Διπλά συνδεδεμένες λίστεςΔιπλά συνδεδεμένες λίστες((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

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

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

first last

Διπλά συνδεδεμένες λίστεςΔιπλά συνδεδεμένες λίστες ((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;

Διπλά συνδεδεμένες λίστεςΔιπλά συνδεδεμένες λίστες((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; }}}}

Διπλά συνδεδεμένες λίστεςΔιπλά συνδεδεμένες λίστες((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

Κυκλικές λίστεςΚυκλικές λίστες ((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

Κυκλικές λίστεςΚυκλικές λίστες ((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;

Κυκλικές λίστεςΚυκλικές λίστες ((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; }}}}

Κυκλικές λίστεςΚυκλικές λίστες ((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

Κυκλικές λίστεςΚυκλικές λίστες ((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;

Κυκλικές λίστεςΚυκλικές λίστες ((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;}}

Κυκλικές λίστεςΚυκλικές λίστες ((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

Κυκλικές λίστεςΚυκλικές λίστες ((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); }}}}

Κυκλικές λίστεςΚυκλικές λίστες ((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; }}}}

Ταξινομημένες λίστεςΤαξινομημένες λίστες ((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); }}

Ταξινομημένες λίστεςΤαξινομημένες λίστες ((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

Ταξινομημένες λίστες Ταξινομημένες λίστες ((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);}}

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

Παράμετροι του προγράμματοςΠαράμετροι του προγράμματος(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 για επιτυχή τερματισμό

Παράμετροι του προγράμματοςΠαράμετροι του προγράμματος((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;}}

Συναρτήσεις εισόδου-εξόδουΣυναρτήσεις εισόδου-εξόδου (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 χωρίς πρόσημο στο δεκαεξαδικό σύστημαχωρίς πρόσημο στο δεκαεξαδικό σύστημα

Συναρτήσεις εισόδου-εξόδουΣυναρτήσεις εισόδου-εξόδου (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 δείκτεςδείκτες

Συναρτήσεις εισόδου-εξόδουΣυναρτήσεις εισόδου-εξόδου(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 με στοίχιση αριστεράμε στοίχιση αριστερά

Συναρτήσεις εισόδου-εξόδουΣυναρτήσεις εισόδου-εξόδου(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..

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

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

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

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

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

Συναρτήσεις διαχείρισης Συναρτήσεις διαχείρισης αρχείωναρχείων (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)

Συναρτήσεις διαχείρισης Συναρτήσεις διαχείρισης αρχείωναρχείων (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);

Συναρτήσεις διαχείρισης Συναρτήσεις διαχείρισης αρχείωναρχείων (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);

Συναρτήσεις διαχείρισης Συναρτήσεις διαχείρισης αρχείωναρχείων (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.

ΠαράδειγμαΠαράδειγμα (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;

ΠαράδειγμαΠαράδειγμα (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;}}

Συναρτήσεις βιβλιοθήκηςΣυναρτήσεις βιβλιοθήκης (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)

Συναρτήσεις βιβλιοθήκηςΣυναρτήσεις βιβλιοθήκης (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..

Συναρτήσεις βιβλιοθήκηςΣυναρτήσεις βιβλιοθήκης (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..

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

Μια δυνατή υλοποίηση της Μια δυνατή υλοποίηση της 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++);

Προεπεξεργαστής Προεπεξεργαστής ((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);

Προεπεξεργαστής Προεπεξεργαστής ((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

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

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

Δυαδικά δένδραΔυαδικά δένδρα ((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;

Δυαδικά δένδραΔυαδικά δένδρα ((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)); }}

Δυαδικά δένδραΔυαδικά δένδρα ((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; }}

Δυαδικά δένδραΔυαδικά δένδρα ((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);

}}}}

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

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

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

1

2 3 4

65 7

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

1

2

3

4

5

7

6

Σειρά με την οποία διασχίζονται οι κόμβοιΣειρά με την οποία διασχίζονται οι κόμβοι– κατά κατά βάθοςβάθος ( (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

Διάσχιση δυαδικών δένδρωνΔιάσχιση δυαδικών δένδρων ((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); }}}}

Διάσχιση δυαδικών δένδρωνΔιάσχιση δυαδικών δένδρων((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);

Διάσχιση δυαδικών δένδρωνΔιάσχιση δυαδικών δένδρων((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); }}}}

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

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

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

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

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

+

* –

3 3

224

/ 9

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

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

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

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

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

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

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

+

* –

3 3

224

/ 9

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

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

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

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

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

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

+

* –

3 3

224

/ 9

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

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

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

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

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

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

+

* –

3 3

224

/ 9

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

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

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

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

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

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

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

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

Κατασκευή εκφράσεων με Κατασκευή εκφράσεων με τελεστήτελεστή

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

Παράδειγμα κατασκευήςΠαράδειγμα κατασκευής

Έκφραση: Έκφραση: 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) )) ););

Καταστροφή έκφρασηςΚαταστροφή έκφρασης

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

Εκτύπωση έκφρασηςΕκτύπωση έκφρασης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

Υπολογισμός έκφρασηςΥπολογισμός έκφρασης

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 '-': ......

Δυαδικά δένδρα αναζήτησηςΔυαδικά δένδρα αναζήτησης ((i)i)Binary Binary search search treestreesΔυαδικά δένδρα με τιςΔυαδικά δένδρα με τιςπαρακάτω ιδιότητεςπαρακάτω ιδιότητεςγια κάθε κόμβο:για κάθε κόμβο:– όλοι οι κόμβοι τουόλοι οι κόμβοι του

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

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

10

5 34

58

71

17

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

αρκεί να αναζητηθεί στο αριστερό παιδίαρκεί να αναζητηθεί στο αριστερό παιδί– αν είναι μεγαλύτερη από την τιμή της ρίζας,αν είναι μεγαλύτερη από την τιμή της ρίζας,

αρκεί να αναζητηθεί στο δεξί παιδίαρκεί να αναζητηθεί στο δεξί παιδί

Κόστος αναζήτησης: Κόστος αναζήτησης: O(log O(log nn))– υπό την προϋπόθεση το δένδρο να είναι υπό την προϋπόθεση το δένδρο να είναι

ισοζυγισμένοισοζυγισμένο

Δυαδικά δένδρα αναζήτησηςΔυαδικά δένδρα αναζήτησης((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);}}

Δείκτες σε συναρτήσειςΔείκτες σε συναρτήσεις

Παράδειγμα 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));

ΟλοκλήρωσηΟλοκλήρωση

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);

κακόςαλγόριθμος!

Ταξινόμηση φυσαλίδαςΤαξινόμηση φυσαλίδας ((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);

Ταξινόμηση φυσαλίδαςΤαξινόμηση φυσαλίδας ((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;

Ταξινόμηση φυσαλίδαςΤαξινόμηση φυσαλίδας (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; }} }} }}}}

Ταξινόμηση φυσαλίδαςΤαξινόμηση φυσαλίδας (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));

Δέντρα δυαδικής αναζήτησηςΔέντρα δυαδικής αναζήτησης

Δενδρικές δομές δεδομένων στις οποίεςΔενδρικές δομές δεδομένων στις οποίες– Ολα τα στοιχεία στο αριστερό υποδέντρο της Ολα τα στοιχεία στο αριστερό υποδέντρο της

ρίζας είναι μικρότερα από την ρίζαρίζας είναι μικρότερα από την ρίζα– Ολα τα στοιχεία στο δεξί υποδέντρο της ρίζας Ολα τα στοιχεία στο δεξί υποδέντρο της ρίζας

είναι μεγαλύτερα ή ίσα με την ρίζαείναι μεγαλύτερα ή ίσα με την ρίζα– Το αριστερό και το δεξί υποδέντρο είναι Το αριστερό και το δεξί υποδέντρο είναι

δέντρα δυαδικής αναζήτησηςδέντρα δυαδικής αναζήτησης

Binary Search Trees - BSTsBinary Search Trees - BSTs

Δέντρα δυαδικής αναζήτησηςΔέντρα δυαδικής αναζήτησης

Η γενική εικόνα ενός τέτοιου δέντρουΗ γενική εικόνα ενός τέτοιου δέντρου

>=

Παραδείγματα δέντρων Παραδείγματα δέντρων BSTBST

Εγκυρα δέντραΕγκυρα δέντρα

Παραδείγματα δέντρων Παραδείγματα δέντρων BSTBST

Μη-έγκυρα δέντραΜη-έγκυρα δέντρα

Διάσχιση δυαδικών δέντρων Διάσχιση δυαδικών δέντρων

– 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

Ζύγισμα δέντρων Ζύγισμα δέντρων BSTBST

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

Το ύψος του δέντρου σχετίζεται με το Το ύψος του δέντρου σχετίζεται με το χρόνο αναζήτησης ενός στοιχείου μέσα χρόνο αναζήτησης ενός στοιχείου μέσα στο δέντροστο δέντρο

Ζύγισμα δέντρων Ζύγισμα δέντρων BSTBST

Αναζήτηση με πολυπλοκότητα Αναζήτηση με πολυπλοκότητα – Από Ο(Ν)Από Ο(Ν) [χειρότερη περίπτωση][χειρότερη περίπτωση]

– Μέχρι Ο(Μέχρι Ο(LogLog22N)N) [καλύτερη περίπτωση] [καλύτερη περίπτωση]

Ζύγισμα δέντρων Ζύγισμα δέντρων BSTBST

Προκειμένου μια αναζήτηση να διατρέχει Προκειμένου μια αναζήτηση να διατρέχει όσο το δυνατόν μικρότερο μέρος του όσο το δυνατόν μικρότερο μέρος του δέντρου, αυτό πρέπει να είναι «ζυγισμένο»δέντρου, αυτό πρέπει να είναι «ζυγισμένο»– «Ζυγισμένο»: το βάθος του αριστερού «Ζυγισμένο»: το βάθος του αριστερού

υποδέντρου δεν διαφέρει περισσότερο από 1 υποδέντρου δεν διαφέρει περισσότερο από 1 από αυτό του δεξιού (ιδανικά: είναι ίσα)από αυτό του δεξιού (ιδανικά: είναι ίσα)

Αν κατά την προσθήκη νέων στοιχείων στο Αν κατά την προσθήκη νέων στοιχείων στο δέντρο η ζυγαριά «γείρει» δεξιά ή αριστερά, δέντρο η ζυγαριά «γείρει» δεξιά ή αριστερά, απαιτείται διόρθωση του δέντρουαπαιτείται διόρθωση του δέντρου

Παραδείγματα ζυγισμένων Παραδείγματα ζυγισμένων δέντρωνδέντρων

1

2

3

4

5

6

7

1

2

3

4

5

6

7

31

2

4

6

75

Ζυγισμένα δέντραΖυγισμένα δέντρα

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

Αν από την παραπάνω περίπτωση Αν από την παραπάνω περίπτωση υπήρχαν υπήρχαν «μικρές» αποκλίσεις«μικρές» αποκλίσεις, οι , οι επιδόσεις του δέντρου στην αναζήτηση επιδόσεις του δέντρου στην αναζήτηση δεν θα επηρεάζονταν ιδιαίτεραδεν θα επηρεάζονταν ιδιαίτερα

Δέντρα Δέντρα AVLAVL

Ενα δέντρο Ενα δέντρο AVL (Adelson-Velskii and AVL (Adelson-Velskii and Landis) Landis) είναι ένα δέντρο είναι ένα δέντρο BST BST του οποίου του οποίου το το ύψος του αριστερού υποδέντρου διαφέρει ύψος του αριστερού υποδέντρου διαφέρει από αυτό του δεξιού το πολύ κατά 1από αυτό του δεξιού το πολύ κατά 1Το δεξί και αριστερό υποδέντρο ενός Το δεξί και αριστερό υποδέντρο ενός δέντρου δέντρου AVL AVL είναι επίσης δέντρα είναι επίσης δέντρα AVLAVLΤο κενό δέντρο είναι δέντρο Το κενό δέντρο είναι δέντρο AVLAVLΟι ιδιότητες αυτές διατηρούνται με παρεμβάσεις Οι ιδιότητες αυτές διατηρούνται με παρεμβάσεις (αναδιάταξη) καθώς νέα στοιχεία προστίθενται στο (αναδιάταξη) καθώς νέα στοιχεία προστίθενται στο δέντροδέντρο

Δέντρα Δέντρα AVLAVL

Δέντρα Δέντρα AVLAVL

Ενα δέντρο Ενα δέντρο AVLAVL λέγεται «ψηλό από λέγεται «ψηλό από αριστερά» όταν το ύψος του αριστερού αριστερά» όταν το ύψος του αριστερού υποδέντρου είναι μεγαλύτερο από αυτό υποδέντρου είναι μεγαλύτερο από αυτό του δεξιού (κατά πόσο;;;)του δεξιού (κατά πόσο;;;)

Αντίστοιχα για το «ψηλό από δεξιά»Αντίστοιχα για το «ψηλό από δεξιά»

Υπάρχουν αρκετοί τρόποι με τους οποίους Υπάρχουν αρκετοί τρόποι με τους οποίους η προσθήκη ή η διαγραφή στοιχείων σε η προσθήκη ή η διαγραφή στοιχείων σε ένα δέντρο ένα δέντρο AVL AVL παραβιάζει τη συνθήκη παραβιάζει τη συνθήκη χαρακτηρισμού τουχαρακτηρισμού του

Αναδιάταξη δέντρων Αναδιάταξη δέντρων AVLAVL

Η χαρακτηριστική ιδιότητα ενός δέντρου Η χαρακτηριστική ιδιότητα ενός δέντρου AVL AVL μπορεί να παύει να ισχύει με την μπορεί να παύει να ισχύει με την προσθήκη νέων στοιχείωνπροσθήκη νέων στοιχείων

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

Απλή περιστροφήΑπλή περιστροφή

X Y

Z

k2

k1

h X

Y Z

k2

k1

New item

New Item

Διπλή περιστροφήΔιπλή περιστροφή ( (α)α)

k3

h

D

k2

k1

CB

A

k2

k1 k3

C

D

BA

Διπλή περιστροφήΔιπλή περιστροφή ( (β)β)k3

k2

k1

CB

A

D

k3

k1

k2

C

BA

D

Διπλή περιστροφήΔιπλή περιστροφή ( (γ)γ)k3

k1

k2

C

BA

D

k2

k1k3

CBA D

Αναδιάταξη δέντρων Αναδιάταξη δέντρων 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))

Περιπτώσεις αναδιάταξης (α)Περιπτώσεις αναδιάταξης (α)

Περιπτώσεις αναδιάταξης (β)Περιπτώσεις αναδιάταξης (β)

Αναδιάταξη σε περίπτωση ΑΑΑναδιάταξη σε περίπτωση ΑΑ

Αναδιάταξη σε περίπτωση ΔΔΑναδιάταξη σε περίπτωση ΔΔ

Αναδιάταξη σε περίπτωση ΔΑΑναδιάταξη σε περίπτωση ΔΑ

Αναδιάταξη σε περίπτωση ΑΔΑναδιάταξη σε περίπτωση ΑΔ

Υλοποίηση δέντρων Υλοποίηση δέντρων 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

Εισαγωγή σε δέντρα Εισαγωγή σε δέντρα AVLAVL

HH εισαγωγή νέων στοιχείων γίνεται στα εισαγωγή νέων στοιχείων γίνεται στα φύλλα, όπως στα δέντρα φύλλα, όπως στα δέντρα BSTBST

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

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

Εισαγωγή σε δέντρα Εισαγωγή σε δέντρα AVLAVL

Διάγραμμα κλήσης μιας αναδρομικής Διάγραμμα κλήσης μιας αναδρομικής συνάρτησης εισαγωγήςσυνάρτησης εισαγωγής

ΑΛΓΟΡΙΘΜΟΣΑΛΓΟΡΙΘΜΟΣ 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

(Συνέχεια)(Συνέχεια) 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

ΑΛΓΟΡΙΘΜΟΣ ΑΛΓΟΡΙΘΜΟΣ 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

(Συνέχεια)(Συνέχεια)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

Περισσότερα για δέντρα Περισσότερα για δέντρα AVLAVL

Διαγραφή στοιχείουΔιαγραφή στοιχείου– Διαβάστε αντίστοιχο Διαβάστε αντίστοιχο download download από τη σελίδα από τη σελίδα

του μαθήματοςτου μαθήματος

Βιβλιοθήκη συναρτήσεωνΒιβλιοθήκη συναρτήσεων– Μπορείτε να κατεβάσετε ένα σύνολο έτοιμων Μπορείτε να κατεβάσετε ένα σύνολο έτοιμων

συναρτήσεων συναρτήσεων C C για το χειρισμό δέντρων για το χειρισμό δέντρων AVL AVL από τη σελίδα από τη σελίδα web web του μαθήματοςτου μαθήματος

ΓράφοιΓράφοι ((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

ΓράφοιΓράφοι ((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

ΓράφοιΓράφοι ((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

ΓράφοιΓράφοι ((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

ΓράφοιΓράφοι ((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

ΓράφοιΓράφοι ((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

ΓράφοιΓράφοι ((vii)vii)

Ορισμοί (συνέχεια)Ορισμοί (συνέχεια)– Ισχυρά συνδεδεμένοςΙσχυρά συνδεδεμένος

((strongly connected) strongly connected) κατευθυνόμενος γράφοςκατευθυνόμενος γράφος:: όπως προηγουμένωςόπως προηγουμένως

– Ασθενώς συνδεδεμένοςΑσθενώς συνδεδεμένος ((weakly connected) weakly connected) κατευθυνόμενος γράφοςκατευθυνόμενος γράφος: : συνδεδεμένος, αν συνδεδεμένος, αν αγνοήσουμε τις αγνοήσουμε τις κατευθύνσεις των ακμώνκατευθύνσεις των ακμών

ασθενώς συνδεδεμένος

d

c

e

b

a

f

g

ισχυρά συνδεδεμένος

d

c

e

b

a

f

g

?

Γράφοι ως ΑΤΔΓράφοι ως ΑΤΔ

Υποθέτουμε ότι προϋπάρχει:Υποθέτουμε ότι προϋπάρχει:– Τύπος κορυφής: Τύπος κορυφής: 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);

Αναπαράσταση γράφωνΑναπαράσταση γράφων με ΣΤΔμε ΣΤΔ

Δύο από τους κυριότερους τρόπους Δύο από τους κυριότερους τρόπους αναπαράστασηςαναπαράστασης– Πίνακας γειτονικών κορυφώνΠίνακας γειτονικών κορυφών

((adjacency matrix)adjacency matrix)– Λίστα γειτονικών κορυφώνΛίστα γειτονικών κορυφών

((adjacency list)adjacency list)

Άλλοι τρόποι αναπαράστασηςΆλλοι τρόποι αναπαράστασης– Λίστα ακμώνΛίστα ακμών

((edge list)edge list)

Πίνακας γειτονικών κορυφώνΠίνακας γειτονικών κορυφών (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

Πίνακας γειτονικών κορυφώνΠίνακας γειτονικών κορυφών (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];

Πίνακας γειτονικών κορυφώνΠίνακας γειτονικών κορυφών(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];}}

Πίνακας γειτονικών κορυφώνΠίνακας γειτονικών κορυφών(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;;}}

Λίστα γειτονικών κορυφώνΛίστα γειτονικών κορυφών (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

Λίστα γειτονικών κορυφώνΛίστα γειτονικών κορυφών (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[];

Λίστα γειτονικών κορυφώνΛίστα γειτονικών κορυφών(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;}}

Λίστα γειτονικών κορυφώνΛίστα γειτονικών κορυφών(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;}}

Λίστα γειτονικών κορυφώνΛίστα γειτονικών κορυφών (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;}}

Λίστα γειτονικών κορυφώνΛίστα γειτονικών κορυφών(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);}}

Διάσχιση γράφωνΔιάσχιση γράφων ((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

Διάσχιση γράφωνΔιάσχιση γράφων ((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);}}

Διάσχιση γράφωνΔιάσχιση γράφων ((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);}}

Διάσχιση γράφωνΔιάσχιση γράφων ((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);

Διάσχιση γράφωνΔιάσχιση γράφων ((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); }}}}

top related