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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Εργαστήριο Οργάνωσης Η/Υ. Δαδαλιάρης Αντώνιος

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

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

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

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

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

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

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

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

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

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

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 x = head while node not null (do something with node->data) x = x->next }

Access the list void printtrianglelist(trilistel *list) TriListEl *x; } for (x=list; x; x=x->next) cout<<x->datum<<endl; /* 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 head = NULL; while (1) p = new element(); p = (struct node *) malloc(struct node); cin>>info;

void functionadd(struct node *head, info) while (1) p = new element(); p = (struct node *) malloc(struct node); p->data = info; if (head == NULL)

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 = (node*)malloc(sizeof(node)); 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=(node*)malloc(sizeof(node)); temp1 = head; while(temp1->next!=null) node temp1 = temp1->next; temp = (node*)malloc(sizeof(node)); temp = new 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;

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

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;

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

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;

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->head)); 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);

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

head = NULL; while (1) p = (struct node *) malloc(struct node); cin>>info; if (info == 0) break;

struct node * functionadd(struct node *head, int info) while (1) p = (struct node *) malloc(struct node); p->data = info; if (head == NULL) p->next = NULL; } else p->next = head; } head = p; } return head; }

struct record struct emploee *name; struct record *next; }

head = NULL; while (1) cin>> info; head = functionadd(head, info); }