ΜΑΘΗΜΑ 7ο Κυκλικές και Διπλά Συνδεδεμένες Λίστες,

Slides:



Advertisements
Παρόμοιες παρουσιάσεις
Δομές στην C (επανάληψη)
Advertisements

Το αλφαριθμητικό (string)
ΙΩΑΝΝΗΣ ΚΩΝΣΤΑΝΤΙΝΟΥ 2ο ΦΡΟΝΤΙΣΤΗΡΙΟ ΠΑΡΑΣΚΕΥΗ 26 ΟΚΤΩΒΡΙΟΥ 2012 ΑΙΘΟΥΣΑ Β4 11.
Στοιχειώδεις Δομές Δεδομένων TexPoint fonts used in EMF. Read the TexPoint manual before you delete this box.: AA A A A Τύποι δεδομένων στη Java • Ακέραιοι.
Ανασκόπηση σε Δείκτες, Ουρές, Στοίβες, Συνδεδεμένες Λίστες
ΕΠΛ 231 – Δομές Δεδομένων και Αλγόριθμοι
Λίστες παράλειψης (skip lists) TexPoint fonts used in EMF. Read the TexPoint manual before you delete this box.: AA A A A
Γλώσσα C & Unix Τμήμα Πληροφορικής, ΑΠΘ B’ εξάμηνο
Lab 3: Sorted List ΕΠΛ231-Δομές Δεδομένων και Αλγόριθμοι18/10/2010.
ΘΕΩΡΙΑ ΔΙΑΛΕΞΗ 4 Αριθμητικές εκφράσεις και πράξεις Εντολές ανάθεσης
ΛΟΓ102: Τεχνολογία Λογισμικού Ι Διδάσκων: Νίκος Παπασπύρου 1Νίκος ΠαπασπύρουΛΟΓ102:
Αναδρομη και static Γραψετε την συναρτηση sequence_size που διαβαζει μια απροσδιοριστου μεγεθους σειρας και υπολογιζει και τυπωνει το μεγεθος της. int.
ΕΙΣΑΓΩΓΗ ΣΤΟ ΔΙΑΔΙΚΑΣΤΙΚΟ ΠΡΟΓΡΑΜMΑΤΙΣΜΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΠΑΤΡΩΝ – ΠΟΛΥΤΕΧΝΙΚΗ ΣΧΟΛΗ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ Η/Υ ΚΑΙ ΠΛΗΡΟΦΟΡΙΚΗΣ.
Τύποι πραγματικών αριθμών
Αλγόριθμοι Ταξινόμησης
Φροντηστήριο Διαχείριση Περιεχομένου Παγκόσμιου Ιστού και Γλωσσικά Eργαλεία.
Προγραμματισμός PASCAL Πληροφορική Γ' Λυκείου μέρος γ
© GfK 2012 | Title of presentation | DD. Month
-17 Προσδοκίες οικονομικής ανάπτυξης στην Ευρώπη Σεπτέμβριος 2013 Δείκτης > +20 Δείκτης 0 a +20 Δείκτης 0 a -20 Δείκτης < -20 Σύνολο στην Ευρωπαϊκή Ένωση:
+21 Προσδοκίες οικονομικής ανάπτυξης στην Ευρώπη Δεκέμβριος 2013 Δείκτης > +20 Δείκτης 0 να +20 Δείκτης 0 να -20 Δείκτης < -20 Σύνολο στην Ευρωπαϊκή Ένωση:
11-1 ΜΑΘΗΜΑ 12 ο Γράφοι, Διάσχιση Γράφων Υλικό από τις σημειώσεις Ν. Παπασπύρου, 2006.
Δυαδικά Δένδρα Αναζήτησης, Δένδρα AVL
Εργασία Η υλοποίηση του αλγορίθμου συγχώνευσης θα πρέπει να χρησιμοποιεί την ιδέα των ροών (streams). Θα πρέπει να υπάρχουν δύο διαφορετικά είδη.
Προγραμματισμός ΙΙ Διάλεξη #7: Περισσότερες Δομές Ελέγχου Δρ. Νικ. Λιόλιος.
Κεφάλαιο 2ο Πεπερασμένα αυτόματα.
Αποκεντρωμένη Διοίκηση Μακεδονίας Θράκης ∆ιαχείριση έργων επίβλεψης µε σύγχρονα µέσα και επικοινωνία C2G, B2G, G2G Γενική Δ/νση Εσωτερικής Λειτουργίας.
ΜΕΤΑΒΛΗΤΕΣ - ΤΥΠΟΙ ΜΑΘΗΜΑ 3.
Ολυμπιάδα Πληροφορικής
Προγραμματισμός ΙΙ Διάλεξη #6: Απλές Δομές Ελέγχου Δρ. Νικ. Λιόλιος.
Ολυμπιάδα Πληροφορικής
Δομές Αναζήτησης TexPoint fonts used in EMF. Read the TexPoint manual before you delete this box.: AA A A A Χειριζόμαστε ένα σύνολο στοιχείων όπου το κάθε.
Ολυμπιάδα Πληροφορικής
1 Α. Βαφειάδης Αναβάθμισης Προγράμματος Σπουδών Τμήματος Πληροφορικής Τ.Ε.Ι Θεσσαλονίκης Μάθημα Προηγμένες Αρχιτεκτονικές Υπολογιστών Κεφαλαίο Τρίτο Συστήματα.
Διδάσκων: Παύλος Παυλικκάς1 Ολυμπιάδα Πληροφορικής Stacks - Στοίβες.
Δομές Δεδομένων 1 Στοίβα. Δομές Δεδομένων 2 Στοίβα (stack)  Δομή τύπου LIFO: Last In - First Out (τελευταία εισαγωγή – πρώτη εξαγωγή)  Περιορισμένος.
ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΔΙΑΔΙΚΑΣΤΙΚΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΠΑΤΡΩΝ – ΠΟΛΥΤΕΧΝΙΚΗ ΣΧΟΛΗ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ Η/Υ ΚΑΙ ΠΛΗΡΟΦΟΡΙΚΗΣ.
Προγραμματισμός ΙΙ Διάλεξη #5: Εντολές Ανάθεσης Εντολές Συνθήκης Δρ. Νικ. Λιόλιος.
1 Τμήμα Μηχανικών Ηλεκτρονικών Υπολογιστών και Πληροφορικής Πανεπιστήμιο Πατρών ΟΝΤΟΚΕΝΤΡΙΚΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΙΙ (C++) Κληρονομικότητα.
Lists– Λίστες 1. Αυτό-αναφορικές δομές Τα μέλη μίας δομής μπορεί να είναι οποιουδήποτε τύπου, ακόμα και δείκτες σε δομές του ίδιου τύπου. Χρησιμοποιώντας.
Δυναμικη Δεσμευση Μνημης Συνδεδεμενες Λιστες (dynamic memory allocation, linked lists) Πως υλοποιουμαι προγραμματα που δεν γνωριζουμε πριν την εκτελεση.
ΗΥ150 – ΠρογραμματισμόςΚώστας Παναγιωτάκης ΗΥ-150 Προγραμματισμός Αρχεία.
Διαφάνειες παρουσίασης Πίνακες (συνέχεια) Αριθμητικοί υπολογισμοί Αναδρομή.
6-1 ΜΑΘΗΜΑ 6 ο Ανασκόπηση σε Δείκτες, Συνδεδεμένες Λίστες, Ουρές, Στοίβες.
ΗΜΜΥ 111 ΔΟΜΗΜΕΝΟΣΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΚΩΣΤΑΣ ΚΟΝΤΟΓΙΑΝΝΗΣ Αναπληρωτής Καθηγητής Τμήμα ΗΜΜΥ Πολυτεχνείο Κρήτης.
Δομές Δεδομένων - Ισοζυγισμένα Δυαδικά Δένδρα (balanced binary trees)
ΛΟΓ102: Τεχνολογία Λογισμικού Ι Διδάσκων: Νίκος Παπασπύρου 1Νίκος ΠαπασπύρουΛΟΓ102:
Στοιχειώδεις Δομές Δεδομένων TexPoint fonts used in EMF. Read the TexPoint manual before you delete this box.: AA A A A Τύποι δεδομένων στη C Ακέραιοι.
ΗΥ150 – Προγραμματισμός Ξ. Ζαμπούλης ΗΥ-150 Προγραμματισμός Δομές Δεδομένων.
ΛΟΓ102: Τεχνολογία Λογισμικού Ι Διδάσκων: Νίκος Παπασπύρου 1Νίκος ΠαπασπύρουΛΟΓ102:
Lab 3: Sorted List ΕΠΛ231-Δομές Δεδομένων και Αλγόριθμοι115/4/2015.
Λίστες παράλειψης (skip lists) TexPoint fonts used in EMF. Read the TexPoint manual before you delete this box.: AA A A A
ΛΟΓ102: Τεχνολογία Λογισμικού Ι Διδάσκων: Νίκος Παπασπύρου 1Νίκος ΠαπασπύρουΛΟΓ102:
ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΕΣ ΤΕΧΝΙΚΕΣ Διδάσκοντες:Γιάννης Μαΐστρος Στάθης Ζάχος Νίκος Παπασπύρου
ΛΟΓ102: Τεχνολογία Λογισμικού Ι Διδάσκων: Νίκος Παπασπύρου 1Νίκος ΠαπασπύρουΛΟΓ102:
9-1 ΜΑΘΗΜΑ 9 ο Δυαδικά Δένδρα, Διάσχιση Δυαδικών Δένδρων Υλικό από τις σημειώσεις Ν. Παπασπύρου, 2006.
ΛΟΓ102: Τεχνολογία Λογισμικού Ι Διδάσκων: Νίκος Παπασπύρου 1Νίκος ΠαπασπύρουΛΟΓ102:
ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΕΣ ΤΕΧΝΙΚΕΣ Διδάσκοντες:Γιάννης Μαΐστρος Στάθης Ζάχος Νίκος Παπασπύρου
2/28/00epl-1311 Παραδειγματα Aλγοριθμων Αριθμος λεξεων που διαβαστηκαν απο εισοδο Εκτυπωση περιφερειας τετραγωνων με * Υπολογισμος exp(x,n) = 1 + x/1!
ΗΥ 150 – Προγραμματισμός Ξενοφών Ζαμπούλης ΗΥ -150 Προγραμματισμός Αρχεία.
ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΕΣ ΤΕΧΝΙΚΕΣ Διδάσκοντες:Γιάννης Μαΐστρος Στάθης Ζάχος Νίκος Παπασπύρου
ΗΥ 150 – ΠρογραμματισμόςΞενοφών Ζαμ π ούλης ΗΥ -150 Προγραμματισμός Δομές Δεδομένων.
ΗΥ150 – ΠρογραμματισμόςΞ. Ζαμπούλης ΗΥ-150 Προγραμματισμός Αρχεία.
7-1 ΜΑΘΗΜΑ 7 ο Περισσότερα για Κυκλικές και Διπλά Διασυνδεόμενες Λίστες, Συναρτήσεις Βιβλιοθήκης, Διαχείριση Αρχείων.
ΗΥ150 – ΠρογραμματισμόςΚώστας Παναγιωτάκης ΗΥ-150 Προγραμματισμός Αλφαριθμητικά (Strings)
ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΕΣ ΤΕΧΝΙΚΕΣ Διδάσκοντες:Γιάννης Μαΐστρος Στάθης Ζάχος Νίκος Παπασπύρου
ΛΟΓ102: Τεχνολογία Λογισμικού Ι Διδάσκων: Νίκος Παπασπύρου 1Νίκος ΠαπασπύρουΛΟΓ102:
ΗΥ150 – ΠρογραμματισμόςΚώστας Παναγιωτάκης ΗΥ-150 Προγραμματισμός Τύποι Μεταβλητών Τελεστές Βασική Είσοδος/Έξοδος.
Τεχνολογικό Εκπαιδευτικό Ίδρυμα Θεσσαλίας Προγραμματισμός ΗΥ Ενότητα 2: Συναρτήσεις Εισόδου ⁄ Εξόδου. Διδάσκων: Ηλίας Κ Σάββας, Αναπληρωτής Καθηγητής.
Τεχνολογία και Προγραμματισμός Υπολογιστών
ΣΥΝΑΡΤΗΣΕΙΣ (Functions)
Μεταγράφημα παρουσίασης:

ΜΑΘΗΜΑ 7ο Κυκλικές και Διπλά Συνδεδεμένες Λίστες, Συναρτήσεις Βιβλιοθήκης, Διαχείριση Αρχείων

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

Διπλά συνδεδεμένες λίστες (ii) Τύπος κόμβου struct dnode { int info; struct dnode *next; struct dnode *prev; }; typedef struct dnode *DNodePtr; Τύπος λίστας typedef struct { DNodePtr first; DNodePtr last; } Dlist; Άδεια λίστα Dlist list = { NULL, NULL };

Διπλά συνδεδεμένες λίστες (iii) Εισαγωγή στοιχείου στην αρχή first last n

Διπλά συνδεδεμένες λίστες (iv) Εισαγωγή στοιχείου στην αρχή void dlistInsert (Dlist *lp, int t) { DNodePtr n = (DNodePtr) malloc(sizeof(struct dnode)); if (n == NULL) { fprintf(stderr, "Out of memory\n"); exit(1); } n->info = t;

Διπλά συνδεδεμένες λίστες (v) Εισαγωγή στοιχείου στην αρχή (συνέχεια) if (lp->first == NULL) { /* άδεια λίστα */ n->prev = n->next = NULL; lp->first = lp->last = n; } else { n->prev = NULL; n->next = lp->first; lp->first->prev = n; lp->first = n; return;

list Κυκλικές λίστες (i) struct node { int info; struct node *next; }; typedef struct node *NodePtr; NodePtr list = NULL;

Κυκλικές λίστες (ii) Εισαγωγή στοιχείου list n

Εισαγωγή στοιχείου Κυκλικές λίστες (iii) void clistInsert (NodePtr *lp, int t) { NodePtr n = (NodePtr) malloc(sizeof(struct node)); if (n == NULL) { fprintf(stderr, "Out of memory\n"); exit(1); } n->info = t;

Εισαγωγή στοιχείου (συνέχεια) Κυκλικές λίστες (iv) Εισαγωγή στοιχείου (συνέχεια) if (*lp == NULL) /* άδεια λίστα */ n->next = n; else { n->next = (*lp)->next; (*lp)->next = n; } *lp = n; return;

Κυκλικές λίστες (v) Διαγραφή στοιχείου list

Διαγραφή στοιχείου Κυκλικές λίστες (vi) int clistRemove (NodePtr *lp) { int result; NodePtr q; if (*lp == NULL) { fprintf(stderr, “Empty list\n"); exit(1); } q = (*lp)->next; result = q->info;

Διαγραφή στοιχείου (συνέχεια) Κυκλικές λίστες (vii) Διαγραφή στοιχείου (συνέχεια) if (q == *lp) /* ένα στοιχείο */ *lp = NULL; else (*lp)->next = q->next; free(q); return result; }

Κυκλικές λίστες (viii) Εκτύπωση στοιχείων void clistPrint (NodePtr list) { NodePtr n; if (list) { for (n = list->next; ; n = n->next) { printf("%d\n", n->info); if (n == list) break; } return;

Ταξινομημένες λίστες (i) struct node { int info; struct node *next; }; typedef struct node *NodePtr; NodePtr list = NULL; Διατεταγμένη γραμμική λίστα (ως προς info)

Ταξινομημένες λίστες (ii) Εισαγωγή στοιχείου n 20 curr 12 19 24 50 prev

Ταξινομημένες λίστες (iii) Εισαγωγή στοιχείου void slistInsert (NodePtr *lp, int t) { NodePtr prev, curr; prev = NULL; curr = *lp; while (curr != NULL && curr->info < t){ prev = curr; curr = curr->next; } NodePtr n = (NodePtr)malloc(sizeof(struct node)); if (n == NULL) { printf("Out of memory\n"); exit(1); n->info = t;

Ταξινομημένες λίστες (iv) Εισαγωγή στοιχείου (συνέχεια) if (prev==NULL) { /* αρχή της λίστας */ n->next = *lp; *lp = n; } else { n->next = curr; prev->next = n; return;

Ταξινομημένες λίστες (v) Διαγραφή στοιχείου t=24 12 19 24 50

Ταξινομημένες λίστες (vi) Διαγραφή στοιχείου void slistRemove (NodePtr *lp, int t) { NodePtr prev, curr; prev = NULL; curr = *lp; while (curr != NULL && curr->info < t){ prev = curr; curr = curr->next; } if (curr == NULL || curr->info > t) { printf(“%d was not found\n“, t); return;

Ταξινομημένες λίστες (vii) Διαγραφή στοιχείου (συνέχεια) if (prev==NULL) /* t στην αρχή της λίστας */ *lp = (*lp)->next; else prev->next = curr->next; free(curr); return; }

Παράμετροι του προγράμματος (i) Επικεφαλίδα του προγράμματος int main (int argc, char * argv[]); Παράμετροι argc ο αριθμός των παραμέτρων argv[i] η i-οστή παράμετρος argv[0] το όνομα του προγράμματος Αποτέλεσμα ακέραιος αριθμός που επιστρέφεται στο λειτουργικό σύστημα συνήθως 0 για επιτυχή τερματισμό

Παράμετροι του προγράμματος (ii) Παράδειγμα int main (int argc, char * argv[]) { int i; printf("Program %s called with " "%d parameters:\n", argv[0], argc-1); for (i = 1; i < argc; i++) printf(" %s", argv[i]); printf("\nand will return 0\n"); return 0; }

Συναρτήσεις εισόδου-εξόδου (i) Βασικές συναρτήσεις εισόδου-εξόδου int printf (const char * format, ...); int scanf (const char * format, ...); Ειδικοί χαρακτήρες στο format Ακέραιοι αριθμοί %d στο δεκαδικό σύστημα %u χωρίς πρόσημο στο δεκαδικό σύστημα %o χωρίς πρόσημο στο οκταδικό σύστημα %x χωρίς πρόσημο στο δεκαεξαδικό σύστημα

Συναρτήσεις εισόδου-εξόδου (ii) Ειδικοί χαρακτήρες στο format Αριθμοί κινητής υποδιαστολής %f σε μορφή: [-]ddd.dddddd %e σε μορφή: [-]ddd.dddddd e[+/-]dd %g σε μορφή %f ή %e Άλλοι τύποι %c χαρακτήρες %s συμβολοσειρές %p δείκτες

Συναρτήσεις εισόδου-εξόδου (iii) Παραλλαγές στο format Μέγεθος αριθμών %h αριθμοί short π.χ. %hd, %hx %l αριθμοί long ή double π.χ. %ld, %lf Μήκος αποτελέσματος %8d ακέραιος αριθμός σε ελάχιστο πλάτος 8 χαρακτήρων %-8d όπως το %8d με στοίχιση αριστερά %20s συμβολοσειρά σε ελάχιστο πλάτος 20 χαρακτήρων %12.8f πραγματικός αριθμός σε ελάχιστο πλάτος 12 χαρακτήρων με 8 δεκαδικά ψηφία %-12.10s συμβολοσειρά με στοίχιση αριστερά σε ελάχιστο πλάτος 12 χαρακτήρων με μέγιστο αριθμό εμφανιζόμενων χαρακτήρων 10

Συναρτήσεις εισόδου-εξόδου (iv) Είσοδος-έξοδος χαρακτήρων int putchar (int c); int getchar (); Είσοδος-έξοδος συμβολοσειρών int puts (const char * s); char * gets (char * s); Έλεγχος τέλους δεδομένων Η σταθερά EOF παριστάνει το τέλος των δεδομένων και έχει τύπο int.

Παράδειγμα Αντιγραφή δεδομένων οι χαρακτήρες που διαβάζονται εκτυπώνονται, μέχρι να παρουσιαστεί τέλος δεδομένων void main () { int c; while ((c = getchar()) != EOF) putchar(c); }

Συναρτήσεις διαχείρισης αρχείων (i) Τύπος αρχείου FILE * fp; Άνοιγμα αρχείων FILE * fopen (const char * filename, const char * mode); Παράμετρος mode “r” ανάγνωση (read) “w” εγγραφή (write) “a” προσθήκη (append) “b” δυαδικά δεδομένα (binary)

Συναρτήσεις διαχείρισης αρχείων (ii) Κλείσιμο αρχείων int fclose (FILE * fp); Είσοδος-έξοδος χαρακτήρων int fputc (int c, FILE * fp); int fgetc (FILE * fp); Είσοδος-έξοδος συμβολοσειρών int fputs (const char * s, FILE * fp); char * fgets (char * s, int n, FILE * fp);

Συναρτήσεις διαχείρισης αρχείων (iii) Βασικές συναρτήσεις εισόδου-εξόδου int fprintf (FILE * fp, const char * format, ...); int fscanf (FILE * fp, const char * format, ...); Έλεγχος τέλους αρχείου int feof (FILE * fp);

Συναρτήσεις διαχείρισης αρχείων (iv) Είσοδος-έξοδος πολλών δεδομένων size_t fwrite (const void * p, size_t size, size_t num, FILE * fp); size_t fread (void * p, size_t size, size_t num, FILE * fp); Ο (απρόσημος) ακέραιος τύπος size_t χρησιμοποιείται για τη μέτρηση χώρου μνήμης σε bytes.

Παράδειγμα (i) Αντιγραφή δυαδικών αρχείων int main (int argc, char * argv[]) { FILE * fin, * fout; unsigned char buffer[1000]; size_t count; fin = fopen(argv[1], "rb"); if (fin == NULL) return 1; fout = fopen(argv[2], "wb"); if (fout == NULL) return 2;

Παράδειγμα (ii) (συνεχίζεται) while (!feof(fin)) { count = fread(buffer, 1, 1000, fin); fwrite(buffer, 1, count, fout); } fclose(fin); fclose(fout); return 0;

Συναρτήσεις βιβλιοθήκης (i) Είσοδος και έξοδος <stdio.h> Περιέχει όλες τις συναρτήσεις εισόδου-εξόδου Προκαθορισμένα αρχεία FILE * stdin; τυπική είσοδος FILE * stdout; τυπική έξοδος FILE * stderr; τυπική έξοδος σφαλμάτων Ισοδυναμίες printf(...)  fprintf(stdout, ...) scanf(...)  fscanf(stdin, ...) κ.λπ. Συναρτήσεις διαχείρισης αρχείων με τυχαία πρόσβαση (random access)

Συναρτήσεις βιβλιοθήκης (ii) Διαχείριση συμβολοσειρών <string.h> size_t strlen (const char * s); Μέτρηση αριθμού χαρακτήρων της συμβολοσειράς s. char * strcpy (char * s1, const char * s2); Αντιγραφή της συμβολοσειράς s2 στην s1. char * strcat (char * s1, const char * s2); Προσθήκη της συμβολοσειράς s2 στο τέλος της s1. int strcmp (const char * s1, const char * s2); Σύγκριση των συμβολοσειρών s1 και s2.

Συναρτήσεις βιβλιοθήκης (iii) Μετατροπή συμβολοσειρών <stdlib.h> int atoi (const char * s); Μετατροπή της συμβολοσειράς s σε int. long int atol (const char * s); Μετατροπή της συμβολοσειράς s σε long int. double atof (const char * s); Μετατροπή της συμβολοσειράς s σε double.

Παράδειγμα Μια δυνατή υλοποίηση της strcmp int strcmp (const char * s1, const char * s2) { while (*s1 == *s2 && *s1 != '\0') { s1++; s2++; } return (*s1)-(*s2); } Υπόθεση: οι τιμές του τύπου char είναι στο διάστημα 0-255 (όχι αρνητικές)

Προεπεξεργαστής (preprocessor) (i) Εντολή #include #include <stdio.h> #include "myheader.h" Εντολή #define #define MAX_CHARS 1000 char s[MAX_CHARS]; #define INC(x) ((x)++) INC(a); INC(*p);

Προεπεξεργαστής (preprocessor) (ii) Εντολές #ifdef, #ifndef, #else και #endif #define DEBUG #ifdef DEBUG printf("debugging is on\n"); #else printf("debugging is off\n") #endif #ifndef DEBUG printf("optimizations allowed\n");