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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

#2 Αλγόριθµοι, οµές εδοµένων και Πολυπλοκότητα

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Δομές Δεδομένων Ενότητα 4

FORTRAN & Αντικειμενοστραφής Προγραμματισμός ΣΝΜΜ 2017

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

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

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

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

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Πίνακες Κλάσεις και Αντικείμενα

Εργαστήριο Ανάπτυξης Εφαρμογών Βάσεων Δεδομένων. Εξάμηνο 7 ο

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

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

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

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 Προαιρετικό handle node περιέχει επιπλέον πληροφορίες (π.χ. το µήκος της λίστας)

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 head a1 a2 a3 a4

Traversal node = head while node not null { (do something with node.data) node = node->next }

Access the list void printtrianglelist(trilistel *list) { TriListEl *x; } for (x=list;x;x=x->next) printf("->%d\n",x->datum); /* datum can be a data structure then printtriangle (x->datum)*/

Traverse while( temp1!=null ) { printf( %d\n,tmp1->datum); temp1 = temp1->next; }

Number of elements int trianglelistlen(trilistel *list) { TriListEl *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;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 temp->data = info; temp->next=head; head = temp;

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); an + // Handle to position current = head; loop until current indicates the target position a1 a2 current an a3 a4 // Update handles an->next = current->next; current->next = an; a1 a2 an a3 a4

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

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

TriListEl * addtotrianglelist(trilistel *list, int datum) { TriListEl *x, *result, *current, *newel; newel = (TriListEl *) malloc(sizeof(trilistel)); newel->datum = datum; newel->next = (TriListEl *) NULL; } if (list == (TriListEl *) NULL) { result = newel; result->next = (TriListEl *) NULL; } else { for (x=list;x;x=x->next) { if (x->next == (TriListEl *) NULL) break; } current = x; current->next = newel; current = newel; current->next = (TriListEl *) NULL; result = list; } return result;

for (x=list;x;x=x->next) { if (x->next == (TriListEl *) NULL) break; } current = x; current->next = newel; current = newel; current->next = (TriListEl *) NULL; result = list;

Removing at the Head 1. Update head to point to next node in the list 2. Allow garbage collector to reclaim the former first node

Remove function removeafter(node node) { // remove node past this one obsoletenode := node.next node.next := node.next.next destroy obsoletenode }

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

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

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

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

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++

typedef struct Triangle { Point p1,p2,p3; } Triangle; typedef struct List { Triangle datum; struct List *next; } List;

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

List of lists typedef struct TriListEl { int datum; struct TriListEl *next; } TriListEl; typedef struct ListList { TriListEl *head; struct ListList *next; } ListList;

void printcardinalities(listlist *list) { ListList *x; int cnt = 1; for (x=list;x;x=x->next) { printf( %d ",trilistlen(x->datum)); cnt++; } } printf("\n all elems = %d\n,cnt);

void freelistlist(listlist *list) { ListList *x, *prev; } prev = (ListList *) NULL; for (x=list;x;x=x->next) { if (prev!= (ListList *) NULL) free(prev); freetrianglelist(x->datum); prev = x; } if (prev!= (ListList *) NULL) free(prev);

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; int lengthlist(struct ListHolder *) addelement, deleteelement must update numberofelements