2 η Υλοποίηση του ΑΤΔ συνδεδεμένη λίστα με πίνακα Κόμβοι από δεδομένα και θέσεις πίνακα ????

Σχετικά έγγραφα
Δομές Δεδομένων και Τεχνικές Προγραμματισμού Ενότητα 4: ΑΤΔ Λίστα. Ιωάννης Κοτρώνης Σχολή Θετικών Επιστημών Τμήμα Πληροφορικής και Τηλεπικοινωνιών

Οι Πράξεις. 1 η Υλοποίηση του ΑΤΔ: μονά συνδεδεμένη λίστα με δείκτες. Σχεδιασμός: Λίστα με Συνδεδεμένους Κόμβους

Σχεδιασμός: Λίστα με Συνδεδεμένους Κόμβους

ΛΙΣΤΕΣ. Ορισμός ΑΤΔ Λίστα ΑΤΔ Ακολουθιακή Λίστα Διαχείριση Δεικτών και Λιστών στη C ΑΤΔ Συνδεδεμένη Λίστα. Εφαρμογές και Χρήση Λιστών

Λίστες (Lists) Ο ΑΤΔ λίστα είναι µια συλλογή στοιχείων του ίδιου τύπου µε

AVL δέντρα. h L h R. G.M. Adelson_Velkii και E.M. Landis 1962

Δυαδικά Δέντρα Αναζήτησης (Binary Search Trees) Ορισμός : Ένα δυαδικό δέντρο αναζήτησης t είναι ένα δυαδικό δέντρο, το οποίο είτε είναι κενό είτε:

Υλοποιήσεις,Δοκιμές και Εφαρμογές Βασικών Αφηρημένων Τύπων Δεδομένων στη C για εκπαιδευτική χρήση 1. Ο ΑΤΔ ΔΕΝΔΡΟ

Δείκτες και Δομές. Info. Link. typedef struct NodeTag { InfoField Info; struct NodeTag *Link; } NodeType;

ΟιβασικέςπράξειςπουορίζουντονΑΤΔ δυαδικό δέντρο αναζήτησης είναι οι ακόλουθες:

Η αναφορά σ ένα μέλος μίας μεταβλητής τύπου δομής γίνεται με την παράσταση

Οι βασικές πράξεις που ορίζουν τον ΑΤ δυαδικό δέντρο αναζήτησης είναι οι ακόλουθες:

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

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

ΣΥΜΒΟΛΟΣΕΙΡΕΣ (Strings) Ο ΑΤΔ Συµβολοσειρά Μία συµβολοσειρά είναι µία ακολουθία χαρακτήρων. Bασικές πράξεις : 1. Δηµιουργία. 2. Μήκος. 3.

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

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

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

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

Generics και ArrayLists

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

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

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

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

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

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

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

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

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

Δρ. Πέτρος Παναγή B123

Δέντρα (Trees) - Ιεραρχική Δομή

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

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

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

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

Μη AVL Δέντρα Εισαγωγή κόμβου 4, 6 : 4 12 :

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

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

Υλοποιήσεις,Δοκιμές και Εφαρμογές Βασικών Αφηρημένων Τύπων Δεδομένων στη C για εκπαιδευτική χρήση 1. Ο ΑΤΔ ΓΡΑΦΗΜΑ

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

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

ΣΤΟΙΒΕΣ (stacks) Σχήµα: Λειτουργία Στοίβας

Δομές Δεδομένων. Ενότητα 3: Ουρές Εισαγωγή-Υλοποίηση ΑΤΔ Ουρά με πίνακα. Καθηγήτρια Μαρία Σατρατζέμη. Τμήμα Εφαρμοσμένης Πληροφορικής.

Ουρές (Queues) FIFO A B C. Διαγραφή. Εισαγωγή. εµπρός. πίσω. πίσω. πίσω

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

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

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

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

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

Δομές Δεδομένων. Ενότητα 10: Πλήρη Δυαδικά Δέντρα, Μέγιστα/Ελάχιστα Δέντρα & Εισαγωγή στο Σωρό- Ο ΑΤΔ Μέγιστος Σωρός. Καθηγήτρια Μαρία Σατρατζέμη

Επιλογές και Κριτήρια Σχεδιασμού ΑΤΔ Ανεξαρτήτως από Γλώσσα Υλοποίησης 24/4/2012

ρίζα E F G H I J επίπεδο 1

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

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

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

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

Θέµα 1 (15%): (απαιτούµενος χρόνος < 15 λεπτά)

242 -ΕισαγωγήστουςΗ/Υ

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

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

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

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

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

ΕΠΛ232: Εργαστήριο 2

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

Γραμμικές Δομές Δεδομένων

Επισκόπηση Μαθήματος. Γραμμικές Δομές Δεδομένων. ΑΤΔ Ουρά Εναλλακτικοί Σχεδιασμοί Προγραμματισμός με Ενότητες Interface.h Implementation.

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

Διάλεξη 9: Αφηρημένοι Τύποι Δεδομένων. Διδάσκων: Παναγιώτης Ανδρέου

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

Ασκηή σεις 12ο Μαά θημα - Λυύ σεις

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

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

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

ΑΡ Χ Ε Ι Α Κ Ε Ι Μ Ε Ν Ο Υ (text files)

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

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

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

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

Δομές Δεδομένων. Ενότητα 2: Στοίβες Εισαγωγή-Υλοποίηση ΑΤΔ Στοίβα με Πίνακα-Εφαρμογή Στοίβας: Αντίστροφη Πολωνική Γραφή. Καθηγήτρια Μαρία Σατρατζέμη

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

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

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

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

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

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

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

Δομές Αναζήτησης. κλειδί από ολικά διατεταγμένο σύνολο. Θέλουμε να υποστηρίξουμε δύο βασικές λειτουργίες: Εισαγωγή ενός νέου στοιχείου

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

διεύθυνση πρώτου στοιχείου διεύθυνση i-οστού στοιχείου T t[n]; &t[0] είναι t &t[i] είναι t + i*sizeof(t)

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

"ΓΛΩΣΣΑ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Η/Υ" (ΕΜ102), ΕΡΓΑΣΙΑ 1η

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

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

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

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

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

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

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

Δομές Δεδομένων και Τεχνικές Προγραμματισμού Ενότητα 3: ΑΤΔ Ουρά. Ιωάννης Κοτρώνης Σχολή Θετικών Επιστημών Τμήμα Πληροφορικής και Τηλεπικοινωνιών

Transcript:

η Υλοποίηση του ΑΤΔ συνδεδεμένη λίστα με πίνακα Κόμβοι από δεδομένα και θέσεις πίνακα θέση (index) dedomena epomenos lista = 0 1 3 Ελένη Σπύρος Βασίλης -1 1

Στη συνέχεια θα πρέπει να γνωρίζουμε την οργάνωση του πίνακα αυτού προκειμένου να γίνει εισαγωγή ή διαγραφή κάποιου στοιχείου του. Φυσικό είναι να γνωρίζουμε την αρχική κατάσταση του πίνακα όπως στο σχήμα : kenos δείκτης dedomena epomenos 0 1 3 1 3-1 -1 συνθήκη τέλους (έξω από όριο πίνακα (null)

Στη συνέχεια, ας υποθέσουμε ότι Βασίλης είναι το πρώτο όνομα που θα εισαχθεί σε μια συνδεδεμένη λίστα. Το όνομα αυτό θα τοποθετηθεί στην πρώτη θέση του πίνακα του και θα έχουμε το Σχήμα : δείκτης dedomena epomenos lista kenos 0 1 3 Βασίλης -1 3-1

Όταν διαγράφεται ένας κόμβος από τη συνδεδεμένη λίστα πρέπει η θέση του να συμπεριληφθεί στις κενές θέσεις του πίνακα ώστε να ξαναχρησιμοποιηθεί αργότερα για την αποθήκευση κάποιου άλλου στοιχείου της λίστας. Για παράδειγμα, ας υποθέσουμε ότι έχουμε τη συνδεδεμένη λίστα του σχήματος p lista kenos δείκτης dedomena epomenos 0 1 3 Βασίλης Σπύρος Ελένη 1-1 -1

Η διαγραφή του ονόματος Βασίλης έχει σαν αποτέλεσμα αυτό του σχήματος. Ας σημειωθεί ότι δεν είναι αναγκαία η φυσική απομάκρυνση του ονόματος Βασίλης από το τμήμα των δεδομένων. kenos lista δείκτης dedomena epomenos 0 1 3 Βασίλης Σπύρος Ελένη 3-1 -1

#define plithos... #define null -1 // για να μοιάζει με NULL #define not_spec -1 typedef... TStoixeioyListas; typedef struct { TStoixeioyListas dedomena; int epomenos; typos_komvou; typedef struct typos_listas{ typos_komvou komvos[plithos]; int HeadList; /*thesi tou prwtou xrhsimou kombou*/ int HeadKenos;/*thesi tou prwtou eleyerou kombou*/ typos_listas;

void arxiki_katastasi(typos_listas * ListPtr){ int i; /* σύνδεση των κενών κόμβων μεταξύ τους */ for ( i=0; i<plithos-1; i++ ) ListPtr->komvos[i].epomenos = i+1; /* ένδειξη τέλους της λίστας */ ListPtr->komvos[plithos-1].epomenos=null; ListPtr->HeadKenos = 0; list->headlist=not_spec;

Για την εκτέλεση της παραπάνω διαδικασίας απαιτείται πρώτα ο εντοπισμός της κενής θέσης όπου θα εισαχθεί ο νέος κόμβος. Η pare_komvo(p) τοποθετεί στο p την τιμή της kenos, δηλαδή την θέση του πίνακα komvos που είναι κενή και πρόκειται να τοποθετηθεί ο νέος κόμβος. (κατ αναλογία της malloc () ) Ταυτόχρονα, διαγράφει (αφαιρεί) τη θέση αυτή από τη λίστα των κενών θέσεων. (κατ αναλογία της διαχείρισης του σωρού).

void pare_komvo(typos_listas *list, int *p, int *error) { error =0; *p = list->headkenos; if (list->headkenos!=not_spec) list->headkenos= list->komvos[list->headkenos].epomenos; else *error=1;

Η διαδικασία που υλοποιεί μόνο την αποδέσμευση του χώρου του κόμβου που διαγράφεται είναι η ακόλουθη: void apodesmeysi(typos_listas *list, int p) { list->komvos[p].epomenos = list->headkenos; list->headkenos = p; Κατ αναλογία του free()

Η διαδικασία για τη δημιουργία μιας κενής συνδεδεμένης λίστας τοποθετεί την τιμή null (-1) στο δείκτη lista και αρχικοποιεί τον πίνακα με όλα τα στοιχεία στην λίστα των κενών. void dimiourgia(typos_list *listptr){ arxiki_katastasi(listptr); /* οι κενοί κόμβοι */

Για τον έλεγχο αν μια συνδεδεμένη λίστα είναι κενή έχουμε το ακόλουθο υποπρόγραμμα : int LIST_keni(typos_listas lista) {/*Pro: Dhmioyrgia listas *Meta:epistrefei 1 an h lista einai kenh, diaforetika 0 */ return (lista.headlist == not_spec );

void LIST_eisagogi(typos_listas *list, TStoixeioyListas stoixeio, int prodeiktis, int *error){ /* Pro: Dhmioyrgia listas Meta: An o prodeiktis einai null tote o kombos me ta dedomena stoixeio exei eisaxei sthn arxh ths listas (symvash) alliws eisagetai meta ton kombo poy deixnei o prodeiktis */ *error=0; if (prodeiktis == not_spec) /*eisagwgh sthn arxh */ eisagogi_arxi(list, stoixeio, error); else eisagogi_meta(list, prodeiktis, stoixeio, error);

void eisagogi_arxi(typos_listas *list, TStoixeioyListas stoixeio,int *error) { int prosorinos; pare_komvo(list,&prosorinos,error); TSlist_setValue(&(list->komvos[prosorinos].dedomena), stoixeio); list->komvos[prosorinos].epomenos=list->headlist; list->headlist=prosorinos;

void eisagogi_meta(typos_listas *list, int prodeiktis, TStoixeioyListas stoixeio, int *error){ int prosorinos; /*Deixnei to neo kombo poy a eisaxei*/ pare_komvo(list, &prosorinos, error); TSlist_setValues( &(list->komvos[prosorinos].dedomena), stoixeio); list->komvos[prosorinos].epomenos= list->komvos[prodeiktis].epomenos; list->komvos[prodeiktis].epomenos=prosorinos;

void LIST_diagrafi(typos_listas *lista, int prodeiktis, int *error) { *error=0; if (LIST_keni(*lista)) *error=1; else { int prosorinos;/* o kombos poy a diagrafei*/ if (prodeiktis!= null) /* όχι στην αρχή */ { prosorinos = lista->komvos[prodeiktis].epomenos; lista->komvos[prodeiktis].epomenos = lista-> komvos[prosorinos].epomenos; else if (prodeiktis == null) /* στην αρχή */ { prosorinos = lista -> HeadList; lista->headlist = lista->komvos[headlist].epomenos; apodesmeysi(lista, prosorinos);