Πανεπιστήμιο Πειραιώς Τμήμα Πληροφορικής

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

Download "Πανεπιστήμιο Πειραιώς Τμήμα Πληροφορικής"

Transcript

1 Πανεπιστήμιο Πειραιώς Τμήμα Πληροφορικής Πρόγραμμα Μεταπτυχιακών Σπουδών «Πληροφορική» Μεταπτυχιακή Διατριβή Τίτλος Διατριβής σε Γλώσσα C για Συνδεδεμένες Λίστες A Library of Functions in C for Linked Lists Ονοματεπώνυμο Φοιτητή Πατρώνυμο Αριθμός Μητρώου Επιβλέπων Αλέξανδρος Γεωργίου Σεραφείμ ΜΠΠΛ/ Θέμης Παναγιωτόπουλος, Καθηγητής Σεπτέμβρης 2017 σε Γλώσσα C για Συνδεδεμένες Λίστες

2 Τριμελής Εξεταστική Επιτροπή (υπογραφή) (υπογραφή) (υπογραφή) Όνομα Επώνυμο Βαθμίδα Όνομα Επώνυμο Βαθμίδα Όνομα Επώνυμο Βαθμίδα σε Γλώσσα C για Συνδεδεμένες Λίστες

3 Περίληψη... Abstract... Εισαγωγή... 0 Εισαγωγή στις Συνδεδεμένες Λίστες... 1 Αποθήκευση της λίστας στη μνήμη Ενέργειες στις Συνδεδεμένες Λίστες Εισαγωγή ενός νέου κόμβου Κυκλικές συνδεδεμένες λίστες Κυκλικές Διπλά συνδεδεμένες λίστες Επίδειξη του κώδικα Συμπεράσματα Βιβλιογραφία σε Γλώσσα C για Συνδεδεμένες Λίστες

4 Περίληψη Οι συνδεδεμένες λίστες είναι βασικές δομές δεδομένων στη C. Η γνώση τους είναι απαραίτητη στους προγραμματιστές της γλώσσας αυτής. Η εργασία αυτή εξηγεί τις βασικές αρχές των συνδεδεμένων λιστών, παραθέτοντας μια βιβλιοθήκη συναρτήσεων σε γλώσσα C. Οι συνδεδεμένες λίστες είναι δυναμικές δομές δεδομένων, με μέγεθος που μπορεί να αυξομειωθεί κατά τον χρόνο εκτέλεσης. Σε μια συνδεδεμένη λίστα τα στοιχεία (οι κόμβοι) μπορούν να βρίσκονται σε απομακρυσμένες θέσεις. Οι συνδεδεμένες λίστες προτιμώνται όταν δε γνωρίζουμε το μέγεθος των δεδομένων που θα αποθηκευτούν. Για παράδειγμα, σε ένα σύστημα διαχείρισης υπαλλήλων, δε μπορούν να χρησιμοποιηθούν πίνακες, καθώς αυτοί έχουν σταθερό μέγεθος, ενώ μπορεί να προστεθεί οποιοσδήποτε αριθμός υπαλλήλων. Σε περιπτώσεις σαν αυτή, οι συνδεδεμένες λίστες μπορούν να χρησιμοποιηθούν καθώς η χωρητικότητά τους μπορεί να αυξηθεί (ή να μειωθεί) κατά τον χρόνο εκτέλεσης. Στην αρχιτεκτονική των συνδεδεμένων λιστών βασίστηκαν αλγόριθμοι όπως η σωρός του Fibonacci. Ο αλγόριθμος περιείχε όλες τις βασικές λειτουργίες των συνδεδεμένων λιστών όπως την αναζήτηση, εισαγωγή, αναζήτηση ελάχιστου κ.α. Οι αλγόριθμοι που αναπτύχθηκαν με βάση τη σειρά αριθμών και τις λειτουργίες των συνδεδεμένων λιστών βρήκαν χρησιμότητα σε διάφορους τομείς της πληροφορικής και του προγραμματισμού. Abstract Linked list is one of the fundamental data structures in C. Knowledge of linked lists is must for C programmers. This work explains the fundamentals of linked lists with a library of C functions. Linked lists are a data structure which you may want to use in real programs. The strengths and weaknesses of linked lists give an appreciation of the some of the time, space, and code issues which are useful to thinking about any data structures in general. Linked list is a dynamic data structure whose length can be increased or decreased at run time. In a linked list the elements (or nodes) may be kept at any location. Linked lists are preferred mostly when you don t know the volume of data to be stored. Linked lists are among the simplest and most common data structures. They can be used to implement several other common abstract data types, including lists (the abstract data type), stacks, queues, associative arrays, and S-expressions, though it is not uncommon to implement the other data structures directly without using a list as the basis of implementation.for example, in an employee management system, one cannot use arrays as they are of fixed length while any number of new employees can join. In scenarios like these, linked lists are used as their capacity can be increased (or decreased) at run time. Εισαγωγή Οι συνδεδεμένες λίστες αναπτύχθηκαν το 1955 από τους Allen Newell, Cliff Shaw και Herbert A. Simon στο RAND Corporation ως κύρια δομή δεδομένων για τη γλώσσα σε Γλώσσα C για Συνδεδεμένες Λίστες

5 επεξεργασίας των πληροφοριών τους. Το IPL χρησιμοποιήθηκε για την ανάπτυξη αρκετών προγραμμάτων πρόωρης τεχνητής νοημοσύνης, συμπεριλαμβανομένης της Λογικής Μηχανής Θεωρίας, του Γενικού Επίλυσης Προβλημάτων Οι Newell και Simon αναγνωρίστηκαν με το βραβείο ACM Turing το 1975 επειδή "έχουν κάνει βασικές συνεισφορές στη τεχνητή νοημοσύνη, την ψυχολογία της ανθρώπινης γνώσης και την επεξεργασία των καταλόγων". Το πρόβλημα της μηχανικής μετάφρασης για την επεξεργασία φυσικής γλώσσας δημιούργησε ανάγκες με αποτέλεσμα στο Ινστιτούτο Τεχνολογίας της Μασαχουσέτης (MIT) να χρησιμοποιηθεί συνδεδεμένες λίστες ως δομές δεδομένων στη γλώσσα προγραμματισμού του COMIT για την έρευνα στον τομέα της γλωσσολογίας. Η LISP ήταν υπεύθυνη για τον επεξεργαστή λιστών. Μία από τις σημαντικότερες δομές δεδομένων της LISP είναι ο συνδεδεμένη λίστα. Η χρησιμότητα και των δύο συνδεδεμένων καταλόγων και των γλωσσών που χρησιμοποιούν αυτές τις δομές ως πρωταρχική εκπροσώπηση των δεδομένων τους φάνηκε καθώς αρκετά λειτουργικά συστήματα που αναπτύχθηκαν από τους Technical Systems Consultants (αρχικά της West Lafayette Indiana, και αργότερα Chapel Hill, Βόρεια Καρολίνα) χρησιμοποίησαν απλά συνδεδεμένους καταλόγους ως δομές αρχείων. Μια καταχώρηση καταλόγου επεσήμανε τον πρώτο τομέα ενός αρχείου και εντοπίστηκαν διαδοχικά τμήματα του αρχείου, μεταφέροντας τους δείκτες. Συστήματα που χρησιμοποιούν αυτή την τεχνική συμπεριλάμβαναν Flex (για τον επεξεργαστή Motorola 6800 CPU), mini-flex (ίδια CPU) και Flex9 (για την CPU Motorola 6809). Μια παραλλαγή που αναπτύχθηκε από την TSC και κυκλοφόρησε στην αγορά από την Smoke Signal Broadcasting στην Καλιφόρνια, χρησιμοποίησε διπλά συνδεδεμένες λίστες με τον ίδιο τρόπο. Το λειτουργικό σύστημα TSS / 360, που αναπτύχθηκε από την IBM για τις μηχανές System 360/370, χρησιμοποίησε μια λίστα διπλών συνδέσμων για τον κατάλογο συστημάτων αρχείων τους. Η δομή καταλόγου ήταν παρόμοια με το Unix, όπου ένας κατάλογος θα μπορούσε να περιέχει αρχεία και άλλους καταλόγους και να επεκταθεί σε οποιοδήποτε βάθος. Εισαγωγή στις Συνδεδεμένες Λίστες Στις λίστες το κύριο χαρακτηριστικό είναι ότι οι κόμβοι τους συνήθως βρίσκονται σε απομακρυσμένες θέσεις μνήμης και η σύνδεσή τους γίνεται με δείκτες. Ο δείκτης (pointer) είναι ένας ιδιαίτερος τύπος που προσφέρεται από τις περισσότερες σύγχρονες γλώσσες προγραμματισμού. Ο δείκτης δεν λαμβάνει αριθμητικές τιμές όπως ακέραιες, πραγματικές κ.ά., αλλά οι τιμές του είναι διευθύνσεις στην κύρια μνήμη και σε Γλώσσα C για Συνδεδεμένες Λίστες 1

6 χρησιμοποιείται ακριβώς για τη σύνδεση των διαφόρων στοιχείων μιας δομής, που είναι αποθηκευμένα σε μη συνεχόμενες θέσεις μνήμης. Συνήθως ο δείκτης είναι ένα πεδίο κάθε κόμβου της δομής, όπως φαίνεται στο σχήμα. Το πεδίο Δεδομένα μπορεί να περιέχει μία ή περισσότερες αλφαριθμητικές ή αριθμητικές πληροφορίες. Στο σχήμα παρουσιάζεται μια λίστα με τέσσερις κόμβους, όπου οι δείκτες έχουν τη μορφή βέλους, προκειμένου να φαίνεται ο κόμβος που παραπέμπουν. Μία λίστα με τέσσερις κόμβους Με την συνδεδεμένη αναπαράσταση (linked representation), τα στοιχεία της λίστας αποθηκεύονται σε µη διαδοχικές θέσεις στη μνήμη του Η/Υ. Τώρα, η μετάβαση από το ένα στοιχείο στο επόμενο, πραγματοποιείται µε τη χρήση ενός συνδέσμου (link) μεταξύ των στοιχείων. Τα «στοιχεία» μιας συνδεδεμένης λίστας αποκαλούνται κόμβοι (nodes). Ένας κόμβος αποτελείται από δύο τμήματα. Το αριστερό τμήμα περιέχει την πληροφορία (τιμή) του κόμβου και συνιστά το στοιχείο του κόμβου. Το δεξιό τμήμα περιέχει τη διεύθυνση της (πρώτης) θέσης μνήμης του επόμενου κόμβου, είναι δηλαδή ένας δείκτης στον επόμενο κόμβο της λίστας. Μια λίστα µε κόμβους τέτοιας δομής ονομάζεται απλά συνδεμένη λίστα (one-way or singly linked list). Υπάρχουν και άλλοι τύποι συνδεδεμένης λίστας, που παρουσιάζονται στη συνέχεια. Αποθήκευση της λίστας στη μνήμη Η υλοποίηση μιας απλά συνδεδεμένης λίστας μπορεί να γίνει κατά δύο τρόπους. Ο ένας τρόπος είναι µε τη χρήση πινάκων. Ο τρόπος αυτός χρησιμοποιείται για την υλοποίηση συνδεδεμένων λιστών στις παλαιότερες γλώσσες υψηλού επιπέδου, όπως η FORTRAN, η BASIC και η COBOL, που δε διαθέτουν μηχανισμό δημιουργίας δεικτών (συνδέσμων). Ο δεύτερος τρόπος χρησιμοποιεί μεταβλητές δείκτη (pointer variables). Ο δείκτης (pointer) είναι ένας τύπος δεδομένων που έχει πεδίο τιμών το σύνολο των διευθύνσεων της μνήμης του Η/Υ. Μια μεταβλητή δείκτη παίρνει σαν τιμές διευθύνσεις θέσεων μνήμης που αντιστοιχούν σε κόμβους, δηλαδή σε σύνθετες τιμές. Έτσι, για κάθε κόμβο χρησιμοποιείται και μια μεταβλητή δείκτη (ή ένας σε Γλώσσα C για Συνδεδεμένες Λίστες 2

7 δείκτης). Ο τρόπος αυτός χρησιμοποιείται για υλοποίηση µε γλώσσες υψηλού επιπέδου που παρέχουν κάποιο μηχανισμό δημιουργίας δεικτών, όπως η PASCAL και η C. Στο κεφάλαιο αυτό, ασχολούμαστε µε αυτό το δεύτερο τρόπο υλοποίησης συνδεδεμένων λιστών. Συνήθως, σε μια τέτοια γλώσσα, ο κάθε κόμβος ορίζεται σαν μια εγγραφή µε δύο πεδία, το ένα περιέχει το στοιχείο και το άλλο τον δείκτη.. σε Γλώσσα C για Συνδεδεμένες Λίστες 3

8 1.1. Δημιουργία άδειας λίστας Κώδικας δημιουργίας άδειας λίστας struct node int data; struct node* next; ; struct node * head = NULL ; 1.2. Δημιουργία ενός νέου κόμβου α) struct node* new_node; β) new_node = (struct node*)malloc(sizeof(struct node)); γ) new_node->data = 10; α) Δημιουργούμε έναν δείκτη προς το νέο στοιχείο β) Δεσμεύουμε μνήμη για το νέο στοιχείο και τοποθετούμε τον δείκτη να δείχνει αυτόν τον χώρο γ) Δίνουμε τιμή στο πεδίο data του κόμβου. σε Γλώσσα C για Συνδεδεμένες Λίστες 4

9 2. Ενέργειες στις Συνδεδεμένες Λίστες 2.1. Δημιουργία λίστας με Ν κόμβους struct node * create_list(struct node *start, int num) struct node *new_node, *ptr; int i ; for (i = 0 ; i < num ; i++) // Ο βρόγχος τρέχει n φορές, κάθε φορά που ένας κόμβος τοποθετείται στο τέλος της λίστας if (start == NULL) // new node is the first node new_node = (struct node*)malloc(sizeof(struct node)); // Δέσμευσε μνήμη για το νέο κόμβο start = new_node; new_node->data = i; new_node->next = NULL ; // Στη κυκλική λίστα γίνεται : new_node->next = start ; else // ο νέος κόμβος δεν είναι ο πρώτος κόμβος, nodes no 1 to num-1, να εισαχθεί ο νέος κόμβος στο τέλος της λίστας new_node = (struct node*)malloc(sizeof(struct node)); // Δέσμευσε μνήμη για το νέο κόμβο new_node->data = i; ptr = start; while(ptr->next!= NULL) // Ο δείκτης μετατίθεται στο τελευταίο κόμβο ptr = ptr->next; ptr->next = new_node; το καινούργιο κόμβο new_node->next = NULL; // Ο προηγούμενος τελευταίος κόμβος ισούται με // και ο νέος κόμβος γίνεται τελευταίος printf("\n Linked List Created \n\n"); σε Γλώσσα C για Συνδεδεμένες Λίστες 5

10 return start; Καλούμε αυτή τη συνάρτηση για να φτιάξουμε λίστα με 100 κόμβους ως εξής: struct node * head ; head = create_list(null, 100) ; Η δημιουργία των κόμβων της λίστας γίνεται με την κλήση της malloc( ). Ο δείκτης head τοποθετείται στην κεφαλή της λίστας. Αυτός αποτελεί τον δείκτη ο οποίος δεν θα μετακινείται ποτέ. Η γλώσσα προγραμματισμού C διαχειρίζεται τη μνήμη στατικά, αυτόματα ή δυναμικά. Οι μεταβλητές στατικής διάρκειας κατανέμονται στην κύρια μνήμη, συνήθως μαζί με τον εκτελέσιμο κώδικα του προγράμματος και παραμένουν για όλη τη διάρκεια του προγράμματος. Οι μεταβλητές αυτόματης διάρκειας κατανέμονται στη στοίβα και έρχονται και μεταβαίνουν καθώς καλούνται οι λειτουργίες και επιστρέφουν. Για τις μεταβλητές στατικής διάρκειας και αυτόματης διάρκειας, το μέγεθος της κατανομής πρέπει να είναι σε σταθερό χρόνο. Εάν το απαιτούμενο μέγεθος δεν είναι γνωστό μέχρι την εκτέλεση (για παράδειγμα, αν τα δεδομένα αυθαίρετου μεγέθους διαβάζονται από το χρήστη ή από ένα αρχείο δίσκου), τότε η χρήση αντικειμένων δεδομένων σταθερού μεγέθους είναι ανεπαρκής. Ο χρόνος ζωής της μνήμης που διατίθεται μπορεί επίσης να προκαλέσει ανησυχία. Η μνήμη στατικής και αυτόματης διάρκειας δεν είναι επαρκής για όλες τις καταστάσεις. Τα αυτόματα κατανεμημένα δεδομένα δεν μπορούν να παραμείνουν σε πολλαπλές κλήσεις λειτουργιών, ενώ τα στατικά δεδομένα παραμένουν για τη διάρκεια του προγράμματος, ανεξάρτητα από το αν είναι απαραίτητα ή όχι. Σε πολλές περιπτώσεις ο προγραμματιστής απαιτεί μεγαλύτερη ευελιξία στη διαχείριση της διάρκειας ζωής της μνήμης. Οι περιορισμοί αυτοί αποφεύγονται με τη χρήση της δυναμικής κατανομής μνήμης, στην οποία η μνήμη διαχειρίζεται πιο ρητά (αλλά πιο ευέλικτα), τυπικά με την κατανομή της από το ελεύθερο κατάστημα (ανεπίσημα αποκαλούμενο "σωρός"), μια περιοχή μνήμης δομημένη για το σκοπό αυτό. Στο C, η λειτουργία malloc της βιβλιοθήκης χρησιμοποιείται για την κατανομή ενός μπλοκ μνήμης στον σωρό. Το πρόγραμμα αποκτά πρόσβαση σε αυτό το μπλοκ μνήμης μέσω ενός δείκτη που επιστρέφει το malloc. Όταν η μνήμη δεν είναι πλέον απαραίτητη, ο δείκτης μεταβιβάζεται σε ελεύθερο, ο οποίος μεταθέτει τη μνήμη έτσι ώστε να μπορεί να χρησιμοποιηθεί για άλλους σκοπούς. Ορισμένες πλατφόρμες παρέχουν κλήσεις βιβλιοθήκης οι οποίες επιτρέπουν τη δυναμική κατανομή χρόνου εκτέλεσης από τη στοίβα C αντί του σωρού (π.χ. alloca ()). Αυτή η μνήμη απελευθερώνεται αυτόματα όταν λήξει η λειτουργία κλήσης. σε Γλώσσα C για Συνδεδεμένες Λίστες 6

11 Διάσχιση συνδεδεμένης λίστας Η διάσχιση (traversal) είναι µια από τις συνήθεις πράξεις στις δομές δεδομένων. Διάσχιση σε µία λίστα (ή έναν πίνακα) σημαίνει να «περάσουμε» από όλα τα στοιχεία της, το ένα µετά το άλλο, και να εφαρμόσουμε κάποιο είδος επεξεργασίας σε αυτά. Αυτό, συχνά ονομάζεται και επίσκεψη (visiting). Το είδος της επεξεργασίας εξαρτάται από το συγκεκριμένο πρόβλημα. Π.χ., αύξηση της τιμής των στοιχείων κατά ένα. void traverse_list(struct node * start) struct node *ptr; if ( start == NULL ) // Η λίστα δεν υπάρχει printf("\n There is no list to work with \n\n"); ptr = start ; while (ptr!= NULL) // Στη κυκλικά συνδεδεμένη λίστα γίνεται: while (ptr- >next!= start) printf("\n value = %d", ptr->data); // Γενικά use ptr->data ; ptr = ptr->next ; Καλούμε αυτή τη συνάρτηση ως εξής: traverse_list(head) ; σε Γλώσσα C για Συνδεδεμένες Λίστες 7

12 Βρόχοι Διάσχισης Αν έχουμε τον ορισμό: struct node int data; struct node *next; ; και δύο δείκτες struct node *start, *tmp ; Ο πρώτος δείκτης δείχνει τώρα στην αρχή της λίστας: start = create_list(start, 100) ; Μπορούμε να διασχίσουμε τη λίστα με ένα while loop: ptr = start ; while (tmp!= NULL) use tmp->data ; tmp = tmp->next; Με τον παραπάνω βρόχο, ο δείκτης tmp δείχνει τώρα σε NULL. Σε κυκλική λίστα ο κώδικας γίνεται: ptr = start ; while (tmp->next!= start) σε Γλώσσα C για Συνδεδεμένες Λίστες 8

13 use tmp->data ; tmp = tmp->next; Με τον παραπάνω βρόχο, ο δείκτης tmp δείχνει τώρα στην ουρά της λίστας. Μπορούμε να διασχίσουμε τη λίστα με ένα for loop: >next); for(tmp = start; tmp->next!= NULL ; tmp = tmp- use tmp->data ; Με τον παραπάνω βρόχο, ο δείκτης tmp δείχνει τώρα στην ουρά της λίστας. Σε κυκλική λίστα ο κώδικας γίνεται: >next); for(tmp = start; tmp->next!= start; tmp = tmp- use tmp->data ; Με τον παραπάνω βρόχο, ο δείκτης tmp δείχνει τώρα στην ουρά της λίστας. σε Γλώσσα C για Συνδεδεμένες Λίστες 9

14 Υπολογισμός κόμβων int count_nodes(struct node * start) struct node *ptr; int count = 0 ; ptr = start ; while (ptr!= NULL) count++ ; ptr = ptr->next ; return count; // in circular list, it becomes: while (ptr->next!= start) Καλούμε αυτή τη συνάρτηση για να μετρήσουμε τους κόμβους ως εξής: int howmany ; howmany = count_nodes(head) ; printf("the list has %d nodes", howmany); // head πηγαίνει στη αρχή της λίστας. Με ένα βήμα: printf("the list has %d nodes", count_nodes(head) ); σε Γλώσσα C για Συνδεδεμένες Λίστες 10

15 2.2. Αναζήτηση στοιχείου με δεδομένη τιμή Για την αναζήτηση ενός στοιχείου σε µια συνδεδεμένη λίστα µμπορεί να εφαρμοστεί µόνο η μέθοδος της γραμμικής αναζήτησης. Η δυαδική αναζήτηση δεν μπορεί να εφαρμοστεί, διότι δεν υπάρχει απ ευθείας τρόπος να υπολογιστεί ο δείκτης του μεσαίου στοιχείου. Επομένως, είτε η λίστα είναι διατεταγμένη είτε όχι, χρησιμοποιούμε τη γραμμική αναζήτηση, ψάχνουμε δηλαδή τα στοιχεία της λίστας ένα-ένα. Βέβαια, όταν η λίστα είναι διατεταγμένη, έχουμε διαφορετική συνθήκη τερματισμού του αλγορίθμου. struct node *find_element(struct node * start, int val) struct node *ptr, *pos; ptr = start ; while (ptr!= NULL) // in circular list, it becomes: while (ptr->next!= start) if (val == ptr->data) δείχνοντας το κόμβο που περιέχεται // Βρέθηκε το στοιχείο, επιστρέφουμε τον δείκτη pos = ptr ; return pos ; else ptr = ptr->next ; return NULL; // element is not found, we return NULL Καλούμε αυτή τη συνάρτηση για να βρούμε το στοιχείο με τιμή 4 ως εξής: struct node *elist; elist = find_element(head, 4) ; if (elist!= NULL) printf("the element %d found in our list", elist->data); else our list"); printf("the element has not been found in σε Γλώσσα C για Συνδεδεμένες Λίστες 11

16 2.3. Ψάχνοντας τη Μέγιστη ή Ελάχιστη τιμή int find_max(struct node * start) // Για την ελάχιστη τιμή: int find_min(struct node * start) int max ; // in case of min, it is: int min ; struct node *ptr ; ptr = start ; max = start->data ; // Για την ελάχιστη τιμή: min = start->data ; while (ptr!= NULL) if (ptr->data > max) max = ptr->data ; ptr = ptr->next ; // Στη κυκλικά συνδεδεμένη λίστα, προσθέτουμε τη γραμμή, για να ελέγξουμε το τελευταίο κόμβο if (ptr->data > max) max = ptr->data ; return max; /7 Καλούμε αυτή τη συνάρτηση για να βρούμε το μέγιστο στοιχείο ως εξής: int meg ; meg = find_max(head) ; printf("the maximum element is %d ", meg); Με ένα βήμα: printf("the maximum element is %d ", find_max(head)); σε Γλώσσα C για Συνδεδεμένες Λίστες 12

17 Στους πίνακες, χρησιμοποιούμαι την ίδια τεχνική: int size = 8 ; int arr[size] = 2, 5, 9, -5, 6, 8, 3, 6 ; int meg ; meg = array_max(arr, size) ; int array_max(int * pin, int n) int max ; for (i = 0; i < n ; i++) if (pin[i] > max) max = pin[i] ; // in case of min, it is: if (pin[i] < min) min = pin[i] ; return max; σε Γλώσσα C για Συνδεδεμένες Λίστες 13

18 2.4. Άθροισμα και Μέση Τιμή float list_average(struct node * start) // Σε συνάρτηση list_sum, it is: int list_sum(struct node * start) int athr, counter = 0 ; float ave ; struct node *ptr ; ptr = start ; while (ptr!= NULL) athr = athr + ptr->data ; counter++ ; ptr = ptr->next ; ave = athr / counter ; return ave; Καλουμε αυτή τη συνάρτηση για να βρούμε τη μέση τιμή ως εξής: int sum ; float average ; sum = list_sum(head) ; // head points at the beginning of the list average = list_average(head) ; // head points at the beginning of the list Σε πίνακες, χρησιμοποιούμε την ίδια τεχνική, αλλά έχουμε τον αριθμό κόμβων: int size = 8 ; int arr[size] = 2, 5, 9, -5, 6, 8, 3, 6 ; float average ; average = array_average(arr, size) ; float array_average(int * pin, int n) int i, athr ; float ave ; for (i = 0; i < n ; i++) athr = athr + pin[i] ; σε Γλώσσα C για Συνδεδεμένες Λίστες 14

19 ave = athr / counter ; return ave; σε Γλώσσα C για Συνδεδεμένες Λίστες 15

20 3. Εισαγωγή ενός νέου κόμβου Με τη χρήση δεικτών διευκολύνονται οι λειτουργίες της εισαγωγής και της διαγραφής δεδομένων στις λίστες. Στο σχήμα φαίνεται η εισαγωγή ενός νέου κόμβου μεταξύ του δεύτερου και τρίτου κόμβου της προηγούμενης λίστας. Όπως φαίνεται και στο σχήμα, οι απαιτούμενες ενέργειες για την εισαγωγή (παρεμβολή) του νέου κόμβου είναι ο δείκτης του δεύτερου κόμβου να δείχνει το νέο κόμβο και ο δείκτης του νέου κόμβου να δείχνει τον τρίτο κόμβο (δηλαδή να πάρει την τιμή που είχε πριν την εισαγωγή ο δείκτης του δεύτερου κόμβου). Έτσι οι κόμβοι της λίστας διατηρούν τη λογική τους σειρά, αλλά οι φυσικές θέσεις στη μνήμη μπορεί να είναι τελείως διαφορετικές. Κατάσταση πριν την εισαγωγή κόµβου σε συνδεδεµένη λίστα: (α) προς εισαγωγή κόµβος, (β) αρχική συνδεδεµένη λίστα Κατάσταση µετά την εισαγωγή κόµβου σε συνδεδεµένη λίστα Θα εξετάσουμε τις ακόλουθες περιπτώσεις: σε Γλώσσα C για Συνδεδεμένες Λίστες 16

21 1. Εισαγωγή στην αρχή 2. Εισαγωγή στο τέλος 3. Εισαγωγή μετά από κάποιον συγκεκριμένο κόμβο 4. Εισαγωγή πριν από κάποιον συγκεκριμένο κόμβο Ο κώδικας παρατίθεται στο επόμενο κεφάλαιο. σε Γλώσσα C για Συνδεδεμένες Λίστες 17

22 3.1. Διαγραφή ενός κόμβου Αντίστοιχα για τη διαγραφή ενός κόμβου αρκεί ν' αλλάξει τιμή ο δείκτης του προηγούμενου κόμβου και να δείχνει πλέον τον επόμενο αυτού που διαγράφεται, όπως φαίνεται στο σχήμα. Ο κόμβος που διαγράφηκε (ο τρίτος) αποτελεί "άχρηστο δεδομένο" και ο χώρος μνήμης που καταλάμβανε, παραχωρείται για άλλη χρήση. (α) Κατάσταση πριν, (β) κατάσταση µετά τη διαγραφή του 3ου κόµβου Θα εξετάσουμε τις ακόλουθες περιπτώσεις: 1. Διαγραφή του πρώτου κόμβου 2. Διαγραφή του τελευταίου κόμβου 3. Διαγραφή κάποιου συγκεκριμένου κόμβου 4. Διαγραφή του κόμβου που βρίσκεται μετά από κάποιον δεδομένο κόμβο Ο κώδικας παρατίθεται στο επόμενο κεφάλαιο. σε Γλώσσα C για Συνδεδεμένες Λίστες 18

23 3.2. Διαγραφή μιας συνδεδεμένης λίστας struct node *delete_list(struct node *start) // Διαγραφή ολόκληρης της λίστας struct node *ptr; // Νέος δείκτης if ( start == NULL ) start ; printf("\n There is no list to delete \n\n"); return ptr = start; // Ο δείκτης μετατίθεται στην αρχή της λίστας while(ptr->next!= NULL) start = delete_node_at_the_end(start); // διαγραφή όλων των κόμβων από το τέλος έως την αρχή αντίστροφα free(start); start = NULL ; // Αφαίρεση πρώτου κόμβου // αρχικοποίηση πρώτου κόμβου printf("\n Linked List Deleted \n\n"); return start; Καλούμε αυτή τη συνάρτηση για να διαγράψουμε τη λίστα ως εξής: head = delete_list(head) ; // δείκτης head στην αρχή της λίστας, όταν τελειώσει η λίστα ο δείκτης γίνεται NULL σε Γλώσσα C για Συνδεδεμένες Λίστες 19

24 4. Κυκλικές συνδεδεμένες λίστες Σε µια κυκλική συνδεδεμένη λίστα (circular linked list) ο δείκτης του τελευταίου κόμβου «δείχνει» πίσω στον πρώτο κόμβο της λίστας, όπως απεικονίζεται στο Σχήμα. Η κυκλική λίστα έχει το πλεονέκτημα, όπως και η διπλά συνδεδεμένη, ότι μπορούμε να προσπελάσουμε από έναν κόμβο οποιοδήποτε άλλο κόμβο. Σχηματικά η λίστα μοιάζει ως εξής: Η εικόνα της μνήμης είναι τώρα: Ο κώδικας για τις κυκλικές λίστες συμπεριλαμβάνεται στα σχόλια του κώδικα για τις απλές λίστες. σε Γλώσσα C για Συνδεδεμένες Λίστες 20

25 4.1. Διπλά συνδεδεμένες λίστες Στη διπλά συνδεδεμένη λίστα (two-way or doubly linked list), οι κόμβοι έχουν δύο δείκτες, έναν που «δείχνει» στον επόμενο κόμβο και ονομάζεται δεξιός δείκτης (right pointer), και έναν που «δείχνει» στον προηγούμενο κόμβο και ονομάζεται αριστερός δείκτης (left pointer). Στο Σχήμα, απεικονίζεται η σχηματική παράσταση μιας διπλά συνδεδεμένης λίστας. Όπως παρατηρείτε, ο κάθε κόμβος αποτελείται από τρία τμήματα, δύο ακραία για την αποθήκευση των δύο δεικτών και το μεσαίο για την αποθήκευση του στοιχείου (πληροφορίας) του κόβου. Δοθέντος ενός δείκτη Ρ μπορούμε να προσπελάσουμε όλους τους υπόλοιπους κόμβους της λίστας, κινούμενοι είτε προς τη µια είτε προς την άλλη κατεύθυνση, πράγμα που δεν µπορεί να γίνει σε µια απλά συνδεδεμένη λίστα. Γι αυτό, µπορούµε να εισάγουμε και να διαγράψουμε έναν κόμβο είτε πριν είτε µετά από τον δοθέντα. Σχηματικά η λίστα μοιάζει ως εξής: Ο ορισμός του κόμβου της λίστας γίνεται: struct dblnode int data; struct dblnode* next; struct dblnode* prev; ; Η εικόνα της μνήμης είναι τώρα: σε Γλώσσα C για Συνδεδεμένες Λίστες 21

26 5. Κυκλικές Διπλά συνδεδεμένες λίστες α) Σε µια κυκλική συνδεδεμένη λίστα ο δείκτης του τελευταίου κόμβου «δείχνει» πίσω στον πρώτο κόµβο της λίστας, όπως απεικονίζεται στο Σχήμα. β) Στη διπλά συνδεδεμένη λίστα, οι κόμβοι έχουν δύο δείκτες, έναν που «δείχνει» στον επόμενο κόμβο και ονομάζεται δεξιός δείκτης (right pointer), και έναν που «δείχνει» στον προηγούμενο κόμβο και ονομάζεται αριστερός δείκτης (left pointer). Σε µια κυκλική διπλά συνδεδεμένη λίστα συνδυάζουμε τις ιδιότητες α και β. Σχηματικά η λίστα μοιάζει ως εξής: Η εικόνα της μνήμης είναι τώρα: Ο κώδικας για τις κυκλικές λίστες συμπεριλαμβάνεται στα σχόλια του κώδικα για τις διπλές λίστες. 6. Επίδειξη του κώδικα σε Γλώσσα C για Συνδεδεμένες Λίστες 22

27 6.1. Ο κώδικας των συναρτήσεων #include <stdio.h> #include <stdlib.h> struct node int data; struct node* next; ; struct dblnode int data; struct dblnode* next; struct dblnode* prev; ; void print_list_iterative(struct node* head) struct node* ptr = head; if(!head) while(ptr) printf("empty list!"); return; printf("null"); printf("%d -> ", ptr->data); ptr = ptr->next; void print_list_iterative_double(struct dblnode* head) struct dblnode* ptr = head; σε Γλώσσα C για Συνδεδεμένες Λίστες 23

28 if(!head) while(ptr) printf("empty list!"); return; printf("null"); printf("%d <-> ", ptr->data); ptr = ptr->next; struct node * create_list(struct node *start, int num) struct node *new_node, *ptr; int i ; for (i = 0 ; i < num ; i++) // loop runs num times, every time one node is put at the end of the list if (start == NULL) // new node is the first node new_node = (struct node*)malloc(sizeof(struct node)); // get memory for the new node = start ; start = new_node; new_node->data = i; new_node->next = NULL ; // in circular list, it becomes: new_node->next else // new node is not the first node, nodes no 1 to num-1, insert the new node at the end of the list new node new_node = (struct node*)malloc(sizeof(struct node)); // get memory for the new_node->data = i; ptr = start; while(ptr->next!= NULL) // put the node's id as date // ptr goes to the last node σε Γλώσσα C για Συνδεδεμένες Λίστες 24

29 // in circular: while(ptr->next!= start) ptr = ptr->next; ptr->next = new_node; // the ex-last node is connected with the new node new_node->next = NULL; // and the new node becomes last // in circular list, it becomes: new_node->next = start ; printf("\n Linked List Created \n\n"); return start; void traverse_list(struct node * start) struct node *ptr; if ( start == NULL ) // the list doesn't exist printf("\n There is no list to work with \n\n"); ptr = start ; while (ptr!= NULL) // in circular list, it becomes: while (ptr->next!= start) printf("\n value = %d", ptr->data); // in general it is use ptr->data ; ptr = ptr->next ; // in circular list, add this line, to process the last node printf("\n value = %d", ptr->data); // in general it is use ptr->data ; int count_nodes(struct node * start) struct node *ptr; int count = 0 ; ptr = start ; σε Γλώσσα C για Συνδεδεμένες Λίστες 25

30 while (ptr!= NULL) count++ ; ptr = ptr->next ; return count; // in circular list, it becomes: while (ptr->next!= start) struct node *find_element(struct node * start, int val) struct node *ptr, *pos; ptr = start ; while (ptr!= NULL) // in circular list, it becomes: while (ptr->next!= start) if (val == ptr->data) // element is found, we return a pointer showing the node containing it pos = ptr ; return pos ; else ptr = ptr->next ; return NULL; // element is not found, we return NULL int find_max(struct node * start) // in case of min, it is: int find_min(struct node * start) int max ; // in case of min, it is: int min ; struct node *ptr ; ptr = start ; max = start->data ; // in case of min, it is: min = start->data ; while (ptr!= NULL) // in circular list, it becomes: while (ptr->next!= start) if (ptr->data > max) max = ptr->data ; // in case of min, it is: if (ptr->data < min) min = ptr->data ; σε Γλώσσα C για Συνδεδεμένες Λίστες 26

31 ptr = ptr->next ; // in circular list, add this line, to check the last node if (ptr->data > max) max = ptr->data ; return max; // in case of min, it is: return min ; float list_average(struct node * start) // in case of function list_sum, it is: int list_sum(struct node * start) int athr = 0, counter = 0 ; float ave ; struct node *ptr ; ptr = start ; while (ptr!= NULL) // in circular list, it becomes: while (ptr->next!= start) athr = athr + ptr->data ; counter++ ; ptr = ptr->next ; // in circular list, add this line, to process the last node athr = athr + ptr->data ; counter++ ; ave = (float)athr / counter ; return ave; // in case of function list_sum, it is: return athr ; struct node * insert_at_beginning(struct node * start, int num) struct node *new_node, *ptr ; new_node = (struct node *) malloc(sizeof(struct node)); new_node->data = num; new_node->next = start; // ptr = start; σε Γλώσσα C για Συνδεδεμένες Λίστες 27

32 // On circular // while(ptr->next!= start) ptr = ptr->next; // add these commands // ptr->next = new_node; start = new_node; return start; struct node * insert_at_end(struct node * start, int num) struct node *ptr, *new_node; new_node = (struct node *) malloc(sizeof(struct node)); new_node->data = num; new_node->next = NULL; // in circular list, it becomes: new_node->next = start; ptr = start; while(ptr->next!= NULL) ptr = ptr->next; ptr->next = new_node; return start; struct node *insert_after(struct node * start, int num, int val) struct node *new_node, *ptr, *preptr; new_node = (struct node *) malloc(sizeof(struct node)); new_node->data = num; ptr = start; preptr = ptr; while(preptr->data!= val) preptr = ptr; ptr = ptr->next; preptr->next = new_node; new_node->next = ptr; return start; σε Γλώσσα C για Συνδεδεμένες Λίστες 28

33 struct node *insert_before(struct node * start, int num, int val) struct node *new_node, *ptr, *preptr; new_node = (struct node *) malloc(sizeof(struct node)); new_node->data = num; ptr = start; while(ptr->data!= val) preptr = ptr; ptr = ptr->next; preptr->next = new_node; new_node->next = ptr; return start; struct node *delete_beg(struct node *start) struct node *ptr; if ( start == NULL ) // the list doesn't exist printf("\n There is no list to delete a node \n\n"); return start ; ptr = start; start = start->next; // On circular >next; free(ptr); return start; while(ptr->next!= start) ptr = ptr- // use these commands ptr->next = start->next; // free(start); start = ptr->next; struct node * delete_end(struct node *start) σε Γλώσσα C για Συνδεδεμένες Λίστες 29

34 struct node *ptr, *preptr; if ( start == NULL ) // the list doesn't exist printf("\n There is no list to delete a node \n\n"); return start ; ptr = start; while(ptr->next!= NULL) // On circular it is while(ptr->next!= start) preptr = ptr; ptr = ptr->next; preptr->next = NULL; // On circular it is preptr->next = ptr->next; free(ptr); return start; struct node * delete_node(struct node *start, int val) struct node *ptr, *preptr; if ( start == NULL ) // the list doesn't exist printf("\n There is no list to delete a node \n\n"); return start ; ptr = start; if (ptr->data == val) else >next; start = start->next; free(ptr); return start; while(ptr->data!= val && ptr->next!= NULL ) preptr = ptr; // On circular while(ptr->data!= val && ptr->next!= start) ptr = ptr- σε Γλώσσα C για Συνδεδεμένες Λίστες 30

35 if (ptr->data == val) preptr->next = ptr->next; free(ptr); return start; else printf("\n The element does not exist \n\n"); return start; struct node * delete_after(struct node *start, int val) struct node *ptr, *preptr; if ( start == NULL ) // the list doesn't exist printf("\n There is no list to delete a node \n\n"); return start ; ptr = start; preptr = ptr; while(ptr->data!= val && ptr->next!= NULL ) preptr = ptr; ptr = ptr- >next; // On circular while(ptr->data!= val && ptr->next!= start) if (ptr->data == val) preptr->next = ptr->next; free(ptr); return start; else printf("\n The element does not exist \n\n"); return start; struct node *delete_list(struct node *start) struct node *ptr; if ( start == NULL ) // a new pointer // the list doesn't exist // Delete the entire list printf("\n There is no list to delete \n\n"); return start ; σε Γλώσσα C για Συνδεδεμένες Λίστες 31

36 ptr = start; // ptr points at the start of the list while(ptr->next!= NULL) // On circular it is while(ptr->next!= start) start = delete_end(start); // delete all nodes (except first), from end to start, going backwards free(start); // remove the first node start = NULL ; // initialize the start pointer printf("\n Linked List Deleted \n\n"); return start; struct dblnode * create_list_double(struct dblnode *start, int num) struct dblnode *new_node, *ptr; int i ; for (i = 0 ; i < num ; i++) // loop runs num times, every time one node is put at the end of the list if(start == NULL) // new node is the first node new_node = (struct dblnode*)malloc(sizeof(struct dblnode)); // get memory for the new node = start ; = start ; start = new_node; new_node->data = i; new_node->next = NULL ; // in circular list, it becomes: new_node->next new_node->prev = NULL ; // in circular list, it becomes: new_node->prev else // new node is not the first node, nodes no 1 to num-1, insert the new node at the end of the list new_node = (struct dblnode*)malloc(sizeof(struct dblnode)); // get memory for the new node σε Γλώσσα C για Συνδεδεμένες Λίστες 32

37 new_node->data = i; // put the node's id as date ptr = start; while(ptr->next!= NULL) ptr = ptr->next; // ptr goes to the last node ptr->next = new_node; // the ex-last node is connected with the new node new_node->next = NULL; // and the new node becomes last // in circular list, it becomes: new_node->next = start ; new_node->prev = ptr; // and the new node becomes last // in circular list, add this line: start->prev = new_node; printf("\n Doubly Linked List Created \n\n"); return start; void traverse_list_double(struct dblnode * start) struct dblnode *ptr; if ( start == NULL ) // the list doesn't exist printf("\n There is no list to work with \n\n"); ptr = start ; while (ptr!= NULL) // in circular list, it becomes: while (ptr->next!= start) printf("\n value = %d", ptr->data); // in general it is use ptr->data ; ptr = ptr->next ; // in circular list, add this line, to process the last node printf("\n value = ", ptr->data); // in general it is use ptr->data ; int count_nodes_double(struct dblnode * start) σε Γλώσσα C για Συνδεδεμένες Λίστες 33

38 struct dblnode *ptr; int count = 0 ; ptr = start ; while (ptr!= NULL) // in circular list, it becomes: while (ptr->next!= start) count++ ; ptr = ptr->next ; // in circular list, add this line, to count the last node count++ ; return count; struct dblnode * find_element_double(struct dblnode * start, int val) struct dblnode *ptr, *pos; ptr = start ; while (ptr!= NULL) // in circular list, it becomes: while (ptr->next!= start) if (val == ptr->data) // element is found, we return a pointer showing the node containing it pos = ptr ; return pos ; else ptr = ptr->next ; // in circular list, add this line, to check the last node if (val == ptr->data) pos = ptr ; return pos ; return NULL; // element is not found, we return NULL int find_max_double(struct dblnode * start) // in case of min, it is: int find_min(struct dblnode * start) int max ; // in case of min, it is: int min ; struct dblnode *ptr ; σε Γλώσσα C για Συνδεδεμένες Λίστες 34

39 ptr = start ; max = start->data ; // in case of min, it is: min = start->data ; while (ptr!= NULL) // in circular list, it becomes: while (ptr->next!= start) if (ptr->data > max) // in case of min, it is: if (ptr->data < min) max = ptr->data ; ptr = ptr->next ; // in circular list, add this line, to check the last node if (ptr->data > max) max = ptr->data ; return max; // in case of min, it is: return min ; float list_average_double(struct dblnode * start) // in case of function list_sum, it is: int list_sum_double (struct dblnode * start) int athr = 0, counter = 0 ; float ave ; struct dblnode *ptr ; ptr = start ; while (ptr!= NULL) // in circular list, it becomes: while (ptr->next!= start) athr = athr + ptr->data ; counter++ ; ptr = ptr->next ; // in circular list, add this line, to process the last node athr = athr + ptr->data ; counter++ ; ave = (float)athr / counter ; return ave; // in case of function list_sum, it is: return athr ; struct dblnode * insert_at_beginning_double(struct dblnode * start, int num) σε Γλώσσα C για Συνδεδεμένες Λίστες 35

40 struct dblnode *new_node, *ptr ; new_node = (struct dblnode *) malloc(sizeof(struct dblnode)); new_node->data = num; new_node->prev = NULL; new_node->next = start; // ptr = start; // On circular // while(ptr->next!= start) ptr = ptr->next; // add these commands // ptr->next = new_node; // new_node->prev = ptr; start->prev = new_node; start = new_node; return start; struct dblnode * insert_at_end_double(struct dblnode * start, int num) start; struct dblnode *ptr, *new_node; new_node = (struct dblnode *) malloc(sizeof(struct dblnode)); new_node->data = num; new_node->next = NULL; // in circular list, it becomes: new_node->next = ptr = start; while(ptr->next!= NULL) ptr = ptr->next; ptr->next = new_node; new_node->prev = ptr; // in circular list, add this line: start->prev = new_node; return start; struct dblnode *insert_after_double(struct dblnode * start, int num, int val) σε Γλώσσα C για Συνδεδεμένες Λίστες 36

41 struct dblnode *new_node, *ptr ; new_node = (struct dblnode *) malloc(sizeof(struct dblnode)); new_node->data = num; ptr = start; while(ptr->data!= val) ptr = ptr->next; new_node->prev = ptr; new_node->next = ptr->next; ptr->next->prev = new_node; ptr->next = new_node; return start; struct dblnode *insert_before_double(struct dblnode * start, int num, int val) struct dblnode *new_node, *ptr, *preptr; new_node = (struct dblnode *) malloc(sizeof(struct dblnode)); new_node->data = num; ptr = start; while(ptr->data!= val) ptr = ptr->next; new_node->next = ptr; new_node->prev = ptr->prev; ptr->prev->next = new_node; ptr->prev = new_node; return start; struct dblnode *delete_beg_double(struct dblnode *start) struct dblnode *ptr, *komvos; if ( start == NULL ) // the list doesn't exist printf("\n There is no list to delete a node \n\n"); return start ; σε Γλώσσα C για Συνδεδεμένες Λίστες 37

42 ptr = start; start = start->next; // On circular while(ptr->next!= start) ptr = ptr- >next; start->prev = NULL; // use these commands ptr->next = start->next; free(ptr); // komvos = start; start = start >next; start >prev = ptr; free(komvos); return start; struct dblnode * delete_end_double(struct dblnode *start) struct dblnode *ptr ; if ( start == NULL ) // the list doesn't exist printf("\n There is no list to delete a node \n\n"); return start ; ptr = start; while(ptr->next!= NULL) ptr = ptr->next; // On circular it is while(ptr->next!= start) ptr = ptr- >next; ptr->prev->next = NULL; // On circular it is ptr->prev->next = start; free(ptr); return start; struct dblnode * delete_node_double(struct dblnode *start, int val) struct dblnode *ptr, *komvos; if ( start == NULL ) // the list doesn't exist printf("\n There is no list to delete a node \n\n"); return start ; ptr = start; σε Γλώσσα C για Συνδεδεμένες Λίστες 38

43 if (ptr->data == val) start = start->next; // On circular while(ptr->next!= start) ptr = ptr- >next; start->prev = NULL; // use these commands ptr->next = start - > next; free(ptr); // komvos = start; start = start >next; return start; // start >prev = ptr; free(komvos); return start; else while(ptr->data!= val && ptr->next!= NULL) ptr = ptr->next; // On circular while(ptr->data!= val && ptr->next!= start) if (ptr->data == val) ptr->prev->next = ptr->next; ptr->next->prev = ptr->prev; free(ptr); return start; else printf("\n The element does not exist \n\n"); return start; struct dblnode * delete_after_double(struct dblnode *start, int val) struct dblnode *ptr, *preptr, *komvos; if ( start == NULL ) // the list doesn't exist printf("\n There is no list to delete a node \n\n"); return start ; ptr = start; preptr = ptr; while(ptr->data!= val && ptr->next!= NULL) ptr = ptr->next; // On circular while(ptr->data!= val && ptr->next!= start) if (ptr->data == val) σε Γλώσσα C για Συνδεδεμένες Λίστες 39

44 komvos = ptr->next; ptr->next = komvos->next; komvos->next->prev = ptr; free(komvos); return start; else printf("\n The element does not exist \n\n"); return start; struct dblnode *delete_list_double(struct dblnode *start) // Delete the entire list struct dblnode *ptr; // a new pointer if ( start == NULL ) // the list doesn't exist printf("\n There is no list to delete \n\n"); return start ; ptr = start; // ptr points at the start of the list while(ptr->next!= NULL) // On circular it is while(ptr->next!= start) start = delete_end_double(start); // delete all nodes (except first), from end to start, going backwards free(start); // remove the first node start = NULL ; // initialize the start pointer printf("\n Linked List Deleted \n\n"); return start; σε Γλώσσα C για Συνδεδεμένες Λίστες 40

45 int main() struct node* list; int count ; struct node *elist, *alist; list = create_list(null, 30); print_list_iterative(list); traverse_list(list); count = count_nodes(list) ; printf("the list has %d nodes", count); elist = find_element(list, 4) ; alist = find_element(list, 64) ; if (elist!= NULL) printf("the element %d found in our list", elist->data); else printf("the element 4 has not been found in our list"); if (alist!= NULL) printf("the element %d found in our list", alist->data); else printf("the element 64 has not been found in our list"); printf("the maximum element is %d ", find_max(list)); printf("the average is %f ", list_average(list)); σε Γλώσσα C για Συνδεδεμένες Λίστες 41

46 list = insert_at_beginning(list, 22); print_list_iterative(list); list = insert_at_end(list, 22); print_list_iterative(list); list = insert_after(list, 222, 15); print_list_iterative(list); list = insert_before(list, 222, 15); print_list_iterative(list); list = delete_beg(list); print_list_iterative(list); list = delete_end(list); print_list_iterative(list); list = delete_node(list, 5); print_list_iterative(list); list = delete_after(list, 7777); print_list_iterative(list); list = delete_list(list); print_list_iterative(list); σε Γλώσσα C για Συνδεδεμένες Λίστες 42

47 struct dblnode* dbllist; struct dblnode *dblelist, *dblalist; dbllist = create_list_double(null, 30); print_list_iterative_double(dbllist); traverse_list_double(dbllist); count = count_nodes_double(dbllist) ; printf("the list has %d nodes", count); dblelist = find_element_double(dbllist, 4) ; dblalist = find_element_double(dbllist, 64) ; if (dblelist!= NULL) printf("the element %d found in our list", dblelist- >data); else printf("the element 4 has not been found in our list"); if (dblalist!= NULL) printf("the element %d found in our list", dblalist- >data); else printf("the element 64 has not been found in our list"); printf("the maximum element is %d ", find_max_double(dbllist)); printf("the average is %f ", list_average_double(dbllist)); dbllist = insert_at_beginning_double(dbllist, 22); print_list_iterative_double(dbllist); dbllist = insert_at_end_double(dbllist, 22); print_list_iterative_double(dbllist); σε Γλώσσα C για Συνδεδεμένες Λίστες 43

48 dbllist = insert_after_double(dbllist, 222, 15); print_list_iterative_double(dbllist); dbllist = insert_before_double(dbllist, 222, 15); print_list_iterative_double(dbllist); dbllist = delete_beg_double(dbllist); print_list_iterative_double(dbllist); dbllist = delete_end_double(dbllist); print_list_iterative_double(dbllist); dbllist = delete_node_double(dbllist, 5); print_list_iterative_double(dbllist); dbllist = delete_after_double(dbllist, 7777); print_list_iterative_double(dbllist); dbllist = delete_list_double(dbllist); print_list_iterative_double(dbllist); return 0; σε Γλώσσα C για Συνδεδεμένες Λίστες 44

49 6.2. Η έξοδος του προγράμματος $ gcc -o driver--complete driver--complete.c $./driver--complete Linked List Created 0 -> 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8 -> 9 -> 10 -> 11 -> 12 -> 13 -> 14 -> 15 -> 16 -> 17 -> 18 -> 19 -> 20 -> 21 -> 22 -> 23 -> 24 -> 25 -> 26 -> 27 -> 28 -> 29 -> null value = 0 value = 1 value = 2 value = 3 value = 4 value = 5 value = 6 value = 7 value = 8 value = 9 value = 10 value = 11 value = 12 value = 13 value = 14 value = 15 value = 16 value = 17 value = 18 value = 19 value = 20 value = 21 value = 22 value = 23 value = 24 value = 25 value = 26 value = 27 value = 28 value = 29 The list has 30 nodes The element 4 found in our list The element 64 has not been found in our list The maximum element is 29 σε Γλώσσα C για Συνδεδεμένες Λίστες 45

50 The average is > 0 -> 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8 -> 9 -> 10 -> 11 -> 12 -> 13 -> 14 -> 15 -> 16 -> 17 -> 18 -> 19 -> 20 -> 21 -> 22 -> 23 -> 24 -> 25 -> 26 -> 27 -> 28 -> 29 -> null 22 -> 0 -> 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8 -> 9 -> 10 -> 11 -> 12 -> 13 -> 14 -> 15 -> 16 -> 17 -> 18 -> 19 -> 20 -> 21 -> 22 -> 23 -> 24 -> 25 -> 26 -> 27 -> 28 -> 29 -> 22 -> null 22 -> 0 -> 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8 -> 9 -> 10 -> 11 -> 12 -> 13 -> 14 -> 15 -> 222 -> 16 -> 17 -> 18 -> 19 -> 20 -> 21 -> 22 -> 23 -> 24 -> 25 -> 26 -> 27 -> 28 -> 29 -> 22 -> null 22 -> 0 -> 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8 -> 9 -> 10 -> 11 -> 12 -> 13 -> 14 -> 222 -> 15 -> 222 -> 16 -> 17 -> 18 -> 19 -> 20 -> 21 -> 22 -> 23 -> 24 - > 25 -> 26 -> 27 -> 28 -> 29 -> 22 -> null 0 -> 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8 -> 9 -> 10 -> 11 -> 12 -> 13 -> 14 -> 222 -> 15 -> 222 -> 16 -> 17 -> 18 -> 19 -> 20 -> 21 -> 22 -> 23 -> 24 -> 25 - > 26 -> 27 -> 28 -> 29 -> 22 -> null 0 -> 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8 -> 9 -> 10 -> 11 -> 12 -> 13 -> 14 -> 222 -> 15 -> 222 -> 16 -> 17 -> 18 -> 19 -> 20 -> 21 -> 22 -> 23 -> 24 -> 25 - > 26 -> 27 -> 28 -> 29 -> null 0 -> 1 -> 2 -> 3 -> 4 -> 6 -> 7 -> 8 -> 9 -> 10 -> 11 -> 12 -> 13 -> 14 -> > 15 -> 222 -> 16 -> 17 -> 18 -> 19 -> 20 -> 21 -> 22 -> 23 -> 24 -> 25 -> 26 -> 27 -> 28 -> 29 -> null The element does not exist 0 -> 1 -> 2 -> 3 -> 4 -> 6 -> 7 -> 8 -> 9 -> 10 -> 11 -> 12 -> 13 -> 14 -> > 15 -> 222 -> 16 -> 17 -> 18 -> 19 -> 20 -> 21 -> 22 -> 23 -> 24 -> 25 -> 26 -> 27 -> 28 -> 29 -> null Linked List Deleted empty list! Doubly Linked List Created 0 <-> 1 <-> 2 <-> 3 <-> 4 <-> 5 <-> 6 <-> 7 <-> 8 <-> 9 <-> 10 <-> 11 <-> 12 <-> 13 <-> 14 <-> 15 <-> 16 <-> 17 <-> 18 <-> 19 <-> 20 <-> 21 <-> 22 <-> 23 <-> 24 <-> 25 <-> 26 <-> 27 <-> 28 <-> 29 <-> null value = 0 value = 1 value = 2 value = 3 value = 4 value = 5 value = 6 σε Γλώσσα C για Συνδεδεμένες Λίστες 46

51 value = 7 value = 8 value = 9 value = 10 value = 11 value = 12 value = 13 value = 14 value = 15 value = 16 value = 17 value = 18 value = 19 value = 20 value = 21 value = 22 value = 23 value = 24 value = 25 value = 26 value = 27 value = 28 value = 29 The list has 30 nodes The element 4 found in our list The element 64 has not been found in our list The maximum element is 29 The average is <-> 0 <-> 1 <-> 2 <-> 3 <-> 4 <-> 5 <-> 6 <-> 7 <-> 8 <-> 9 <-> 10 <-> 11 <-> 12 <-> 13 <-> 14 <-> 15 <-> 16 <-> 17 <-> 18 <-> 19 <-> 20 <-> 21 <-> 22 <-> 23 <-> 24 <-> 25 <-> 26 <-> 27 <-> 28 <-> 29 <-> null 22 <-> 0 <-> 1 <-> 2 <-> 3 <-> 4 <-> 5 <-> 6 <-> 7 <-> 8 <-> 9 <-> 10 <-> 11 <-> 12 <-> 13 <-> 14 <-> 15 <-> 16 <-> 17 <-> 18 <-> 19 <-> 20 <-> 21 <-> 22 <-> 23 <-> 24 <-> 25 <-> 26 <-> 27 <-> 28 <-> 29 <-> 22 <-> null 22 <-> 0 <-> 1 <-> 2 <-> 3 <-> 4 <-> 5 <-> 6 <-> 7 <-> 8 <-> 9 <-> 10 <-> 11 <-> 12 <-> 13 <-> 14 <-> 15 <-> 222 <-> 16 <-> 17 <-> 18 <-> 19 <-> 20 <-> 21 <-> 22 <-> 23 <-> 24 <-> 25 <-> 26 <-> 27 <-> 28 <-> 29 <-> 22 <-> null 22 <-> 0 <-> 1 <-> 2 <-> 3 <-> 4 <-> 5 <-> 6 <-> 7 <-> 8 <-> 9 <-> 10 <-> 11 <-> 12 <-> 13 <-> 14 <-> 222 <-> 15 <-> 222 <-> 16 <-> 17 <-> 18 <-> 19 <-> 20 <-> 21 <-> 22 <-> 23 <-> 24 <-> 25 <-> 26 <-> 27 <-> 28 <-> 29 <-> 22 <-> null 0 <-> 1 <-> 2 <-> 3 <-> 4 <-> 5 <-> 6 <-> 7 <-> 8 <-> 9 <-> 10 <-> 11 <-> 12 <-> 13 <-> 14 <-> 222 <-> 15 <-> 222 <-> 16 <-> 17 <-> 18 <-> 19 <-> σε Γλώσσα C για Συνδεδεμένες Λίστες 47

52 20 <-> 21 <-> 22 <-> 23 <-> 24 <-> 25 <-> 26 <-> 27 <-> 28 <-> 29 <-> 22 <-> null 0 <-> 1 <-> 2 <-> 3 <-> 4 <-> 5 <-> 6 <-> 7 <-> 8 <-> 9 <-> 10 <-> 11 <-> 12 <-> 13 <-> 14 <-> 222 <-> 15 <-> 222 <-> 16 <-> 17 <-> 18 <-> 19 <-> 20 <-> 21 <-> 22 <-> 23 <-> 24 <-> 25 <-> 26 <-> 27 <-> 28 <-> 29 <-> null 0 <-> 1 <-> 2 <-> 3 <-> 4 <-> 6 <-> 7 <-> 8 <-> 9 <-> 10 <-> 11 <-> 12 <- > 13 <-> 14 <-> 222 <-> 15 <-> 222 <-> 16 <-> 17 <-> 18 <-> 19 <-> 20 <- > 21 <-> 22 <-> 23 <-> 24 <-> 25 <-> 26 <-> 27 <-> 28 <-> 29 <-> null The element does not exist 0 <-> 1 <-> 2 <-> 3 <-> 4 <-> 6 <-> 7 <-> 8 <-> 9 <-> 10 <-> 11 <-> 12 <- > 13 <-> 14 <-> 222 <-> 15 <-> 222 <-> 16 <-> 17 <-> 18 <-> 19 <-> 20 <- > 21 <-> 22 <-> 23 <-> 24 <-> 25 <-> 26 <-> 27 <-> 28 <-> 29 <-> null Linked List Deleted empty list! 7. Συμπεράσματα Ο πίνακας στηρίζεται στις έννοιες του συνόλου και της απεικόνισης (συνάρτησης), ενώ η λίστα στηρίζεται στην έννοια της ακολουθίας. Έτσι, ένας πίνακας θεωρείται σαν µία δομή τυχαίας προσπέλασης, ενώ µία λίστα είναι στην ουσία µία δομή ακολουθίας ή σειριακής προσπέλασης (sequential access). Για να φθάσουμε, δηλαδή, σένα ένα στοιχείο μιας λίστας πρέπει να περάσουμε από όλα τα προηγούμενα ξεκινώντας από το πρώτο. Δεύτερον, το μέγεθος ενός πίνακα παραμένει σταθερό, ενώ το μέγεθος μιας λίστας όχι, διότι συνήθως απαιτούνται διαγραφές παλαιών και εισαγωγές νέων σε Γλώσσα C για Συνδεδεμένες Λίστες 48

53 στοιχείων. Δηλαδή, µια λίστα είναι µια δυναμική δομή και όχι στατική, όπως ο πίνακας. H εξέταση μιας δομής δεδομένων με βάση τη μνήμη θα μπορούσε να αποδώσει καλύτερη εικόνα για την επιλογή μιας συγκεκριμένης δομής δεδομένων ή ακόμα και για τη σχεδίαση μιας νέας δομής δεδομένων. Επίσης δεν απαιτείται κατανάλωση μνήμης καθώς οι λειτουργίες που λαμβάνουν μέρος δεν καταλαμβάνουν επιπλέον χώρο καθιστώντας την κατανομή μνήμης πιο προβλέψιμη για μια δεδομένη είσοδο. Επομένως, όταν απαιτείται μόνο αναζήτηση στοιχείων, ο πίνακας είναι προτιμότερος, ενώ αν γίνονται συχνά εισαγωγές ή διαγραφές απαιτείται μια δυναμική δομή όπως η συνδεδεμένη λίστα. σε Γλώσσα C για Συνδεδεμένες Λίστες 49

54 8. Βιβλιογραφία [1] Μανωλόπουλος, Ι., Δοµές Δεδοµένων, τόµ. Α, ART of TEXT, 2η έκδοση, Θεσσαλονίκη [2] Cormen, H. T., Leiserson E. C. και Rivest, L. R., Introduction to Algorithms, McGraw-Hill, Cambridge, MA 1996 [3] Main M. και Savitch W., Data Structures and Other Objects, Benjamin/Cummings, Redwood City, CA [4] Standish, A. T., Data Structures, Algorithm and Software Principles, Addison-Wesley, Reading, MA [5] Weiss, A. M., Data Structures and Algorithm Analysis, Benjamin/ Cummings, 2nd Edition, Redwood City, CA [6] Nicklaus Wirth, Algorithms & Data Structures, [7] Summit, Steve. C Programming Notes - Chapter 11: Memory Allocation, 30 October σε Γλώσσα C για Συνδεδεμένες Λίστες 50

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

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

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

Δομές Δεδομένων & Αλγόριθμοι

Δομές Δεδομένων & Αλγόριθμοι Λίστες Λίστες - Απλά Συνδεδεμένες Λίστες - Διπλά Συνδεδεμένες Λίστες Είδη Γραμμικών Λιστών Σειριακή Λίστα Καταλαμβάνει συνεχόμενες θέσεις κύριας μνήμης Συνδεδεμένη Λίστα Οι κόμβοι βρίσκονται σε απομακρυσμένες

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

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

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

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

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

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

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

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

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

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

Διάλεξη 08: Λίστες ΙΙ Κυκλικές Λίστες

Διάλεξη 08: Λίστες ΙΙ Κυκλικές Λίστες ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 1 Διάλεξη 08: Λίστες ΙΙ Κυκλικές Λίστες Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: - Κυκλικές Απλά Συνδεδεμένες Λίστες - Κυκλικές Διπλά Συνδεδεμένες

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

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

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

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

Εργαστήριο 4: Υλοποίηση Αφηρημένου Τύπου Δεδομένων: Ταξινομημένη Λίστα

Εργαστήριο 4: Υλοποίηση Αφηρημένου Τύπου Δεδομένων: Ταξινομημένη Λίστα Εργαστήριο 4: Υλοποίηση Αφηρημένου Τύπου Δεδομένων: Ταξινομημένη Λίστα Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: -Λίστες -Υλοποίηση ταξινομημένης λίστας με δυναμική δέσμευση μνήμης ΕΠΛ035

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

ΕΡΓΑΣΤΗΡΙΟ 5 ΣΗΜΕΙΩΣΕΙΣ

ΕΡΓΑΣΤΗΡΙΟ 5 ΣΗΜΕΙΩΣΕΙΣ ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΙΑΣ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ 2017-2018 ΧΕΙΜΕΡΙΝΟ ΕΞΑΜΗΝΟ ΜΑΘΗΜΑ: ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ Ουρές ΕΡΓΑΣΤΗΡΙΟ 5 ΣΗΜΕΙΩΣΕΙΣ Μια ουρά αποτελεί μια δομή δεδομένων στη λογική του First-in

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

Διάλεξη 13: Δομές Δεδομένων ΙΙ (Ταξινομημένες Λίστες)

Διάλεξη 13: Δομές Δεδομένων ΙΙ (Ταξινομημένες Λίστες) Τμήμα Πληροφορικής Πανεπιστήμιο Κύπρου ΕΠΛ132 Αρχές Προγραμματισμού II Διάλεξη 13: Δομές Δεδομένων ΙΙ (Ταξινομημένες Λίστες) Δημήτρης Ζεϊναλιπούρ http://www.cs.ucy.ac.cy/courses/epl132 13-1 Περιεχόμενο

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

Ανάπτυξη Εφαρμογών σε Προγραμματιστικό Περιβάλλον

Ανάπτυξη Εφαρμογών σε Προγραμματιστικό Περιβάλλον Ανάπτυξη Εφαρμογών σε Προγραμματιστικό Περιβάλλον ΚΕΦΑΛΑΙΑ 3 και 9 ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΚΑΙ ΑΛΓΟΡΙΘΜΟΙ ΠΙΝΑΚΕΣ Δεδομένα αφαιρετική αναπαράσταση της πραγματικότητας και συνεπώς μία απλοποιημένη όψη της δηλαδή.

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

Προγραμματισμός Ι. Δυναμική Διαχείριση Μνήμης. Δημήτρης Μιχαήλ. Ακ. Έτος 2011-2012. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Προγραμματισμός Ι. Δυναμική Διαχείριση Μνήμης. Δημήτρης Μιχαήλ. Ακ. Έτος 2011-2012. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο Προγραμματισμός Ι Δυναμική Διαχείριση Μνήμης Δημήτρης Μιχαήλ Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο Ακ. Έτος 2011-2012 Ανάγκη για Δυναμική Μνήμη Στατική Μνήμη Μέχρι τώρα χρησιμοποιούσαμε

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

Σύνοψη Προηγούμενου. Λίστες (Lists) Συνδεδεμένες Λίστες: Εισαγωγή (1/2) Συνδεδεμένες Λίστες. Ορέστης Τελέλης

Σύνοψη Προηγούμενου. Λίστες (Lists) Συνδεδεμένες Λίστες: Εισαγωγή (1/2) Συνδεδεμένες Λίστες. Ορέστης Τελέλης Σύνοψη Προηγούμενου Λίστες (Lists) Ορέστης Τελέλης telelis@unipi.gr Τμήμα Ψηφιακών Συστημάτων, Πανεπιστήμιο Πειραιώς Στοίβες (Stacks) : στην κορυφή της στοίβας ( ) από την κορυφή της στοίβας ( ) Ουρές

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

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

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

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

HY150a Φροντιστήριο 3 24/11/2017

HY150a Φροντιστήριο 3 24/11/2017 HY150a Φροντιστήριο 3 24/11/2017 1 Assignment 3 Overview Το πρόγραμμα ζητείται να διαβάζει μια λίστα δεδομένων που περιγράφει τα διαθέσιμα τμήματα μνήμης (blocks) ενός ΗΥ. Το πρόγραμμα ζητείται να μεταφορτώνει

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

υναµικές οµές εδοµένων (συν.) Στην ενότητα αυτή θα µελετηθούν τα εξής επιµέρους θέµατα:

υναµικές οµές εδοµένων (συν.) Στην ενότητα αυτή θα µελετηθούν τα εξής επιµέρους θέµατα: υναµικές οµές εδοµένων (συν.) Στην ενότητα αυτή θα µελετηθούν τα εξής επιµέρους θέµατα: Ταξινοµηµένες Λίστες µε δυναµική δέσµευση µνήµης Αναδροµκές συναρτήσεις ΕΠΛ 12 Αρχές Προγραµµατισµού ΙΙ 1 Λίστες

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

Διάλεξη 15: Δομές Δεδομένων IV (Διπλά Συνδεδεμένες Λίστες)

Διάλεξη 15: Δομές Δεδομένων IV (Διπλά Συνδεδεμένες Λίστες) Τμήμα Πληροφορικής Πανεπιστήμιο Κύπρου ΕΠΛ132 Αρχές Προγραμματισμού II Διάλεξη 15: Δομές Δεδομένων IV (Διπλά Συνδεδεμένες Λίστες) Δημήτρης Ζεϊναλιπούρ http://www.cs.ucy.ac.cy/courses/epl132 15-1 Περιεχόμενο

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

Η γλώσσα προγραμματισμού C Συνδεδεμένες Λίστες

Η γλώσσα προγραμματισμού C Συνδεδεμένες Λίστες Η γλώσσα προγραμματισμού C Συνδεδεμένες Λίστες Τι είναι οι συνδεδεμένες λίστες (linked lists) Μια Συνδεδεμένη Λίστα (Σ.Λ.) είναι μια διάταξη από κόμβους που μπορούμε να τους διαχειριστούμε δυναμικά. Κάθε

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

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

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

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

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

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

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

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

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ Διάλεξη 6: Διαχείριση Μνήμης & Δυναμικές Δομές Δεδομένων Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: Δυναμικές Δομές Δεδομένων Γενικά Δυναμική Δέσμευση/Αποδέσμευση Μνήμης Δομή τύπου structure

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

Διάλεξη 15: Δομές Δεδομένων IV (Διπλά Συνδεδεμένες Λίστες)

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

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

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

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

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

Διάλεξη 14: Δομές Δεδομένων ΙΙI (Λίστες και Παραδείγματα)

Διάλεξη 14: Δομές Δεδομένων ΙΙI (Λίστες και Παραδείγματα) Τμήμα Πληροφορικής Πανεπιστήμιο Κύπρου ΕΠΛ132 Αρχές Προγραμματισμού II Διάλεξη 14: Δομές Δεδομένων ΙΙI (Λίστες και Παραδείγματα) Δημήτρης Ζεϊναλιπούρ http://www.cs.ucy.ac.cy/courses/epl132 14-1 Περιεχόμενο

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

Alternative to Balanced Trees, Comms of the ACM, 33(6), June 1990,

Alternative to Balanced Trees, Comms of the ACM, 33(6), June 1990, ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΘΗΝΩΝ Τμήμα Πληροφορικής & Τηλεπικοινωνιών Μια σημείωση από τον Α. Δελή για το άρθρο: W. Pugh, Skip Lists: A Probabilistic Alternative to Balanced Trees, Comms of the ACM, 33(), June 10,

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

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

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

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

Προγραμματισμός Ι. Δομές Δεδομένων. Δημήτρης Μιχαήλ. Ακ. Έτος Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Προγραμματισμός Ι. Δομές Δεδομένων. Δημήτρης Μιχαήλ. Ακ. Έτος Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο Προγραμματισμός Ι Δομές Δεδομένων Δημήτρης Μιχαήλ Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο Ακ. Έτος 2009-2010 Δομές Δεδομένων Μια δομή δεδομένων είναι μια συλλογή δεδομένων με κάποιες

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

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

Βασικές Έννοιες Δοµών Δεδοµένων Δοµές Δεδοµένων Δοµές Δεδοµένων Στην ενότητα αυτή θα γνωρίσουµε ορισµένες Δοµές Δεδοµένων και θα τις χρησιµοποιήσουµε για την αποδοτική επίλυση του προβλήµατος του ευσταθούς ταιριάσµατος Βασικές Έννοιες

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

Υλοποίηση Λιστών. Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα:

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

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

Δομές Δεδομένων (Data Structures)

Δομές Δεδομένων (Data Structures) Δομές Δεδομένων (Data Structures) Γραμμικές Λίστες Βασικές Έννοιες Βασικές Έννοιες. Αναπαράσταση με τύπο και με δείκτη. Γραμμικές Λίστες. Βασικές Λειτουργίες. Δομές Δεδομένων: Βασικές Έννοιες Αντικείμενο

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

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

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

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

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

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ Διάλεξη 9: Στοίβες:Υλοποίηση & Εφαρμογές Στην ενότητα αυτή θα μελετηθεί η χρήση στοιβών στις εξής εφαρμογές: Υλοποίηση Στοιβών με Δυναμική Δέσμευση Μνήμης Εφαρμογή Στοιβών 1: Αναδρομικές συναρτήσεις Εφαρμογή

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

Στόχοι και αντικείμενο ενότητας. Πέρασμα Πίνακα σε Συνάρτηση (συν.) Πέρασμα Πίνακα σε Συνάρτηση. #8.. Ειδικά Θέματα Αλγορίθμων

Στόχοι και αντικείμενο ενότητας. Πέρασμα Πίνακα σε Συνάρτηση (συν.) Πέρασμα Πίνακα σε Συνάρτηση. #8.. Ειδικά Θέματα Αλγορίθμων Στόχοι και αντικείμενο ενότητας Πέρασμα Πίνακα σε Συνάρτηση #8.. Ειδικά Θέματα Αλγορίθμων Προβλήματα Αναζήτησης Γραμμική Αναζήτηση (Linear Search) Ενημέρωση Μέτρηση Δυαδική Αναζήτηση (Binary Search) Προβλήματα

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

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

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

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

Διάλεξη 08: Λίστες ΙΙ Κυκλικές Λίστες

Διάλεξη 08: Λίστες ΙΙ Κυκλικές Λίστες ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 1 Διάλεξη 0: Λίστες ΙΙ Κυκλικές Λίστες Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: - Κυκλικές Απλά Συνδεδεμένες Λίστες - Κυκλικές Διπλά Συνδεδεμένες

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

ΑΣΚΗΣΗ 6: ΔΕΙΚΤΕΣ. Σκοπός της Άσκησης. 1. Εισαγωγικά στοιχεία για τους Δείκτες

ΑΣΚΗΣΗ 6: ΔΕΙΚΤΕΣ. Σκοπός της Άσκησης. 1. Εισαγωγικά στοιχεία για τους Δείκτες Σκοπός της Άσκησης ΑΣΚΗΣΗ 6: ΔΕΙΚΤΕΣ Ο σκοπός αυτής της εργαστηριακής άσκησης είναι η εξοικείωση με τη χρήση των δεικτών (pointers). Οι δείκτες δίνουν την δυνατότητα σε προγράμματα να προσομοιώνουν τη

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

Δομές δεδομένων (2) Αλγόριθμοι

Δομές δεδομένων (2) Αλγόριθμοι Δομές δεδομένων (2) Αλγόριθμοι Παράγωγοι τύποι (struct) σύνοψη προηγουμένων Πίνακες: πολλές μεταβλητές ίδιου τύπου Παράγωγοι τύποι ή Δομές (struct): ομαδοποίηση μεταβλητών διαφορετικού τύπου struct Student

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

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

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

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

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

Εισαγωγή στον Προγραμματισμό Εισαγωγή στον Προγραμματισμό Έλεγχος Δημήτρης Μιχαήλ Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο Ακ. Έτος 2012-2013 Σχεσιακοί Τελεστές και Ισότητας Ένα πρόγραμμα εκτός από αριθμητικές πράξεις

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

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

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

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

Τύποι Δεδομένων και Απλές Δομές Δεδομένων. Παύλος Εφραιμίδης V1.0 ( )

Τύποι Δεδομένων και Απλές Δομές Δεδομένων. Παύλος Εφραιμίδης V1.0 ( ) Τύποι Δεδομένων και Απλές Δομές Δεδομένων Παύλος Εφραιμίδης V1.0 (2014-01-13) Απλές Δομές Δεδομένων Στην ενότητα αυτή θα γνωρίσουμε ορισμένες απλές Δομές Δεδομένων και θα τις χρησιμοποιήσουμε για την αποδοτική

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

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ EPL035: ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΚΑΙ ΑΛΓΟΡΙΘΜΟΙ

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ EPL035: ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΚΑΙ ΑΛΓΟΡΙΘΜΟΙ ΠΝΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΤΜΗΜ ΠΛΗΡΟΦΟΡΙΚΗΣ EPL035: ΔΟΜΣ ΔΔΟΜΝΩΝ ΚΙ ΛΓΟΡΙΘΜΟΙ ΗΜΡΟΜΗΝΙ: 14/11/2018 ΔΙΓΝΩΣΤΙΚΟ ΠΝΩ Σ ΔΝΔΡΙΚΣ ΔΟΜΣ ΚΙ ΓΡΦΟΥΣ Διάρκεια: 45 λεπτά Ονοματεπώνυμο:. ρ. Ταυτότητας:. ΒΘΜΟΛΟΓΙ ΣΚΗΣΗ ΒΘΜΟΣ

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

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

διεύθυνση πρώτου στοιχείου διεύθυνση i-οστού στοιχείου T t[n]; &t[0] είναι t &t[i] είναι t + i*sizeof(t) Προγραµµατισµός Ι (ΗΥ120) ιάλεξη 18: ιασυνδεµένες οµές - Λίστες ιασυνδεδεµένες δοµές δεδοµένων Η µνήµη ενός πίνακα δεσµεύεται συνεχόµενα. Η πρόσβαση στο i-οστό στοιχείο είναι άµεσηκαθώς η διεύθυνση του

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

Διαδικασιακός Προγραμματισμός

Διαδικασιακός Προγραμματισμός Τμήμα ΜΗΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗΣ ΤΕ ΤΕΙ ΔΥΤΙΚΗΣ ΕΛΛΑΔΑΣ Διαδικασιακός Προγραμματισμός Διάλεξη 14 η Διαχείριση Μνήμης και Δομές Δεδομένων Οι διαλέξεις βασίζονται στο βιβλίο των Τσελίκη και Τσελίκα C: Από τη

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

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

Προγραμματισμός Ι (ΗΥ120) Προγραμματισμός Ι (ΗΥ120) Διάλεξη 15: Διασυνδεμένες Δομές - Λίστες Διασυνδεδεμένες δομές δεδομένων Η μνήμη ενός πίνακα δεσμεύεται συνεχόμενα. Η πρόσβαση στο i-οστό στοιχείο είναι άμεση καθώς η διεύθυνση

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

Υπολογισμός - Εντολές Επανάληψης

Υπολογισμός - Εντολές Επανάληψης Προγραμματισμός Η/Υ Ι Υπολογισμός - Εντολές Επανάληψης ΕΛΕΥΘΕΡΙΟΣ ΚΟΣΜΑΣ ΕΑΡΙΝΟ ΕΞΑΜΗΝΟ 2018-2019 ΤΜΗΜΑ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ Τ.Ε. 1 Περίληψη Σήμερα... θα συνεχίσουμε τη συζήτησή μας για τα βασικά στοιχεία

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

Δομημένος Προγραμματισμός (ΤΛ1006)

Δομημένος Προγραμματισμός (ΤΛ1006) Τεχνολογικό Εκπαιδευτικό Ίδρυμα Κρήτης Σχολή Εφαρμοσμένων Επιστημών Τμήμα Ηλεκτρονικών Μηχανικών Τομέας Αυτοματισμού και Πληροφορικής Δομημένος Προγραμματισμός (ΤΛ1006) Δρ. Μηχ. Νικόλαος Πετράκης, Καθηγητής

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

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

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

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

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

Εισαγωγή στον Προγραμματισμό Εισαγωγή στον Προγραμματισμό Πίνακες Δημήτρης Μιχαήλ Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο Ακ. Έτος 2012-2013 Πίνακες Πολλές φορές θέλουμε να κρατήσουμε στην μνήμη πολλά αντικείμενα

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

Οι λίστες, χάνοντας τα πλεονεκτήματα των πινάκων, λύνουν προβλήματα που παρουσιάζουν οι πίνακες

Οι λίστες, χάνοντας τα πλεονεκτήματα των πινάκων, λύνουν προβλήματα που παρουσιάζουν οι πίνακες Δομές δεδομένων Πίνακες Οι πίνακες είναι το πιο απλό «μέσο» αποθήκευσης ομοειδούς πληροφορίας. Χρησιμοποιούν ακριβώς όση μνήμη χρειάζεται για την αποθήκευση της πληροφορίας Επιτρέπουν την προσπέλαση άμεσα

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

Εισαγωγή στους Η/Υ. Γιώργος Δημητρίου. Μάθημα 3-4: Προγραμματισμός MIPS. Πανεπιστήμιο Θεσσαλίας - Τμήμα Πληροφορικής

Εισαγωγή στους Η/Υ. Γιώργος Δημητρίου. Μάθημα 3-4: Προγραμματισμός MIPS. Πανεπιστήμιο Θεσσαλίας - Τμήμα Πληροφορικής Γιώργος Δημητρίου Μάθημα 3-4: Προγραμματισμός MIPS Προγραμματισμός σε Συμβολική Γλώσσα Η συμβολική γλώσσα: δεν έχει τύπους, δεν έχει δηλώσεις μεταβλητών, δεν έχει δομές ελέγχου, δεν έχει εντολές βρόχων,

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

Πανεπιστήμιο Πειραιώς Σχολή Τεχνολογιών Πληροφορικής και Επικοινωνιών Τμήμα Ψηφιακών Συστημάτων ομές εδομένων

Πανεπιστήμιο Πειραιώς Σχολή Τεχνολογιών Πληροφορικής και Επικοινωνιών Τμήμα Ψηφιακών Συστημάτων ομές εδομένων Πανεπιστήμιο Πειραιώς Σχολή Τεχνολογιών Πληροφορικής και Επικοινωνιών Τμήμα Ψηφιακών Συστημάτων 3. Στοίβες & Ουρές 2 ομές εδομένων 4 5 Χρήστος ουλκερίδης Τμήμα Ψηφιακών Συστημάτων 19/10/2017 Ανακεφαλαίωση:

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

Ανάπτυξη Μεγάλων Εφαρµογών στη Γλώσσα C (2)

Ανάπτυξη Μεγάλων Εφαρµογών στη Γλώσσα C (2) Ανάπτυξη Μεγάλων Εφαρµογών στη Γλώσσα C (2) Στην ενότητα αυτή θα µελετηθούν τα εξής επιµέρους θέµατα: Οργάνωση Προγράµµατος Header Files Μετάφραση και σύνδεση αρχείων προγράµµατος ΕΠΛ 132 Αρχές Προγραµµατισµού

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

Σημειώσεις όγδοης εβδομάδας

Σημειώσεις όγδοης εβδομάδας Σημειώσεις όγδοης εβδομάδας Για να την δημιουργία σειριακών αρχείων, χρησιμοποιείται η fopen(filename, w ). Το αρχείο δημιουργείται στον ίδιο φάκελο που τρέχει το εκτελέσιμο πρόγραμμα. Το παρακάτω πρόγραμμα,

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

C: Από τη Θεωρία στην Εφαρμογή

C: Από τη Θεωρία στην Εφαρμογή Δρ. Γ. Σ. Τσελίκης Δρ. Ν. Δ. Τσελίκας C: Από τη Θεωρία στην Εφαρμογή Ενδεικτικές Ασκήσεις από το Βιβλίο C: Από τη Θεωρία στην Εφαρμογή (Γ. Σ. Τσελίκης Ν. Δ. Τσελίκας) Ενδεικτικές Ασκήσεις του Βιβλίου Ε.Α.1

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

Διάλεξη 13η: Δυναμική Διαχείρηση Μνήμης, μέρος 1

Διάλεξη 13η: Δυναμική Διαχείρηση Μνήμης, μέρος 1 Διάλεξη 13η: Δυναμική Διαχείρηση Μνήμης, μέρος 1 Τμήμα Επιστήμης Υπολογιστών, Πανεπιστήμιο Κρήτης Εισαγωγή στην Επιστήμη Υπολογιστών Βασίζεται σε διαφάνειες του Κ Παναγιωτάκη Πρατικάκης (CSD) Μνήμη I CS100,

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

Μνήμη Διευθύνσεις Δείκτες. Προγραμματισμός II 1

Μνήμη Διευθύνσεις Δείκτες. Προγραμματισμός II 1 Μνήμη Διευθύνσεις Δείκτες Προγραμματισμός II 1 lalis@inf.uth.gr Μνήμη Η/Υ Ειδικό υλικό, ξεχωριστό από τον επεξεργαστή Χρησιμεύει για την αποθήκευση δεδομένων και της κατάστασης εκτέλεσης του προγράμματος

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

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

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

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

Στοίβες με Δυναμική Δέσμευση Μνήμης

Στοίβες με Δυναμική Δέσμευση Μνήμης ΕΠΛ 231 ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΚΑΙ ΑΛΓΟΡΙΘΜΟΙ 10/02/10 Παύλος Αντωνίου Στοίβες με Δυναμική Δέσμευση Μνήμης Στοίβα: Στοίβα είναι μια λίστα που έχει ένα επιπλέον περιορισμό. Ο περιορισμός είναι ότι οι εισαγωγές

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

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

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

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

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

Εισαγωγή στον Προγραμματισμό Εισαγωγή στον Προγραμματισμό Συναρτήσεις Δημήτρης Μιχαήλ Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο Ακ. Έτος 2012-2013 Συναρτήσεις Ως τώρα γράφαμε όλα τα προγράμματα μας μέσα στην main..1

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

Προγραμματισμός Η/Υ (ΤΛ2007 )

Προγραμματισμός Η/Υ (ΤΛ2007 ) Τμήμα Ηλεκτρονικών Μηχανικών Τ.Ε.Ι. Κρήτης Προγραμματισμός Η/Υ (ΤΛ2007 ) Δρ. Μηχ. Νικόλαος Πετράκης (npet@chania.teicrete.gr) Ιστοσελίδα Μαθήματος: https://eclass.chania.teicrete.gr/ Εξάμηνο: Εαρινό 2015-16

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

Γραμμικές λίστες. Γκόγκος Χρήστος ΤΕΙ Ηπείρου

Γραμμικές λίστες. Γκόγκος Χρήστος ΤΕΙ Ηπείρου Γραμμικές λίστες Γκόγκος Χρήστος ΤΕΙ Ηπείρου Στατική αναπαράσταση γραμμικής λίστας const int MAX = 50000; struct static_list { T elements[max]; int size = 0; ; https://www.securecoding.cert.org/confluence/display/cplusplus/ctr00-cpp.+understand+when+to+prefer+vectors+over+arrays

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

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

ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ 1 ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ ΚΕΦΑΛΑΙΟ 3ο: ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΚΑΙ ΑΛΓΟΡΙΘΜΟΙ ΜΕΡΟΣ 2 ο : ΣΤΟΙΒΑ & ΟΥΡΑ ΙΣΤΟΣΕΛΙΔΑ ΜΑΘΗΜΑΤΟΣ: http://eclass.sch.gr/courses/el594100/ ΣΤΟΙΒΑ 2 Μια στοίβα

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

Πανεπιστήμιο Πειραιώς Σχολή Τεχνολογιών Πληροφορικής και Επικοινωνιών Τμήμα Ψηφιακών Συστημάτων ομές εδομένων

Πανεπιστήμιο Πειραιώς Σχολή Τεχνολογιών Πληροφορικής και Επικοινωνιών Τμήμα Ψηφιακών Συστημάτων ομές εδομένων Πανεπιστήμιο Πειραιώς Σχολή Τεχνολογιών Πληροφορικής και Επικοινωνιών Τμήμα Ψηφιακών Συστημάτων 3. Στοίβες & Ουρές 2 ομές εδομένων 4 5 Χρήστος ουλκερίδης Τμήμα Ψηφιακών Συστημάτων 4/11/2016 Ανακεφαλαίωση:

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

Δομές Δεδομένων & Αλγόριθμοι

Δομές Δεδομένων & Αλγόριθμοι Ουρές Ουρές Περίληψη Η ΟυράΑΔΤ Υλοποίηση με κυκλικό πίνακα Αυξανόμενη Ουρά βασισμένη σε πίνακα Interface ουράς στην C++ Η Ουρά ADT Η ΑΔΤ Ουρά αποθηκεύει αυθαίρετα αντικείμενα Οι εισαγωγές και διαγραφές

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

Διάλεξη 16: Σωροί. Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: - Ουρές Προτεραιότητας - Ο ΑΤΔ Σωρός, Υλοποίηση και πράξεις

Διάλεξη 16: Σωροί. Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: - Ουρές Προτεραιότητας - Ο ΑΤΔ Σωρός, Υλοποίηση και πράξεις ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 1 Διάλεξη 16: Σωροί Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: - Ουρές Προτεραιότητας - Ο ΑΤΔ Σωρός, Υλοποίηση και πράξεις Ουρά Προτεραιότητας (Priority

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

Initialize each person to be free. while (some man is free and hasn't proposed to every woman) { Choose such a man m w = 1 st woman on m's list to

Initialize each person to be free. while (some man is free and hasn't proposed to every woman) { Choose such a man m w = 1 st woman on m's list to Κεφάλαιο 2 Δοµές Δεδοµένων Ι Χρησιµοποιήθηκε υλικό από τις αγγλικές διαφάνειες του Kevin Wayne. 1 Δοµές Δεδοµένων Ι Στην ενότητα αυτή θα γνωρίσουµε ορισµένες Δοµές Δεδοµένων και θα τις χρησιµοποιήσουµε

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

HY380 Αλγόριθμοι και πολυπλοκότητα Hard Problems

HY380 Αλγόριθμοι και πολυπλοκότητα Hard Problems HY380 Αλγόριθμοι και πολυπλοκότητα Hard Problems Ημερομηνία Παράδοσης: 0/1/017 την ώρα του μαθήματος ή με email: mkarabin@csd.uoc.gr Γενικές Οδηγίες α) Επιτρέπεται η αναζήτηση στο Internet και στην βιβλιοθήκη

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

Lab 1: C/C++ Pointers and time.h. Panayiotis Charalambous 1

Lab 1: C/C++ Pointers and time.h. Panayiotis Charalambous 1 Lab 1: C/C++ Pointers and time.h Panayiotis Charalambous 1 Send email to totis@cs.ucy.ac.cy Subject: EPL231-Registration Body: Surname Firstname ID Group A or B? Panayiotis Charalambous 2 Code Guidelines:

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

Δομές Δεδομένων (Data Structures)

Δομές Δεδομένων (Data Structures) Δομές Δεδομένων (Data Structures) Στοίβες Ουρές Στοίβες: Βασικές Έννοιες. Ουρές: Βασικές Έννοιες. Βασικές Λειτουργίες. Παραδείγματα. Στοίβες Δομή τύπου LIFO: Last In - First Out (τελευταία εισαγωγή πρώτη

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

Lab 1: C/C++ Pointers and time.h. Panayiotis Charalambous 1

Lab 1: C/C++ Pointers and time.h. Panayiotis Charalambous 1 Lab 1: C/C++ Pointers and time.h Panayiotis Charalambous 1 Send email to totis@cs.ucy.ac.cy Subject: EPL231-Registration Body: Surname Firstname ID Group A or B? Panayiotis Charalambous 2 Code Guidelines:

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

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

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

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

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

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

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

Αλγόριθμοι Ταξινόμησης Μέρος 1

Αλγόριθμοι Ταξινόμησης Μέρος 1 Αλγόριθμοι Ταξινόμησης Μέρος 1 Μανόλης Κουμπαράκης 1 Το Πρόβλημα της Ταξινόμησης Το πρόβλημα της ταξινόμησης (sorting) μιας ακολουθίας στοιχείων με κλειδιά ενός γνωστού τύπου (π.χ., τους ακέραιους ή τις

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

2.2.5 ΑΝΑΠΑΡΑΣΤΑΣΗ ΑΛΓΟΡΙΘΜΟΥ

2.2.5 ΑΝΑΠΑΡΑΣΤΑΣΗ ΑΛΓΟΡΙΘΜΟΥ 2.2.5 ΑΝΑΠΑΡΑΣΤΑΣΗ ΑΛΓΟΡΙΘΜΟΥ ΑΝΑΠΑΡΑΣΤΑΣΗ ΑΛΓΟΡΙΘΜΟΥ Προκειμένου να επιτευχθεί η «ακριβής περιγραφή» ενός αλγορίθμου, χρησιμοποιείται κάποια γλώσσα που μπορεί να περιγράφει σειρές ενεργειών με τρόπο αυστηρό,

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

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

Διδάσκων: Παναγιώτης Ανδρέου Διάλεξη 10: Στοίβες:Υλοποίηση& Εφαρμογές Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: - Υλοποίηση Στοιβών με Δυναμική Δέσμευση Μνήμης - Εφαρμογή Στοιβών 1: Αναδρομικές συναρτήσεις - Εφαρμογή

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

The Simply Typed Lambda Calculus

The Simply Typed Lambda Calculus Type Inference Instead of writing type annotations, can we use an algorithm to infer what the type annotations should be? That depends on the type system. For simple type systems the answer is yes, and

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

Περιεχόμενα. Πρόλογος... 17

Περιεχόμενα. Πρόλογος... 17 Περιεχόμενα Πρόλογος... 17 Κεφάλαιο 1: Εισαγωγή... 19 Πώς να διαβάσετε αυτό το βιβλίο... 20 Η γλώσσα C Ιστορική αναδρομή... 22 Τα χαρακτηριστικά της C... 23 C Μια δομημένη γλώσσα... 23 C Μια γλώσσα για

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

Προγραμματισμός Η/Υ. Ενότητα 8: Ειδικά Θέματα Αλγορίθμων

Προγραμματισμός Η/Υ. Ενότητα 8: Ειδικά Θέματα Αλγορίθμων Προγραμματισμός Η/Υ Ενότητα 8: Ειδικά Θέματα Αλγορίθμων Νίκος Καρακαπιλίδης, Καθηγητής Δημήτρης Σαραβάνος, Καθηγητής Πολυτεχνική Σχολή Τμήμα Μηχανολόγων & Αεροναυπηγών Μηχανικών Σκοποί ενότητας Κατανόηση

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

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ. Δομές δεδομένων. Ενότητα 4η: Σύνολα - Λεξικά Παναγιώτα Φατούρου Τμήμα Επιστήμης Υπολογιστών

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ. Δομές δεδομένων. Ενότητα 4η: Σύνολα - Λεξικά Παναγιώτα Φατούρου Τμήμα Επιστήμης Υπολογιστών ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ Δομές δεδομένων Ενότητα 4η: Σύνολα - Λεξικά Παναγιώτα Φατούρου Τμήμα Επιστήμης Υπολογιστών ΕΝΟΤΗΤΑ 4 ΣΥΝΟΛΑ - ΛΕΞΙΚΑ ΗΥ240 - Παναγιώτα Φατούρου 2 Σύνολα (Sets) Τα

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

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

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

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

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

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

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

4. Συνδεδεμένες Λίστες

4. Συνδεδεμένες Λίστες Πανεπιστήμιο Πειραιώς Σχολή Τεχνολογιών Πληροφορικής και Επικοινωνιών Τμήμα Ψηφιακών Συστημάτων 4. Συνδεδεμένες Λίστες 2 ομές εδομένων 4 5 Χρήστος ουλκερίδης Τμήμα Ψηφιακών Συστημάτων 10/11/2016 Εισαγωγή

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

Ανάπτυξη εφαρμογών σε προγραμματιστικό περιβάλλον υποδειγματική διδασκαλία Κεφ. 3 Δομές Δεδομένων & αλγόριθμοι

Ανάπτυξη εφαρμογών σε προγραμματιστικό περιβάλλον υποδειγματική διδασκαλία Κεφ. 3 Δομές Δεδομένων & αλγόριθμοι Ανάπτυξη εφαρμογών σε προγραμματιστικό περιβάλλον υποδειγματική διδασκαλία Κεφ. 3 Δομές Δεδομένων & αλγόριθμοι Αραποστάθης Μάριος Καθηγητής Πληροφορικής Πειραματικού Λυκείου Βαρβακείου http://users.sch.gr/mariosarapostathis

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

Εργαστήριο 5: Υλοποίηση Αφηρημένου Τύπου Δεδομένων: Διπλά Συνδεδεμένη Λίστα

Εργαστήριο 5: Υλοποίηση Αφηρημένου Τύπου Δεδομένων: Διπλά Συνδεδεμένη Λίστα Εργαστήριο 5: Υλοποίηση Αφηρημένου Τύπου Δεδομένων: Διπλά Συνδεδεμένη Λίστα Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: - Διπλά Συνδεδεμένες Λίστες -Υλοποίηση Διπλά Συνδεδεμένης Λίστας με

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

ΚΥΠΡΙΑΚΗ ΕΤΑΙΡΕΙΑ ΠΛΗΡΟΦΟΡΙΚΗΣ CYPRUS COMPUTER SOCIETY ΠΑΓΚΥΠΡΙΟΣ ΜΑΘΗΤΙΚΟΣ ΔΙΑΓΩΝΙΣΜΟΣ ΠΛΗΡΟΦΟΡΙΚΗΣ 19/5/2007

ΚΥΠΡΙΑΚΗ ΕΤΑΙΡΕΙΑ ΠΛΗΡΟΦΟΡΙΚΗΣ CYPRUS COMPUTER SOCIETY ΠΑΓΚΥΠΡΙΟΣ ΜΑΘΗΤΙΚΟΣ ΔΙΑΓΩΝΙΣΜΟΣ ΠΛΗΡΟΦΟΡΙΚΗΣ 19/5/2007 Οδηγίες: Να απαντηθούν όλες οι ερωτήσεις. Αν κάπου κάνετε κάποιες υποθέσεις να αναφερθούν στη σχετική ερώτηση. Όλα τα αρχεία που αναφέρονται στα προβλήματα βρίσκονται στον ίδιο φάκελο με το εκτελέσιμο

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

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

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

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

Απλές Δοµές Δεδοµένων Στην ενότητα αυτή θα γνωρίσουµε ορισµένες απλές Δοµές Δεδοµένων και θα τις χρησιµοποιήσουµε για την αποδοτική επίλυση του προβλή

Απλές Δοµές Δεδοµένων Στην ενότητα αυτή θα γνωρίσουµε ορισµένες απλές Δοµές Δεδοµένων και θα τις χρησιµοποιήσουµε για την αποδοτική επίλυση του προβλή Απλές Δοµές Δεδοµένων Απλές Δοµές Δεδοµένων Στην ενότητα αυτή θα γνωρίσουµε ορισµένες απλές Δοµές Δεδοµένων και θα τις χρησιµοποιήσουµε για την αποδοτική επίλυση του προβλήµατος του ευσταθούς ταιριάσµατος

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

Ιδιοκτησία Αντικειµένου

Ιδιοκτησία Αντικειµένου Software Transactional Memory H STM υποστηρίζει την εκτέλεση δοσοληψιών από τις διεργασίες, οι οποίες περιέχουν λειτουργίες που ο χρήστης θέλει να εκτελέσει στα διαµοιραζόµενα αντικείµενα. H STM εγγυάται

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

Οντοκεντρικός Προγραμματισμός

Οντοκεντρικός Προγραμματισμός Οντοκεντρικός Προγραμματισμός Ενότητα 8: C++ ΒΙΒΛΙΟΗΚΗ STL, ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ Δομές Δεδομένων ΔΙΔΑΣΚΟΝΤΕΣ: Ιωάννης Χατζηλυγερούδης, Χρήστος Μακρής Πολυτεχνική Σχολή Τμήμα Μηχανικών Η/Υ & Πληροφορικής Δομές

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

Προγραμματισμός Η/Υ Ι (Χρήση της C) 6 η Θεωρία ΜΟΝΟΔΙΑΣΤΑΤΟΙ ΠΙΝΑΚΕΣ

Προγραμματισμός Η/Υ Ι (Χρήση της C) 6 η Θεωρία ΜΟΝΟΔΙΑΣΤΑΤΟΙ ΠΙΝΑΚΕΣ Προγραμματισμός Η/Υ Ι (Χρήση της C) 6 η Θεωρία ΜΟΝΟΔΙΑΣΤΑΤΟΙ ΠΙΝΑΚΕΣ Σκοπός του μαθήματος Σκοπός του παρόντος μαθήματος είναι να μάθετε να κάνετε εισαγωγή δεδομένων σε πίνακες και περαιτέρω επεξεργασία

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

Προγραμματισμός I (Θ)

Προγραμματισμός I (Θ) Τεχνολογικό Εκπαιδευτικό Ίδρυμα Κεντρικής Μακεδονίας - Σέρρες Τμήμα Μηχανικών Πληροφορικής Προγραμματισμός I (Θ) Δρ. Δημήτρης Βαρσάμης Επίκουρος Καθηγητής Οκτώβριος 2017 Δρ. Δημήτρης Βαρσάμης Οκτώβριος

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

Εισαγωγή στον Προγραμματισμό (με. τη C)

Εισαγωγή στον Προγραμματισμό (με. τη C) Υποχρεωτικό Μάθημα 3 ου Εξαμήνου Χειμερινό Εξάμηνο Ακ. Έτους 20 Τμήμα Επιστήμης Υπολογιστών Πανεπιστήμιο Κρήτης Εισαγωγή στον Προγραμματισμό (με τη C) Διδάσκουσα: Φατούρου Παναγιώτα faturu [at] csd.uoc.gr

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

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

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

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

Ανάπτυξη και Σχεδίαση Λογισμικού

Ανάπτυξη και Σχεδίαση Λογισμικού Ανάπτυξη και Σχεδίαση Λογισμικού Η γλώσσα προγραμματισμού C Γεώργιος Δημητρίου Δυναμική Κατανομή Μνήμης Δυναμική εκχώρηση μνήμης Σωρός Συναρτήσεις malloc(), calloc(), realloc(), free() Δυναμικές δομές

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

Διάλεξη 10: Δομές Δεδομένων Ι (Στοίβες & Ουρές)

Διάλεξη 10: Δομές Δεδομένων Ι (Στοίβες & Ουρές) Τμήμα Πληροφορικής Πανεπιστήμιο Κύπρου ΕΠΛ132 Αρχές Προγραμματισμού II Διάλεξη 10: Δομές Δεδομένων Ι (Στοίβες & Ουρές) Δημήτρης Ζεϊναλιπούρ http://www.cs.ucy.ac.cy/courses/epl132 10-1 Περιεχόμενο Διάλεξης

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

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

Δομημένος Προγραμματισμός. Τμήμα Επιχειρηματικού Σχεδιασμού και Πληροφοριακών Συστημάτων Δομημένος Προγραμματισμός Τμήμα Επιχειρηματικού Σχεδιασμού και Πληροφοριακών Συστημάτων www.bpis.teicrete.gr Τμήμα Επιχειρηματικού Σχεδιασμού και Πληροφοριακών Συστημάτων www.bpis.teicrete.gr 2 Ορισμός

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

ΚΕΦΑΛΑΙΟ 3 ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΚΑΙ ΑΛΓΟΡΙΘΜΟΙ

ΚΕΦΑΛΑΙΟ 3 ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΚΑΙ ΑΛΓΟΡΙΘΜΟΙ ΚΕΦΑΛΑΙΟ 3 ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΚΑΙ ΑΛΓΟΡΙΘΜΟΙ Τα δεδομένα (data) είναι η αφαιρετική αναπαράσταση της πραγματικότητας και συνεπώς μία απλοποιημένη όψη της. Η συλλογή των ακατέργαστων δεδομένων και ο συσχετισμός

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

Πρόβλημα 1: Αναζήτηση Ελάχιστης/Μέγιστης Τιμής

Πρόβλημα 1: Αναζήτηση Ελάχιστης/Μέγιστης Τιμής Πρόβλημα 1: Αναζήτηση Ελάχιστης/Μέγιστης Τιμής Να γραφεί πρόγραμμα το οποίο δέχεται ως είσοδο μια ακολουθία S από n (n 40) ακέραιους αριθμούς και επιστρέφει ως έξοδο δύο ακολουθίες από θετικούς ακέραιους

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