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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ΕΠΛ232 Προγραμματιστικές Τεχνικές και Εργαλεία Δείκτες και Συναρτήσεις (Κεφάλαιο 11, KNK-2ED)

Α. unsigned int Β. double. Γ. int. unsigned char x = 1; x = x + x ; x = x * x ; x = x ^ x ; printf("%u\n", x); Β. unsigned char

Διάλεξη 5: Δείκτες και Συναρτήσεις

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #5

Μεθόδων Επίλυσης Προβλημάτων

ΕΡΓΑΣΤΗΡΙΟ 1 - ΣΗΜΕΙΩΣΕΙΣ

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

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

Α Β Γ static; printf("%c\n", putchar( A +1)+2); B DB BD. int i = 0; while (++i); printf("*");

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

Διάλεξη 6: Δείκτες και Πίνακες

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

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

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

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

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

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

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

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

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

ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ Ενδεικτικές Απαντήσεις Εξετάσεων Α' Περιόδου Θέµα 1. (α') 2 - ii 3 - iii 4 - iv

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

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

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

Π. Σταθοπούλου ή Οµάδα Α (Φοιτητές µε µονό αριθµό Μητρώου ) ιδασκαλία : Παρασκευή 11πµ-13µµ ΗΛ7

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

Α' Εξάμηνο ΕΙΣΑΓΩΓΗ ΣΤΟ ΔΟΜΗΜΕΝΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ

Εργαστήριο 8: Αναδρομική διεργασία εισαγωγής καινούριου κόμβου σε ΔΔΑ

Πανεπιστήµιο Θεσσαλίας, THMMY HY120, Σεπτέµβριος 2015 ΟΝΟΜΑΤΕΠΩΝΥΜΟ:

ΑΣΚΗΣΗ 4: ΟΜΕΣ ΒΑΣΙΚΩΝ ΒΡΟΧΩΝ

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

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

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

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

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

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

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

Συναρτήσεις. Εισαγωγή

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

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

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

Ορισμός μεταβλητών δεικτών και αρχικοποίηση

Εισαγωγή στους Αλγορίθμους

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

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

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

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

Εργαστήριο 5 Αναδρομική διεργασία εισαγωγής καινούριου κόμβου σε ΔΔΑ με αλφαβητική σειρά

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

Προγραμματισμός Ι (HY120)

Προγραμματισμό για ΗΜΥ

Κεφάλαιο 8.7. Πίνακες & Συναρτήσεις ( ιάλεξη 17) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

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

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

Εργαστήριο 5. Εαρινό Εξάμηνο

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

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

Σημειώσεις δεύτερης εβδομάδας

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

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

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

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

Ενότητα 4: «Εισαγωγή στον Προγραμματισμό. Τα πρώτα προγράμματα σε γλώσσα C»

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

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

Μεθόδων Επίλυσης Προβλημάτων

ΕΠΛ 231 Δομές Δεδομένων και Αλγόριθμοι 4-1

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

Θεωρητικό Μέρος. int rec(int n) { int n1, n2; if (n <= 5) then return n; else { n1 = rec(n-5); n2 = rec(n-3); return (n1+n2); } }

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

Σε γενικές γραμμές, είναι καλή πρακτική να γράϕουμε προγράμματα C που αποτελούνται από πολλές και μικρές συναρτήσεις, παρά από λίγες και μεγάλες.

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

Αναδροµή. Σε αυτήν την (βοηθητική) ενότητα θα µελετηθούν τα εξής : Η έννοια της αναδροµής Υλοποίηση και αποδοτικότητα Αφαίρεση της αναδροµής

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

Transcript:

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

Περιεχόμενο Διάλεξης 13 Στοίβα, Ουρά και Ταξινόμηση Επανάληψη Στοίβας και Ουράς Αδυναμία Υποστήριξης Ταξινόμησης Ταξινομημένες Λίστες Δηλώσεις και Αρχικοποίηση (στατικά, δυναμικά, σε συνάρτηση, δείκτη-δείκτη) Διαδικασίες printlist(), printlistrecursive() Διαδικασίες insert(), insertrecursive() Διαδικασίες delete(), deleterecursive() Επόμενη Διάλεξη 13-2

Ταξινομημένες Λίστες Ταξινομημένα τα Δεδομένα σε κάποια σειρά (π.χ., αύξουσα στα ακόλουθα παραδείγματα) και από την οποία να μπορούμε εύκολα να προσθέτουμε και να αφαιρούμε στοιχεία. Έτσι, για παράδειγμα αν εφαρμόζαμε διαδοχικά τις εντολές: εισαγωγή του 5, εισαγωγή του 1 και εισαγωγή του 3 θα θέλαμε η λίστα μας να είχε τη μορφή: size head 3 data next data next data next 1 NULL 3 5 13-5

Ταξινομημένες Λίστες (Δηλώσεις και Αρχικοποίηση) Για την υλοποίηση μιας δομής τύπου Ταξινομημένη Λίστα (όπως και στις στοίβες και ουρές) απαιτείται η παρακάτω δήλωση κόμβων: typedef struct node { typedef struct { int data; NODE *head; struct node *next; int size; NODE; LIST; Οι ορισμοί λοιπόν και οι κλήσεις (4 εναλλακτικοί τρόποι): Α) Στατικά στο main() Β) Δυναμικά στο main() LIST list; LIST *list = NULL; list.head = NULL; list = (LIST *) list.size = 0; malloc(sizeof(list)); foo(&list); list->head = NULL; list->size = 0; foo(list); void foo(list *list); 13-6

Γ) Δυναμικά σε Συνάρτηση (με return pointer): LIST *initlist() { LIST *list = (LIST *) malloc(sizeof(list)); if (list == NULL) return NULL; list->head = NULL; list->size = 0; return list; Ταξινομημένες Λίστες (Δηλώσεις και Αρχικοποίηση) Δ) Δυναμικά σε Συνάρτηση (με δείκτη-σε-δείκτη): int initlist2(list **list) { *list = (LIST *) malloc(sizeof(list)); if ((*list) == NULL) return EXIT_FAILURE; (*list)->head = NULL; (*list)->size = 0; return EXIT_SUCCESS; Κατά την έξοδο, η αναφορά list χάνεται όχι όμως ο χώρος που δεσμεύτηκε με την malloc (η διεύθυνση του οποίου επιστρέφεται) int main() { LIST *list = initlist();... int main() { LIST *list = NULL; initlist2(&list);... LIST *list **list list 13-7

Ταξινομημένες Λίστες (Λειτουργίες / Διαδικασίες) Τώρα απομένει να ορίσουμε τρείς διαδικασίες: printlist: τυπώνει όλα τα στοιχεία της λίστας l. void printlist(list *l); insert: εισαγάγει ένα στοιχείο x μέσα στη λίστα l. void insert(list *l, int x); delete: αφαιρεί κάποιο στοιχείο x (αν υπάρχει) από τη λίστα l. void delete(list *l, int x); Οι πιο πάνω λειτουργίες μαζί με τις συνοδευτικές λειτουργίες δημιουργίας, καταστροφής της λίστας πρέπει να τοποθετηθούν σε αρχεία list.c και list.h Μαζί με τον σχετικό οδηγό δοκιμής #ifdef DEBUG #endif. To main θα περιέχει ένα switch που μας επιτρέπει να καλέσουμε τις διαδικασίες ταξινομημένης λίστας. Δεν θα μας απασχολήσει στο παρόν στάδιο το return code των συναρτήσεων αυτών. 13-9

Ταξινομημένες Λίστες (Διαγραμματική Απεικόνιση) Εισαγωγή του 4 στη λίστα: Εξαγωγή του 3 από τη λίστα: Περιγράψετε το διάγραμμα μιας λύσης στο πιο πάνω πρόβλημα. Τι οριακές περιπτώσεις εντοπίζετε; 13-10

Ταξινομημένες Λίστες (Συνάρτηση Οδηγού Χρήσης) #ifdef DEBUG int main(){ int x = 0; /* User Function Choice*/ int y; /* Value to be inserted/deleted */ LIST *list = initlist(); while (x!= 4){ printf("you have the following options:\n"); printf("\t 1\t: inserting an item in the list\n"); printf("\t 2\t: deleting an item from the list\n"); printf("\t 3\t: printing the list elements\n"); printf("\t 4\t: exiting from the system\n"); scanf("%d", &x); // συνέχεια επόμενη διαφάνεια 13-11

Ταξινομημένες Λίστες (Συνάρτηση Οδηγού Χρήσης) switch (x){ case 1: printf("enter number to be inserted: "); scanf("%d", &y); insert(list, y); break; case 2: printf("give me the number to be deleted: "); scanf("%d", &y); delete(list, y); break; case 3: printlist(list); break; case 4: printf("goodbye!\n"); break; default: printf("wrong entry try again!\n"); break; return 0; #endif 13-12

Ταξινομημένες Λίστες (Συνάρτηση printlist) void printlist(list *l) { NODE *p = NULL; // copy pointer if ((l == NULL) (l->size == 0)) { printf("the list is empty\n"); return; p = l->head; while (p!= NULL){ printf("%d ", p->data); p = p->next; printf("\n"); 13-13

Ταξινομημένες Λίστες (Αναδρομική Συνάρτηση printlist) void printlist(list *l){ if ((l == NULL) (l->size == 0)) printf("the list is empty\n"); else printnode(l->head); "Εσωτερική συνάρτηση" με εμβέλεια αρχείου static void printnode(node *p){ if (p!= NULL){ printf("%d", p->data); printnode(p->next); Αναδρομή Χωρίς return στην οπισθοχώρηση 13-14

Πρόβλημα 1: count Γράψετε συνάρτηση στη γλώσσα C η οποία παίρνει ως όρισμα ένα δείκτη σε λίστα και η οποία επιστρέφει το μέγεθος της λίστας. Πρότυπο Συνάρτησης: int count(list *list); typedef struct node { int data; struct node *next; NODE; typedef struct { NODE *head; LIST; Κλήση Συνάρτησης LIST *list;... printf("%d", count(list)); τυπώνει 4 13-15

Πρόβλημα 1: count (Επαναληπτική Λύση) static int countlist(node *p) { int count = 0; while (p!= NULL) { count++; p = p->next; return count; p int count(list *l) { if (l == NULL) return 0; return countlist(l->head); 13-16

Πρόβλημα 1: count (Αναδρομική Λύση 1) static void countlistrecursive(node *p, int *count) { if (p == NULL) { return 0; (*count)++; countlistrecursive(p->next, count); int count(list *l) { if (l == NULL) return 0; int count = 0; countlistrecursive(l->head, &count); return count; Αναδρομή ΧΩΡΙΣ return στην οπισθοχώρηση και τιμή δια αναφοράς 13-17

Πρόβλημα 1: count (Αναδρομική Λύση 2) static int countlistrecursive(node *p) { if (p == NULL) { return 0; return 1 + countlistrecursive(p->next); Αναδρομή ΜΕ return στην οπισθοχώρηση int count(list *l) { if (l == NULL) return 0; return countlistrecursive(l->head); 13-18

Σύνοψη Αναδρομικών Προσεγγίσεων Α) Προσπέλαση Β) Οπισθοχώρηση Προσπέλαση (void στη Οπισθοχώρηση) - Εκτύπωση Λίστας: void printnode(node *p); - Count με Eκτύπωση: void countlr(node *p, int count); - Count με Δια'αναφοράς: void countlr(node *p, int *count); - Όμοια Υλοποιούνται οι : Sum, Max, Min, Avg (δηλ., Sum/Count) - Πολλαπλές με Δια'αναφοράς: void countlr(node *p, int *sum, int *count); Προσπέλαση + Οπισθοχώρηση - Count με Επιστροφή: int countlr(node *p); 13-19