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

Σχετικά έγγραφα
Προγραμματισμός. Linked Lists

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

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

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

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

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

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

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

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

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

Δομές Δεδομένων - Εργαστήριο 2. Λίστες

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

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

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

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

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

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

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

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

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

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

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

Physical DB Design. B-Trees Index files can become quite large for large main files Indices on index files are possible.

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

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

υναµικές οµές εδοµένων

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

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

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

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

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

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

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

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

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

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

alpha Language age (3/5) alpha Language Φροντιστήριο Syntax Directed Translation and

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

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

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

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

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

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

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

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

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

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

ΠΑΝΕΠΙΣΤΗΜΙΟ ΠΑΤΡΩΝ ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ ΤΜΗΜΑ ΜΑΘΗΜΑΤΙΚΩΝ ΙΠΛΩΜΑΤΙΚΗ ΕΡΓΑΣΙΑ

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

HY340, 2009 Α. Σαββίδης Slide 2 / 143. HY340, 2009 Α. Σαββίδης Slide 3 / 143. HY340, 2009 Α. Σαββίδης Slide 4 / 143

Ενότητα 2 Στοίβες Ουρές - Λίστες. ΗΥ240 - Παναγιώτα Φατούρου 1

Στοίβες Ουρές - Λίστες

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

Εργαστήριο 7: Ο αλγόριθμος ταξινόμησης Radix Sort

Ενότητα 2 Στοίβες Ουρές - Λίστες

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

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

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

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

ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 5. Αφηρημένοι Τύποι Δεδομένων / Στοίβες και Ουρές

ιαφάνειες παρουσίασης #11

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

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

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

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

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

Διάλεξη 05: Αφηρημένοι Τύποι Δεδομένων

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ & ΑΛΓΟΡΙΘΜΟΙ ΕΡΓΑΣΤΗΡΙΟ

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ & ΑΛΓΟΡΙΘΜΟΙ ΕΡΓΑΣΤΗΡΙΟ

POINTERS, AGGREGATION, COMPOSITION

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

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

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

17TimeThis.h function returns reference pointer to same object { return *this; }

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

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

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

Σι θα δούμε σε αυτό το μάθημα;

Βασικές Δομές Δεδομένων

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

EE512: Error Control Coding

Σύνοψη Προηγούμενου (1/2) Στοίβες, Ουρές, Ουρές Προτεραιότητας. Σύνοψη Προηγούμενου (2/2) Σημερινό Μάθημα. Πίνακες. Εισαγωγή, σε χρόνο O(1).

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

Προαπαιτούμενες Ασκήσεις 5 ου Εργαστηρίου. Dose stoixeio (integer) : 25 Found stoixeio in position 7 Dose stoixeio (integer) :94 Value not found

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

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ. ΘΕΩΡΗΤΙΚΗ ΑΣΚΗΣΗ 2 ΛΥΣΕΙΣ Γραμμικές Δομές Δεδομένων, Ταξινόμηση

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

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

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

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

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

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

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

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

Περιεχόµενα. 1 Εισαγωγή στις οµές εδοµένων 3. 2 Στοίβα (Stack) 5

Ενότητα 2 Στοίβες Ουρές - Λίστες

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

Προγραμματισμός Η/Υ. Ενότητα 9: Ειδικά θέματα Δομών Δεδομένων

ΕΛΛΗΝΙΚΗ ΕΤΑΙΡΕΙΑ ΕΠΙΣΤΗΜΟΝΩΝ ΚΑΙ ΕΠΑΓΓΕΛΜΑΤΙΩΝ ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΙ ΕΠΙΚΟΙΝΩΝΙΩΝ ΜΕΛΟΣ IFIP, IOI

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

Transcript:

Linked Lists

Διαφορές από πίνακες Εύκολη αυξομείωση στοιχείων Επακριβής χρήση μνήμης Δύσκολο random access Περισσότερες απαιτήσεις μνήμης Abstraction

Πίνακες: + και - + Γρήγορη προσπέλαση. -- Πολύπλοκη η αυξομείωση του μεγέθους. Η αυξομείωση του μεγέθους των δομών δεδομένων απαιτείται σε πολλές εφαρμογές. Το μέγεθος μεταβάλλεται κατά την εκτέλεση (run time).

Συνδεδεμένες λίστες - Linked Lists Δυναμικές δομές δεδομένων Εφαρμογής όταν απαιτείται το μέγεθος να μεταβάλλεται κατά την εκτέλεση (run time).

Απλά συνδεδεμένες λίστες Ακολουθία κόμβων Κάθε κόμβος περιέχει πληροφορίες σύνδεσμο στον επόμενο κόμβο elem next node A B C D

Ορισμοί και παραδείγματα Πεπερασμένη, διατεταγμένη ακολουθία από μηδέν η παραπάνω στοιχεία a 1,a 2,..., a n E.g. the list of prime numbers less than 20 2,3,5,7,11,13,17,19 A line of text of individual characters h,e,l,l,o,,w,o,r,l,d A list of lists! 1,2,, e,g,g,s,1,, s,a,l,a,m,i,1,k,g,r,,o,f,,to,m,a,t,o,e,s

List Operations Print Length Insert Remove Lookup Running through the list. Enumeration Other, e.g. list cloning, sub-list. Error Checking

Representation a1 a2 a3 a4 datum pointer to next element a1 4 a2 7 a3 10 a4 0 0 1 2 3 4 5 6 7 8 9 10 11 12

Implementation Node Handle datum, Handle pointertonextelement e.g. struct Node int mydatum, struct Node *next; or class Node int mydatum, Node *next; Head of list Tail of list 1st List Handle where the pointer to the head of list is stored. Another such pointer is required if we retain a tail pointer to the list

Accessing the Data Structure List Handle setdata(), getdata(), setnext(), getnext() E.g. void setdata(struct Node *whichnode, int value); Or Node.setData(int); Printing the list Handle current = head; while (notatendoflist(current)) Print(current); Current = getnext(current); current a1 a2 a3 a4

Traversal x = head while current node (x) is not null do something with x->data x = x->next

Access the list void printtrianglelist(listel *list) ListEl *x; for (x=list; x!= NULL; x=x->next) cout<<x->datum<<endl; /* besides string or simple tyle (int, float etc), datum could be a structure, and printed accordingly */

Access the list void printtrianglelist(listel *x) for (; x; x=x->next) cout<<x->datum<<endl; /* besides string or simple tyle (int, float etc), datum could be a structure, and printed accordingly */

Traverse while( x!=null ) cout >> x->datum; x= x->next;

Number of elements int trianglelistlen(listel *list) ListEl *x; int result = 0; for (x=list;x;x=x->next) result++; return result;

Lookup Enumerate through list if (current equals target) return current; return NOT_FOUND; Return Value index, handle, Boolean, numeric a1 a2 a3 a4 current a1 a2 a3 a4 current a1 a2 a3 a4 current

list_el * getbykey(list_el *list, char *mykey) list_el *x; for (x=list;x!=null;x=x->next) if (strcmp(x->key,mykey)==0) return x; return (list_el *) NULL;

Inserting at the Head 1. Allocate a new node 2. Insert new element 3. Make new node point to old head 4. Update head to point to new node

Insert head = NULL; while (1) p = new element(); cin>>info; p->data = info; p->next = head ; head = p;

In a function void functionadd(struct node *head, int info) struct node *head functionadd(struct node *head, int info) p = new element(); p->data = info; p->next = head; head = p; return head;

If we still wish for a void function void functionadd(struct node **head, int info) p = new element(); p->data = info; p->next = *head; *head = p; return *head;

Insert function insertafter(node *node, Node *newnode) // insert newnode after node newnode->next = node->next; node->next = newnode;

Insert 1. create new node 2. find handle to new position 3. update handles 4. return an + current a1 a2 a3 a4 at position 2 an a1 a2 a3 a4 an

Insert // New node an = new Node(theNewValue); // Handle to position current = head; loop until current indicates the target position // Update handles an->next = current->next; current->next = an; an + current a1 a2 a3 a4 an a1 a2 a3 a4 an

Insert at n-th position for( int i = 1 ; i < node_number ; i++ ) current = current ->next; node *temp; temp = new node(); temp->data = info; temp->next = temp1->next; temp1->next = temp;

Inserting at the Tail 1. Allocate a new node 2. Insert new element 3. Have new node point to null 4. Have old last node point to new node 5. Update tail to point to new node

Insert at the end node *temp1, *temp; temp1 = head; while(temp1->next!=null) node temp1 = temp1->next; temp = new node(); temp->data = info; temp->next = NULL; temp1->next = temp;

ListEl *addtotrianglelist(listel *list, int datum) ListEl *result = NULL, *newel = NULL; newel = new ListEl(); newel->datum = datum; newel->next = (ListEl *) NULL; if (list == NULL) // first time result = newel; result->next = NULL; else ListEl *x, for (x=list;x;x=x->next) if (x->next == NULL) break; x->next = newel; x->next->next = NULL; result = list; return result;

ListEl *x, for (x=list;x;x=x->next) if (x->next == NULL) break; x->next = newel; x->next->next = NULL; result = list;

Removing at the Head 1. Update head to point to next node in the list 2. Delete node tmp = head; head = head->next; delete tmp->cityname; delete tmp;

Remove function // assumes head is not NULL ListEl *remove_first(list *head) tmp = head; head = head->next; delete tmp->cityname; delete tmp; return head;

Remove all! void freelist(listel *list) ListEl *clist = list; while (1) if (clist == NULL) break; clist = remove_first(clist);

Remove 1. find handle to removal position 2. update handles 3. free memory free(current); 4. return a1 a1 a2 Don t forget current a3 a3 a2 a4 a4 current a5 a5

Remove void removeafter(node *node) // remove node past this one obsoletenode = node->next node->next = node->next->next delete obsoletenode

Delete n-th old_temp->next = temp1->next; free(temp1);

Removing at the Tail Removing at the tail of a singly linked list cannot be efficient! There is no constant-time way to update the tail to point to the previous node Unless we also maintain a pointer to the penultimate node (a bit more complicated, may need to keep track of cases for null list, one node list, and the rest)

List of Data Structures Insertion Removal?

Sub - List current May be composed of simpler operations

Abstraction Abstraction of Representation w.r.t. Stored Data Type Code Reusability Implementation Pointer Abstraction C Object abstraction Java Templates C++

A list of Triangles typedef struct Triangle Point p1,p2,p3; ; typedef struct ListEl ; Triangle datum; ListEl *next;

List of lists typedef struct ListList ListEl *head; // of triangle list ListList *next; ;

void printcardinalities(listlist *list) ListList *x; int cnt = 1; for (x=list;x;x=x->next) cout << trianglelistlength(x->head); cnt++; cout << All elems are << cnt << endl;

void freelistlist(listlist *list) ListList *x; for (x=list;x;x=x->next) freetrianglelist(x->datum); freelistlist();

Structural Variants Doubly Linked List Cyclic List list handle a1 a2 a3 a4 a5 a6 list handle List of Lists list handle

Διπλά συνδεδεμένη λίστα Δυνατότητα γρήγορης προσπέλασης και προς τις δύο φορές της ακολουθίας Κάθε κόμβος περιέχει πληροφορίες σύνδεσμο στον επόμενο κόμβο σύνδεσμο στον προηγούμενο κόμβο Μπορεί να έχει επιπλέον handle nodes header prev elem nodes/positions next node trailer elements

Insertion p A B C p A B q C p X q A B X C

Deletion p A B C D A B C p D A B C

Circular List struct listitem *tail; payload next payload next payload next payload next listitem *addafter (listitem *p, listitem *tail) if (p && tail) p -> next = tail -> next; tail = p; else if (p) tail p -> next = p; return tail; Optional: struct listitem *head;

Algorithmic Variants Push / Pop Stack Enqueue, Dequeue Queues FILO (stack) FIFO (priority queue)

How to remember the length? struct ListHolder int numberofelements; /* private, init=-1*/ ListElement *head; // object orientation (C++) treats this in a more elegant fashion for the programmer, still using the same data structures in memory