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

Σχετικά έγγραφα
Σημειώσεις όγδοης εβδομάδας

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

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

Πίνακες: μια σύντομη εισαγωγή. Πίνακες χαρακτήρων: τα "Αλφαριθμητικά"

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

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

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

Προγραµµατισµός Ι 1

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

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

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

ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

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

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

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

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

Ενώσεις δεδομένων Απαριθμητές Ψηφιακοί τελεστές Αναδρομικές συναρτήσεις

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

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

Διάλεξη 22η: Επιπλέον στοιχεία της C

ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

Αρχές Προγραμματισμού

Η γλώσσα προγραμματισμού C Δυναμική διαχείριση μνήμης

που θα δώσει αποτέλεσµα 48, λόγω της αριστερής προσεταιριστικότητας των τελεστών / και *, ενώ η επιθυµητή αντικατάσταση θα ήταν η

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

Μεταβλητές. Έστω η μεταβλητή

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

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

Ι Αρχεία δεδομένων, μέρος δεύτερο: δυαδικά αρχεία ΙΙ Δομές δεδομένων (struct)

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

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

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

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

Αρχές Προγραμματισμού

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

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

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

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

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

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

Εργαστήριο 2: Πίνακες

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

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

Εισαγωγή στον Προγραµµατισµό. Πανεπιστήµιο Θεσσαλίας Τµήµα Ηλεκτρολόγων Μηχανικών και Μηχανικών Η/Υ

C: Από τη Θεωρία στην Εφαρμογή

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

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

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

Διάλεξη 9: Δυναμική Δέσμευση Μνήμης

HY150a Φροντιστήριο 3 24/11/2017

Διάλεξη 20: Χαμηλού Επιπέδου Προγραμματισμός II

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

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

ΤΕΜ-101 Εισαγωγή στους Η/Υ Εξεταστική Ιανουαρίου 2011 Θέματα Β

{C} Programming. Part 2/2 Advanced Pointers, Structs, Memory Allocation, Examples using structs

Δομές Δεδομένων και Αλγόριθμοι (Γ εξάμηνο) Τμήμα Μηχανικών Πληροφορικής ΤΕ, ΤΕΙ Ηπείρου. Άσκηση εργαστηρίου #6 (Υλοποίηση δυαδικού δένδρου αναζήτησης)

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

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

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

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

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

Διάλεξη 11η: Δείκτες, μέρος 1

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

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

Α' Εξάμηνο ΕΙΣΑΓΩΓΗ ΣΤΟ ΔΟΜΗΜΕΝΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ. Ασκήσεις Επανάληψης

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

Transcript:

Σημειώσεις έκτης και έβδομης εβδομάδας Προσέξτε το μέγεθος των δύο δομών. Το Node είναι 8 bytes, ενώ το Node1 1 byte. Η διαφορά έγκειται στο ότι η πρώτη δομή περιέχει ακέραιο, τον δείκτη next, οπότε πρέπει να στοιχίζεται σε θέσεις μνήμης οι οποίες να είναι πολλαπλάσια του μεγέθους του δείκτη. Στον συγκεκριμένο υπολογιστή και compiler τα μεγέθη είναι αυτά που εμφανίζονται στα σχόλια δίπλα από κάθε printf στον κώδικα: int main(void){ typedef struct node { char name; struct node* next; Node; typedef struct node1 { char name; Node1; printf("int: %d\n", sizeof(int)); /* prints 4 */ printf("int*: %d\n", sizeof(int*)); /* prints 4 */ printf("char: %d\n", sizeof(char)); /* prints 1 */ printf("char*: %d\n", sizeof(char*)); /* prints 4 */ printf("node*: %d\n", sizeof(node*)); /* prints 4 */ printf("node: %d\n", sizeof(node)); /* prints 8 */ printf("node1: %d\n", sizeof(node1)); /* prints 1 */ Όταν πρέπει να καλέσουμε την malloc, για δυναμική δέσμευση μνήμης, πρέπει να ελέγχουμε αν η μνήμη πράγματι δεσμεύτηκε ή όχι. Αυτό γίνεται με τον έλεγχο. Αν δεν μπορέσει να δεσμευτεί η μνήμη η malloc επιστρέφει NULL. Εδώ σαν παράδειγμα malloc με έλεγχο για NULL, βλέπουμε την συνάρτηση strdup, η οποία δημιουργεί αντίγραφα από strings. char *strdup(char *s) { char *d=(char*)malloc(strlen(s)+1); if(d==null) return NULL; strcpy(d,s); return d; Σημειώσεις Εργαστηρίου Δομών και Αλγορίθμων Week6-7 1 costis@teicrete.gr

Την αρχική μας λίστα της προηγούμενης εβδομάδας την τροποποιούμε έτσι ώστε να γίνει λίστα ονομάτων, αντί για λίστα χαρακτήρων που ήταν. : #include <stdlib.h> #include <string.h> typedef struct node { char* name; struct node* next; Node; void printlist(node* n); int main(void) { Node *fp, *np, *cp; char* name; name=(char*)malloc(80*sizeof(char)); if(name==null) { printf("no memory!\n"); return -1; fp = NULL; printf("enter name: "); scanf("%s",name); while(strcmp(name,"end")) { np = (Node*) malloc(sizeof (Node)); np->name=strdup(name); np->next = NULL; if (fp == NULL) fp = np; else cp->next = np; cp = np; printf("enter name: "); scanf("%s",name); printlist(fp); void printlist(node* current) { if (current == NULL) printf("list is empty\n"); else { printf("%s->", current->name); while (current->next!= NULL) { current = (Node*) current->next; printf("%s->", current->name); printf("null\n"); Σημειώσεις Εργαστηρίου Δομών και Αλγορίθμων Week6-7 2 costis@teicrete.gr

H παρακάτω πρόχειρη εκδοχή της deletelist θα μπορούσε να χρησιμοποιηθεί εάν μετά την κλήση της μηδενίσουμε μόνοι μας τον δείκτη στην κεφαλή της λίστας. Αυτό δεν είναι δυνατόν να γίνει μέσα από την συνάρτηση επειδή ο απλός δείκτης στην κεφαλή της λίστας επιτρέπει την αλλαγή στη μεταβλητή στην οποία δείχνει, αλλά όχι την μετατροπή του ίδιου του δείκτη, ο οποίος περνάει σαν αντίγραφο στην συνάρτηση: void deletelist(node* current) { Node* tmp; if (current == NULL) printf("list is empty\n"); else while (current!= NULL) { tmp=current; free(current->name); // επειδή έχουμε πάρει δυναμικά τη μνήμη name current->next=null; free(current); current = (Node*) tmp->next; Απλοί Δείκτες Διπλοί Δείκτες Για να υλοποιήσουμε το παρακάτω παράδειγμα από το βιβλίο των Deitel, χρειαζόμαστε δείκτη σε δείκτη. Με αυτόν τον τρόπο μπορούμε να μηδενίσουμε τον δείκτη στην κεφαλή της λίστας μέσα από μία συνάρτηση. Αν χρησιμοποιήσουμε απλό δείκτη, τότε μπορούμε να τροποποιούμε το σημείο στο οποίο δείχνει ο δείκτης, αλλά όχι τον ίδιο τον δείκτη. Όπως γνωρίζουμε, χρησιμοποιώντας απλούς δείκτες μπορούμε να αλλάξουμε τα περιεχόμενα μέσα από την συνάρτηση swap: void swap(int*,int*); int main(int argc,char** argv) { int x,y; int *m, *n; x=5; y=9; m=&x; n=&y; printf("m %p\n", m); printf("swap\n"); swap(&x,&y); Σημειώσεις Εργαστηρίου Δομών και Αλγορίθμων Week6-7 3 costis@teicrete.gr

printf("m %p\n", m); printf("x %d\n", x); printf("y %d\n", y); void swap(int *a,int *b){ int tmp; tmp=*a; *a=*b; *b=tmp; Χρησιμοποιώντας διπλούς δείκτες μπορούμε να αλλάξουμε τους δείκτες μέσα από την συνάρτηση. void swap(int**,int**); int main(int argc,char** argv) { int x,y; int *m, *n; x=5; y=9; m=&x; n=&y; printf("m %p\n", m); printf("swap\n"); swap(&m,&n); printf("m %p\n", m); printf("x %d\n", x); printf("y %d\n", y); Σημειώσεις Εργαστηρίου Δομών και Αλγορίθμων Week6-7 4 costis@teicrete.gr

void swap(int **a,int **b){ int *tmp; tmp=*a; *a=*b; *b=tmp; Από το βιβλίο των Deitel, η λίστα αυτή ταξινομεί τους χαρακτήρες που εισάγει ο χρήστης και επιτρέπει την διαγραφή τους χρησιμοποιώντας συναρτήσεις. Διπλοί δείκτες περνάνε μόνο στις συναρτήσεις που αλλάζουν τον δείκτη στην κεφαλή της λίστας, για να μπορούν να αλλάξουν την διεύθυνση στην οποία δείχνουν σε περίπτωση προσθήκης νέου κόμβου ή διαγραφής του πρώτου κόμβου. /* * Deitel Simply Linked List Example */ #include <stdlib.h> struct listnode { char data; struct listnode *nextptr; ; typedef struct listnode ListNode; typedef ListNode* ListNodePtr; void insert(listnodeptr *sptr, char value); char delete(listnodeptr *sptr, char value); int isempty(listnodeptr sptr); void printlist(listnodeptr currentptr); void instructions(void); int main(int argc, char** argv) { ListNodePtr startptr = NULL; int choice; char item; instructions(); printf("? "); scanf("%d", &choice); while (choice!= 3) { switch (choice) { case 1: printf("enter a character: "); scanf("\n%c", &item); insert(&startptr, item); printlist(startptr); break; Σημειώσεις Εργαστηρίου Δομών και Αλγορίθμων Week6-7 5 costis@teicrete.gr

case 2: if (!isempty(startptr)) { printf("enter character to be deleted: "); scanf("\n%c", &item); if (delete(&startptr, item)) { printf("%c deleted.\n", item); printlist(startptr); else { printf("%c not found.\n\n", item); else { printf("list is empty.\n\n"); break; default: printf("invalid choice.\n\n"); instructions(); break; printf("? "); scanf("%d", &choice); printf("end of run.\n"); return (EXIT_SUCCESS); void instructions(void) { printf("enter your choice:\n" " 1 to insert an element into list.\n" " 2 to delete an element from the list.\n" " 3 to end.\n"); void insert(listnodeptr *sptr, char value) { ListNodePtr newptr, previousptr, currentptr; newptr = malloc(sizeof (ListNode)); if (newptr!= NULL) { newptr->data = value; newptr->nextptr = NULL; previousptr = NULL; currentptr = *sptr; while (currentptr!= NULL && value > currentptr->data) { previousptr = currentptr; currentptr = currentptr->nextptr; if (previousptr == NULL) { newptr->nextptr = *sptr; *sptr = newptr; else { previousptr->nextptr = newptr; newptr->nextptr = currentptr; Σημειώσεις Εργαστηρίου Δομών και Αλγορίθμων Week6-7 6 costis@teicrete.gr

else { printf("%c not inserted. No memory available.\n", value); char delete(listnodeptr *sptr, char value) { ListNodePtr previousptr, currentptr, tempptr; if (value == (*sptr)->data) { tempptr = *sptr; *sptr = (*sptr)->nextptr; free(tempptr); return value; else { previousptr = *sptr; currentptr = (*sptr)->nextptr; while (currentptr!= NULL && currentptr->data!= value) { previousptr = currentptr; currentptr = currentptr->nextptr; if (currentptr!= NULL) { tempptr = currentptr; previousptr->nextptr = currentptr->nextptr; free(tempptr); return value; return '\0'; int isempty(listnodeptr sptr) { return sptr == NULL; void printlist(listnodeptr currentptr) { if (currentptr == NULL) { printf("list is empty.\n\n"); else { printf("the list is:\n"); while (currentptr!= NULL) { printf("%c --> ", currentptr->data); currentptr = currentptr->nextptr; printf("null\n\n"); Σημειώσεις Εργαστηρίου Δομών και Αλγορίθμων Week6-7 7 costis@teicrete.gr