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

Σχετικά έγγραφα
#3. Στατικές γραμμικές λίστες, συνδεδεμένες γραμμικές λίστες, γραμμικές λίστες της STL

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

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

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

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

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

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

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

Δομές Δεδομένων και Αλγόριθμοι (Γ εξάμηνο) Τμήμα Μηχανικών Πληροφορικής ΤΕ, ΤΕΙ Ηπείρου. Άσκηση εργαστηρίου #6 (Υλοποίηση δυαδικού δένδρου αναζήτησης)

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

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

Συνδεδεμένη Λίστα (Linked List)

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

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

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

Στοίβες - Ουρές. Στοίβα (stack) Γιάννης Θεοδωρίδης, Νίκος Πελέκης, Άγγελος Πικράκης Τµήµα Πληροφορικής

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

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

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

Φροντιςτήριο. Linked-List

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Διάλεξη 22η: Επιπλέον στοιχεία της C

Προγραμματισμός Υπολογιστών με C++ Φύλλο Διαγωνίσματος Ακαδημαϊκό εξάμηνο: Χειμερινό

Standard Template Library (STL)

Δυναμική μνήμη με πίνακες και λίστες

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

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

Σημειώσεις έκτης και έβδομης εβδομάδας

Προγραμματισμός Αναδρομή

Προγραμματισμός Υπολογιστών με C++

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

Γράφοι. Ορολογία. Ορισµός: G = (V, E) όπου. Ορολογία (συνέχεια) γράφος ή γράφηµα (graph) V:ένα σύνολο E:µια διµελής σχέση στο V

Προγραμματισμός Αναδρομή

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

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

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

Προγραμματισμός Υπολογιστών με C++

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

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

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

Λίστες παράλειψης (skip lists)

Μάθημα 22: Δυαδικά δέντρα (Binary Trees)

4 ΔYNAMIKEΣ ΔOMEΣ ΔEΔOMENΩN

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

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

Προγραμματισμός. Linked Lists

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

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

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

Λίστες (Lists) Ορέστης Τελέλης. Τµήµα Ψηφιακών Συστηµάτων, Πανεπιστήµιο Πειραιώς

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

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

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

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

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

Αναδρομικοί Αλγόριθμοι

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

Διάλεξη 06: Συνδεδεμένες Λίστες & Εφαρμογές Στοιβών και Ουρών

Δομές Δεδομένων - Εργαστήριο 5. Ουρές Προτεραιότητας

Δυναμική δέσμευση και αποδέσμευση μνήμης. Προγραμματισμός II 1

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

ΔυαδικάΔΕΝΔΡΑΑναζήτησης

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

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

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

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

Προγραμματισμός. Linked Lists

AVL-trees C++ implementation

Δηµοσθένης Σταµάτης Τµήµα Πληροφορικής T.E.I. ΘΕΣΣΑΛΟΝΙΚΗΣ

Ονοματεπώνυμο και ΑΜ: Είχα παραδώσει εργασίες τα προηγούμενα ακαδημαϊκά έτη: ΚΑΛΗ ΕΠΙΤΥΧΙΑ!

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

Συνδεδεμένη Λίστα ΣΛ null VK 23

Μεταγλωττιστές. Συντακτικός Αναλυτής Κατασκευή Πίνακα Συμβόλων (ΠΣ) Εργαστήριο 7. Διδάσκοντες: Δρ. Γεώργιος Δημητρίου Δρ. Άχμεντ Μάχντι

IsEmptyList(L): επιστρέφει true αν L = < >, false

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

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

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

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

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

Transcript:

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

Στατική αναπαράσταση γραμμικής λίστας 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 2

Επιστροφή του στοιχείου που βρίσκεται στη θέση i T access(static_list<t>& static_list, int i) { if (i < 0 i >= static_list.size) throw -1; else return static_list.elements[i]; 3

Αναζήτηση στοιχείου στη λίστα int search(static_list<t>& static_list, T x) { for (int i = 0; i < static_list.size; i++) if (static_list.elements[i] == x) return i; return -1; 4

Προσθήκη στοιχείου στο τέλος της λίστας void push_back(static_list<t>& static_list, T x) { if (static_list.size == MAX) return; static_list.elements[static_list.size] = x; static_list.size++; 5

Προσθήκη στοιχείου στη θέση i void insert(static_list<t>& static_list, int i, T x) { if (static_list.size == MAX) return; if (i < 0 i >= static_list.size) return; for (int k = static_list.size; k > i; k--) { static_list.elements[k] = static_list.elements[k - 1]; static_list.elements[i] = x; static_list.size++; 6

Διαγραφή στοιχείου που βρίσκεται στη θέση i void delete_item(static_list<t>& static_list, int i) { if (i < 0 i >= static_list.size) return; for (int k = i; k < static_list.size; k++) { static_list.elements[k] = static_list.elements[k + 1]; static_list.size--; 7

Αξιολόγηση στατικής λίστας Θετικά Εύκολη υλοποίηση Σταθερός Ο(1) χρόνος εντοπισμού στοιχείου με βάση τη θέση του Γραμμικός χρόνος O(n) για αναζήτηση, εισαγωγή και διαγραφή στοιχείου Αρνητικά Δέσμευση μεγάλου τμήματος μνήμης ακόμη και όταν η λίστα περιέχει λίγα στοιχεία ή είναι άδεια Επιβάλει άνω όριο στο μέγεθος των δεδομένων που μπορεί να δεχθεί (ωστόσο ο περιορισμός αυτός μπορεί να ξεπεραστεί με συνθετότερη υλοποίηση που αυξομειώνει το μέγεθος του πίνακα υποδοχής όταν απαιτείται) 8

Αναπαράσταση γραμμικής λίστας με απλά συνδεδεμένη λίστα struct node { T data; struct node<t>* next = NULL; ; struct linked_list { struct node<t>* head = NULL; int size = 0; ; http://www.codeproject.com/articles/24684/how-to-create-linked-list-using-c-c 9

Επιστροφή του στοιχείου που βρίσκεται στη θέση i struct node<t>* access(linked_list<t>& linked_list, int i) { if (i < 0 i >= linked_list.size) return NULL; struct node<t>* current = linked_list.head; for (int k = 0; k < i; k++) { current = current->next; return current; 10

Αναζήτηση στοιχείου int search(linked_list<t>& linked_list, T x) { struct node<t>* current = linked_list.head; int i = 0; while (current!= NULL) { if (current->data == x) return i; i++; current = current->next; return -1; 11

Προσθήκη στοιχείου μετά τη θέση i void insert_after(linked_list<t>& linked_list, int i, T x) { if (i < 0 i >= linked_list.size) return; struct node<t>* ptr = access(linked_list, i); struct node<t>* new_node = new node<t>(); new_node->data = x; new_node->next = ptr->next; ptr->next = new_node; linked_list.size++; 12

Προσθήκη στοιχείου στην κεφαλή της λίστας void insert_head(linked_list<t>& linked_list, T x) { struct node<t>* new_node = new node<t>(); new_node->data = x; new_node->next = linked_list.head; linked_list.head = new_node; linked_list.size++; 13

Προσθήκη στοιχείου στη θέση i void insert(linked_list<t>& linked_list, int i, T x) { if (i == 0) insert_head(linked_list, x); else insert_after(linked_list, i - 1, x); 14

Προσθήκη στοιχείου στο τέλος της λίστας void push_back(linked_list<t>& l, T x) { struct node<t>* new_node, *current; new_node = new node<t>(); new_node->data = x; new_node->next = NULL; current = l.head; if (current == NULL) { l.head = new_node;l.size++; else { while (current->next!= NULL) { current = current->next; current->next = new_node; l.size++; 15

Διαγραφή στοιχείου από τη θέση i της λίστας void delete_item(linked_list<t>& l, int i) { if (i < 0 i >= l.size) return; if (i == 0) { struct node<t>* ptr = l.head; l.head = ptr->next; delete ptr; else { struct node<t>* ptr = access(l, i - 1); struct node<t>* to_be_deleted = ptr->next; ptr->next = to_be_deleted->next; delete to_be_deleted; 16

Αξιολόγηση συνδεδεμένης λίστας Θετικά Κάνει καλή χρήση του αποθηκευτικού χώρου Σταθερός χρόνος Ο(1) για την εισαγωγή και διαγραφή στοιχείων Αρνητικά Έχει συνθετότερη υλοποίηση Απαιτεί επιπλέον χώρο ανά στοιχείο λόγω της ύπαρξης των δεικτών Δεν επιτρέπει απευθείας μετάβαση σε κάποιο στοιχείο με βάση τον δείκτη του 17

STL list παράδειγμα cout << "add items 5,15,11" << endl; list<int> alist = { 5, 15, 11 ; print_std_list(alist); list<int>::iterator it; it = alist.begin(); advance(it, 1); cout << "value found at position 1 " << *it << endl; cout << "insert value 33 at position 1 " << endl; alist.insert(it, 33); print_std_list(alist); cout << "insert value 44 at position 0 " << endl; it = alist.begin(); alist.insert(it, 44); print_std_list(alist); cout << "search for item with value 33" << endl; it = std::find(alist.begin(), alist.end(), 33); cout << "value 33 found at position " << std::distance(alist.begin(), it) << endl; cout << "delete item at position 2" << endl; it = alist.begin(); advance(it, 2); alist.erase(it); print_std_list(alist); cout << "delete item at position 0" << endl; it = alist.begin(); alist.erase(it); print_std_list(alist); void print_std_list(list<int>& alist) { int i = 0; cout << "std::list ["; for (int x : alist) { cout << i << "-" << x << " "; i++; cout << "]" << endl; add items 5,15,11 std::list [0-5 1-15 2-11 ] value found at position 1 15 insert value 33 at position 1 std::list [0-5 1-33 2-15 3-11 ] insert value 44 at position 0 std::list [0-44 1-5 2-33 3-15 4-11 ] search for item with value 33 value 33 found at position 2 delete item at position 2 std::list [0-44 1-5 2-15 3-11 ] delete item at position 0 std::list [0-5 1-15 2-11 ] 18