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

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

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

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

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

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδηµαϊκό έτος ΑΣΚΗΣΗ #5 Προτεινόµενη λύση

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

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

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

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

Η-Υ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ. Εργαστήριο 9 Συναρτήσεις. Γεώργιος Λαμπρινίδης

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

3ο σετ σημειώσεων - Πίνακες, συμβολοσειρές, συναρτήσεις

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

Πίνακες. 1 Πίνακες. 30 Μαρτίου 2014

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

Εισαγωγή στους Αλγόριθμους και τον Προγραμματισμό. 3η Διάλεξη Είσοδος Δεδομένων Συνθήκες Βρόχοι Παραδείγματα

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

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

ΑΣΚΗΣΗ 5: ΠΙΝΑΚΕΣ. Σχήµα 1: H έννοια των πινάκων

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

Αʹ. Πίνακες. Άσκηση 1. Λύση. Άσκηση 2. Λύση. Ασκήσεις Εργαστηρίου Προγραμματισμού

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

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

Κεφάλαιο V: Δομές και ενώσεις. 5.1 Δομές.

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

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

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

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

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

Προγραμματισμός Η/Υ 1 (Εργαστήριο)

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

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

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

Δομημένος Προγραμματισμός

Προγραμματισμός Η/Υ (ΤΛ2007 )

6. ΠΙΝΑΚΕΣ & ΑΛΦΑΡΙΘΜΗΤΙΚΑ

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

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

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

Χαράλαµπος Σκόκος ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ I ΓΛΩΣΣΑ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ C ΕΞΕΤΑΣΕΙΣ ΧΕΙΜΕΡΙΝΟΥ ΕΞΑΜΗΝΟΥ Ερωτήσεις

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

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

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

Γλώσσα Προγραμματισμού C

Διαδικασιακός Προγραμματισμός

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

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

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα. Εισαγωγή στον Προγραμματισμό. Ενότητα 8: Συναρτήσεις. Κ.

Προγραμματισμός Η/Υ (ΤΛ2007 )

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

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

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

Προγραμματισμός Η/Υ (ΤΛ2007 )

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

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

Εισαγωγή στην C. Μορφή Προγράµµατος σε γλώσσα C

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

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

ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΔΟΜΗΜΕΝΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ

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

ΣΥΝΑΡΤΗΣΕΙΣ Παραδείγματα χρήσης συναρτήσεων

Προγραμματισμός Η/Υ 1 (Εργαστήριο)

Εχουμε ήδη συναντήσει μονοδιάστατους πίνακες, οι οποίοι ορίζονται ως εξής:

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

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

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

οµές (structures) Στην ενότητα αυτή θα µελετηθούν τα εξής επιµέρους θέµατα: Πίνακες δοµών, δείκτες σε δοµές, και αυτοαναφορικές δοµές.

7. ΕΙΣΑΓΩΓΗ ΣΤΙΣ ΣΥΝΑΡΤΗΣΕΙΣ

Δείκτες (Pointers) Ένας δείκτης είναι μια μεταβλητή με τιμή μια διεύθυνση μνήμης. 9.8

ΣΥΝΑΡΤΗΣΕΙΣ (Functions)

Κεφάλαιο 8.7. Πολυδιάστατοι Πίνακες (Διάλεξη 19)

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

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

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

Νικόλαος Μιχαλοδημητράκης Σημειώσεις C (Εργαστήριο) 12 ο Μάθημα 1

5. ΒΡΟΧΟΙ ΕΠΑΝΑΛΗΨΗΣ (Β' μέρος: while - do..while)

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

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

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

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΥΠΟΛΟΓΙΣΤΩΝ & ΥΠΟΛΟΓΙΣΤΙΚΗ ΦΥΣΙΚΗ ΕΞΕΤΑΣΗ IOYNIOY 2018 ΘΕΜΑΤΑ Α ΟΝΟΜΑΤΕΠΩΝΥΜΟ:... ΑΕΜ: ΕΞΑΜΗΝΟ:

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ I ΓΛΩΣΣΑ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ C ΠΡΟΓΡΑΜΜΑΤΑ ΕΡΓΑΣΤΗΡΙΟΥ

ΕΝΤΟΛΕΣ ΕΠΑΝΑΛΗΨΗΣ. for (παράσταση_1; παράσταση_2; παράσταση_3) εντολή επόμενη εντολή

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

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

5ο σετ σημειώσεων - Δείκτες

C Programming EPL032 Maria Stavrinou Ioannou Εισαγωγή στη Γλώσσα C

ΑΣΚΗΣΗ 7: ΑΛΦΑΡΙΘΜΗΤΙΚΑ

Οικονόμου Βαγγέλησ Διάλεξη Νο 2. Δομημένοσ Προγραμματιςμόσ - Διάλεξη 2

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

Προγραμματισμός Η/Υ (ΤΛ2007 )

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

Προγραμματισμός Η/Υ (ΤΛ2007 )

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

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

Η γλώσσα προγραμματισμού C

ΑΣΚΗΣΗ 6: ΔΕΙΚΤΕΣ. Σκοπός της Άσκησης. 1. Εισαγωγικά στοιχεία για τους Δείκτες

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

Η γλώσσα προγραμματισμού C

Τμ. Τεχνολογίας Πληροφορικής & Τηλεπικοινωνιών Α Εξεταστική Περίοδος, 25 Ιουνίου 2009 ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΙΙ Ηλίας. Κ. Σάββας

Δομημένος Προγραμματισμός

Transcript:

ΔΟΜΕΣ Πολλές φορές, μία σύνθετη οντότητα μπορεί να καθορισθείαπό ένα σύνολο δεδομένων, πιθανώς διαφορετικών τύπων,οπότε θα ήταν χρήσιμο να ομαδοποιούσαμε τα δεδομένααυτά κάτω από ένα γενικό όνομα, με σκοπό νααναφερόμαστε στην οντότητα αυτή με το όνομα αυτό. Στην C, η δυνατότητα ομαδοποίησης δεδομένων, που αποτελούν κατά κάποιο τρόπο τα χαρακτηριστικά μίας προγραμματιστικής οντότητας, παρέχεται από τις δομές. Μία δομή ορίζεται με τον εξής τρόπο: struct ετικέτα δομής τύπος1 μέλος1; τύπος 2 μέλος2;... τύπος ν μέλοςν; ; Ο ορισμός μίας δομής αποτελείται από τους ορισμούς των μελών της, που περιγράφονται σαν μεταβλητές συγκεκριμένων τύπων. Φυσικά, πίνακες, δείκτες ή ακόμα και δομές μπορούν να είναι μέλη μίας δομής. Παράδειγμα Struct employee char firstname[10]; char lastname[18]; int id_number; float salary; ; Στo παράδειγμα αυτόo ορίζουμε μία δομή struct employee για την αναπαράσταση πληροφοριών για ένα υπάλληλο (μικρό όνομα, επώνυμο, αριθμός μητρώου και μισθός) Ο ορισμός μίας δομής είναι μία δήλωση για την οποία δεν γίνεται κάποια δέσμευση μνήμης. Μπορούμε όμως να ορίσουμε συγκεκριμένες μεταβλητές που έχουν σαν τύπο μία δομή, ως εξής: struct ετικέτα δομής μεταβλητή1,, μεταβλητή ν; Τότε, δεσμεύεται η απαιτούμενη μνήμη για τις μεταβλητές, ανάλογα με τον χώρο που χρειάζεται για να φυλαχθούν τα μέλη της δομής. Μεταβλητές με τύπο δομή μπορούν να ανατίθενται σαν τιμές σε άλλες μεταβλητές του ίδιου τύπου, μπορούν να δίνονται σαν ορίσματα κατά την κλήση συναρτήσεων και μπορούν να επιστρέφονται από συναρτήσεις στο όνομά τους. Η αναφορά σ ένα μέλος μίας μεταβλητής τύπου δομής γίνεται με την παράσταση Μεταβλητή. μέλος Οπως ορίζουμε μεταβλητές με τύπο κάποια δομή, έτσι μπορούμε να ορίσουμε και δείκτες σε δομές. Παράδειγμα: struct point *ppa, *ppb; 1

Αν ένας δείκτης δείχνει σε κάποια δομή και θέλουμε να αναφερθούμε σ ένα μέλος της, αντί να γράφουμε (*δείκτης).μέλος η C μας δίνει τη δυνατότητα να γράψουμε πιο απλά δείκτης->μέλος Οπως συμβαίνει και με όλους τους τύπους στην C,μπορούμε να ορίσουμε και πίνακες δομών. Αυτο-αναφορικές δομές Τα μέλη μίας δομής μπορεί να είναι οποιουδήποτε τύπου,ακόμα και δείκτες σε δομές του ίδιου τύπου. Χρησιμοποιώντας τέτοιου είδους δομές, που ονομάζονται αυτο-αναφορικές και είναι πολύ χρήσιμες στον προγραμματισμό, μπορούμε να οργανώσουμε δεδομένα με τρόπους που διευκολύνουν εξαιρετικά τη διαχείριση και επεξεργασία τους. Οι πλέον συνήθεις οργανώσεις δεδομένων μέσω αυτο-αναφορικών δομών είναι οι συνδεδεμένες λίστες (ή απλά λίστες) και τα δυαδικά δέντρα. Εστω η δήλωση: struct listnode int value; struct listnode *next; ; Αυτή η δομή ορίζει έναν κόμβο λίστας στον οποίο φυλάσσεται ένας ακέραιος και ένας δείκτης σε κόμβο λίστας.αν θέλουμε να αποθηκεύσουμε μία ακολουθία από ακεραίους, απροσδιορίστου πλήθους, αλλά και μεταβαλλόμενου κατά τη διάρκεια της εκτέλεσης ενός προγράμματος, μπορούμε να το κάνουμε βάζοντας κάθε ακέραιο σ ένα κόμβο λίστας και δείχνοντας από κάθε κόμβοστον επόμενό του. Η αναφορά στη λίστα γίνεται με ένα δείκτη στον πρώτο κόμβο της. Ο τελευταίος κόμβος της λίστας έχει σαν δείκτη σε επόμενο κόμβο το NULL. Οι κόμβοι μίας λίστας δεν φυλάσσονται σε διαδοχικές θέσεις μνήμης, αφού η μνήμη γι αυτούς δεσμεύεται με διαφορετικές malloc. Αυτό σημαίνει ότι δεν μπορούμε να έχουμε άμεση πρόσβαση στο ν-οστό στοιχείο μίας λίστας, όπως στους πίνακες, αλλά μόνο ακολουθώντας την αλυσίδα των στοιχείων από το πρώτο έως το ν-οστό. Πράξεις σε λίστες Η παρεμβολή και η διαγραφή ενός κόμβου σε/από συγκεκριμένη θέση της λίστας ΠΑΡΑΔΕΙΓΜΑΤΑ ΜΕ ΛΙΣΤΕΣ ΣΕ C Ginete eisagogh stoixeiou sthn arxh thw listas,eisagogh stoixeiou sto telos thw listas, eisagogh stoixeiou se tyxaia thesh thw listas, diagrafh stoixeiou apo tin lista, anazhthsh stoixeiou sth lista,.taxinomhsh listas 2

#include <stdio.h> #include <stdlib.h> struct node int value; node *next; ; char ans; node* listbase;//h μεταβλητή listbase ορίζεται ως δείκτης σε κόμβο της λίστας int x,i,epilogi,thesi,f,plithos_stoixeion=0; //Η διαδικασία list_print χρησιμοποείται για να εκτυπώσει τη λίστα void list_print() node *v=listbase; if (v==null) printf("h lista einai kenh\n"); printf("\nh lista einai\n"); while (v!=null) printf("%d\t",v->value); plithos_stoixeion++; printf("\n"); void list_count() node *v=listbase; plithos_stoixeion=0; while (v!=null) plithos_stoixeion++; printf("plithos stoixeion %d = \n",plithos_stoixeion); //Η διαδικασία list_push_infront χρησιμοποείται για να προσθέσει ένα νέο στοιχείο στην αρχή της λίστας void list_push_infront() 3

node *v=listbase; node *w; w=(node*)malloc(1*sizeof(node)); printf("diabase to neo stoixeio pou tha mpei sthn arxh tis listas\n"); scanf("%d",&w->value); w->next=v; listbase=w; //Η διαδικασία list_push_atend χρησιμοποείται για να προσθέσει ένα νέο στοιχείο στο τέλος της λίστας void list_push_atend() node *w,*v; int t; w=(node*)malloc(1*sizeof(node)); printf("diabase to neo stoixeio pou tha mpei sto telos tis listas\n"); scanf("%d",&t); w->value=t; v=listbase; if (v==null) listbase=w; w->next=null; while (v->next!=null) v->next=w; w->next=null; /*Η διαδικασία list_push_inside χρησιμοποείται για να προσθέσει ένα νέο στοιχείο σε μια τυχαία θέση της λίστας. Η θέση αυτή μπορεί να είναι από την πρώτη μέχρι και την τελευταία*/ void list_push_inside() node *v,*w; 4

i=1; v=listbase; w=(node*)malloc(1*sizeof(node)); printf("dose thn timh tou neou kombou ths listas\n"); scanf("%d",&w->value); printf("se poia thesh ths listas theleis na to eisageis \n"); scanf("%d",&thesi); if (thesi==1) w->next=v; listbase=w; while (v->next!=null && i<thesi-1) i++; w->next=v->next; v->next=w; //Η διαδικασία list_delete χρησιμοποιείται για να διαγράψει ένα στοιχείο από τη λίστα void list_delete() node *v,*w; if (listbase!=null) printf("dose to stoixeio ths listas pou tha diagrafei\n"); scanf("%d",&x); v=listbase; f=0; //έστω ότι το στοιχείο που θα διαγραφεί δεν υπάρχει if (v->value==x) listbase=v; f=1; 5

if (f==0) w=v->next; while (w!=null && f==0) if (w->value!=x) w=w->next; f=1; if (f==1) v->next=w->next; free(w); printf("to zhtoymeno stoixeio den brethike sth lista \n"); printf("h lista einai kenh \n"); //Η διαδικασία list_search χρησιμοποιείται για να διαγράψει ένα στοιχείο από τη λίστα void list_search() node *v,*w; int i=1; if (listbase!=null) printf("dose to stoixeio ths listas pou tha anazhthsoume\n"); scanf("%d",&x); v=listbase; f=0; //έστω ότι το στοιχείο που θα αναζητηθεί δεν υπάρχει if (v->value==x) printf("to zhtoymeno stoixeio brethike sth thesh 1 ths listas\n"); f=1; return; 6

if (f==0)//αν το στοιχείο δεν έχει βρεθεί στην 1η θέση i++;//πήγαινε στην επόμενη w=v->next; while (w!=null && f==0) if (w->value!=x) w=w->next; i++; f=1; if (f==1) printf("to zhtoymeno stoixeio brethike sth thesh %d \n",i); printf("to zhtoymeno stoixeio den brethike sth lista \n"); printf("h lista einai kenh \n"); void list_sort() int temp,k,i; node *p,*q; list_count(); printf("\n plithos = %d\n",plithos_stoixeion); for (k=1;k<plithos_stoixeion;k++) p=listbase; q=p->next; for (i=1;i<=plithos_stoixeion-k;i++) if (p->value>q->value) temp=p->value; p->value=q->value; q->value=temp; p=p->next; q=q->next; 7

void main() listbase=null; do printf("1.eisagogh stoixeiou sthn arxh thw listas\n"); printf("2.eisagogh stoixeiou sto telos thw listas\n"); printf("3.eisagogh stoixeiou se tyxaia thesh thw listas\n"); printf("4.diagrafh stoixeiou apo thw lista\n"); printf("5.anazhthsh stoixeiou sth lista\n"); printf("6.taxinomhsh listas\n"); printf("dose thn epilogh sou\n"); scanf("%d",&epilogi); switch(epilogi) case 1:list_push_infront(); case 2:list_push_atend(); case 3:list_push_inside(); case 4:list_delete(); case 5:list_search(); case 6:list_sort(); default:printf("wrong choice\n"); getchar(); printf("continue y/n \n"); scanf("%c",&ans); while (ans=='y'); 8