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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ΣΧΕΔΙΑΣΗ ΚΑΙ ΥΛΟΠΟΙΗΣΗ ΛΟΓΙΣΜΙΚΟΥ. p: i: 3 p: i: 5

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

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

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

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

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

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

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

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

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

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

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

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

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

Θεωρητικό Μέρος. 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); } }

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

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

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

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

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

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

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

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

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

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

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

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

είκτες και Πίνακες (2)

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

Να εκτυπωθούν οι πρώτες Ν σειρές του τριγώνου, χρησιµοποιώντας ένα πίνακα µεγέθους Ν στοιχείων (η Ν-οστή σειρά περιέχει Ν στοιχεία).

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

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

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

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

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

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

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

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

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

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

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

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

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

Η γλώσσα προγραμματισμού C Οι συναρτήσεις στη C (2)

Η γλώσσα προγραμματισμού C Οι συναρτήσεις στη C (2)

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

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

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

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

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

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

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

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

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

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

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

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

5. ΣΥΝΑΡΤΗΣΕΙΣ. (Πρόχειρο σχέδιο - Μαθήµατος 3) p Συναρτήσεις, που δεν επιστρέφουν κάποια τιµή

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

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

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

Transcript:

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΕΠΛ 35: οµές εδοµένων και Αλγόριθµοι για Ηλεκτρολόγους Μηχανικούς και Μηχανικούς Υπολογιστών Ακαδηµαϊκό έτος 21 211, Χειµερινό εξάµηνο Όλες οι ασκήσεις να δακτυλογραφηθούν στον υπολογιστή και να παραδοθούν σε έντυπη µορφή. ΕΡΓΑΣΙΑ 2 1/11/21 Ηµεροµηνία Παράδοσης: ευτέρα 14/11/21 ΘΕΜΑΤΙΚΕΣ ΕΝΟΤΗΤΕΣ: ΑΦΗΡΗΜΕΝΟΙ ΤΥΠΟΙ Ε ΟΜΕΝΩΝ, ΑΛΓΟΡΙΘΜΟΙ, ΣΥΜΒΟΛΟΣΕΙΡΕΣ, ΕΙΚΤΕΣ Άσκηση 1 (5 µονάδες) Θεωρήστε πως έχουµε µια ευθύγραµµη απλά συνδεδεµένη λίστα (µε δυναµική δέσµευση µνήµης) που περιέχει ακέραιους αριθµούς. Να υλοποιήσετε τις πιο κάτω συναρτήσεις: void insert(list *L, int x, int y) προσθέτει ένα καινούριο στοιχείο y µετά από το στοιχείο x. int maximum(list *L) αναζητά και επιστρέφει τον µεγαλύτερο αριθµό της λίστας. double average(list *L) υπολογίζει και επιστρέφει τον µέσο όρο των αριθµών της λίστας. void reverse(list *L) παίρνει ως παράµετρο εισόδου την ευθύγραµµη απλά συνδεδεµένη λίστα και την αντιστρέφει. ίνονται υλοποιηµένες οι ακόλουθες πράξεις και καλείστε να συµπληρώσετε τον κώδικα όπως ζητείται πιο πάνω. #include <stdio.h> typedef struct node{ int data; struct node *next; NODE; typedef struct{ int size; NODE *head; LIST;

int MakeEmptyList(LIST *L){ L->size = ; L->head = NULL; NODE *findpointer(list *L, int value) { if (p->data == value) { return p; return NULL; void print_list(list *L){ printf("node: %d \n", p->data); int main() { LIST DLL; MakeEmptyList(&DLL); printf("empty DLL created! \n"); insert(&dll,, 1); insert(&dll, 1, 2); insert(&dll, 2, 3); insert(&dll, 3, 4); insert(&dll, 4, 5); insert(&dll, 5, 6); print_list(&dll); int max = maximum(&dll); printf("maximum: %d \n", max); reverse(&dll); print_list(&dll); double avg = average(&dll); printf("average: %f \n", avg);

Λύση: #include <stdio.h> typedef struct node{ int data; struct node *next; NODE; typedef struct{ int size; NODE *head; LIST; int MakeEmptyList(LIST *L){ L->size = ; L->head = NULL; NODE *findpointer(list *L, int value) { if (p->data == value) { return p; return NULL; void insert(list *L, int x, int y) { NODE *r; r = findpointer(l,x); if (r == NULL){ printf("node not found! Adding after HEAD! \n"); p = (NODE *)malloc(sizeof(node)); p->data = y; p->next = NULL; else{ L->head = p; L->size++; p = (NODE *)malloc(sizeof(node)); p->data = y; p->next = r->next; r->next = p; L->size++; void print_list(list *L){ printf("node: %d \n", p->data);

int maximum(list *L){ int max = ; if (max < p->data){ max = p->data; else{ return max; double average(list *L){ double avg, sum, count =.; sum = sum + p->data; count = count + 1; avg = sum/count; return avg; void reverse(list *L){ NODE *p,*q,*r; p=(node *)malloc(sizeof(node)); q=(node *)malloc(sizeof(node)); r=(node *)malloc(sizeof(node)); p=l->head; q=p->next; p->next=null; while(q!=null){ r=q->next; q->next=p; p=q; q=r; L->head=p; int main() { LIST DLL; MakeEmptyList(&DLL); printf("empty DLL created! \n"); insert(&dll,, 1); insert(&dll, 1, 2); insert(&dll, 2, 3); insert(&dll, 3, 4);

insert(&dll, 4, 5); insert(&dll, 5, 6); print_list(&dll); int max = maximum(&dll); printf("maximum: %d \n", max); reverse(&dll); print_list(&dll); double avg = average(&dll); printf("average: %f \n", avg); Άσκηση 2 (5 µονάδες) Να υλοποιήσετε ένα πρόγραµµα το οποίο να δηµιουργεί µέσω της συνάρτησης main() ένα αραιό πίνακα (διαστάσεις: n x m). Οι διαστάσεις του πίνακα καθώς και οι τιµές πρέπει να δίνονται απευθείας από τον χρήστη. Να ορίσετε επίσης την κατάλληλη δοµή για την στοίβα καθώς και τις βασικές πράξεις της στοίβας. Στη συνέχεια να υλοποιήσετε µια συνάρτηση η οποία να δέχεται σαν παράµετρο τον αραιό πίνακα και να δηµιουργεί µια στοίβα (µε δυναµική δέσµευση µνήµης) η οποία περιέχει τις συντεταγµένες του κάθε µη µηδενικού στοιχείου και το ίδιο το στοιχείο. Να δοκιµάσετε το πρόγραµµα σας µε τον ακόλουθο αραιό πίνακα και να δώσετε το screenshot (όπως πιο κάτω) της εκτέλεσης του προγράµµατος σας στην απάντηση σας. i/j 1 2 3 5 1 2 6 2 3 1 3

ίνεται ο ακόλουθος κώδικας και καλείστε βάση αυτού να συµπληρώσετε τον κώδικα που χρειάζεται (στα κενά) όπως ζητείται πιο πάνω. #include <stdio.h> #define MAX 4 typedef struct node { NODE; typedef struct stack { STACK;

int MakeEmptyStack(STACK *S){ S->size = ; S->head = NULL; int IsEmptyStack(STACK *S){ return (S->head == NULL); void Push(int row, int col, int value, STACK *S){ void Pop(STACK *S){ void Top(STACK *S){ void pinakas_to_stoiva(int n, int m, int matrix[][max], STACK *S){

int main() { int i,j,value,n,m = ; STACK dynamiki_stoiva; MakeEmptyStack(&dynamiki_stoiva); Λύση: #include <stdio.h> #define MAX 4 typedef struct node { int row; int int struct node *next; NODE; col; value; typedef struct stack { NODE *head; int size; STACK; int MakeEmptyStack(STACK *S){ S->size = ; S->head = NULL; int IsEmptyStack(STACK *S){ return (S->head == NULL); void Push(int row, int col, int value, STACK *S){ // arxikopoioume deikti p pros ena struct node // kai kanoume allocate to anagkaio memory

p = (NODE *) malloc(sizeof(node)); // kanoume assign tin timi x pou ginete push sto pedio data p->row = row; // kanoume assign tin timi x pou ginete push sto pedio data p->col = col; // kanoume assign tin timi x pou ginete push sto pedio data p->value = value; // thetoume sto deikti next tin diefthinsi tou head pou tha alaksei p->next = S->head; // deiktis head na deixnei stin korifi tis stoivas (node p) S->head = p; // afksanoume to size tis stoivas kata 1 (S->size) ++; void Pop(STACK *S){ // elegxoume an einai adeia i stoiva prin aferaisoume if ((S->size) > ) // deiktis p na deixnei stin (diefthinsi) korifi tis stoivas p = S->head; // deiktis head tis stoivas na deixnei (diefthinsi) sto NODE tis stoivas pou // vriskete apo tin korifi S->head = p->next; // apodesmevoume tin mnimi pou anaferetai stin korifi tis stoivas pou //aferethike free(p); // meiwnoume to size tis stoivas kata 1 (S->size)--; void Top(STACK *S){ // elegxoume an einai adeia i stoiva prin typwsoume if (IsEmptyStack(S)) return; // typwnoume ti pliroforia data tis korifis printf("stack - (%d,%d): %d \n", (S->head)->row, (S->head)->col, (S- >head)->value); void pinakas_to_stoiva(int n, int m, int matrix[][max], STACK *S){ int i,j = ; for (i=; i<n; i++){ for (j=; j<m; j++){ if (matrix[i][j]!= ) Push(i, j, matrix[i][j], S); int main() { int i,j,value,n,m = ; STACK dynamiki_stoiva; MakeEmptyStack(&dynamiki_stoiva); printf("please enter number of rows: \n"); scanf("%d", &n);

printf("please enter number of cols: \n"); scanf("%d", &m); int matrix[n][m]; for (i=; i<n; i++){ for (j=; j<m; j++){ printf("\n Please enter the next value: "); scanf("%d", &value); matrix[i][j] = value; printf("matrix - (%d,%d): %d \n", i, j, matrix[i][j]); pinakas_to_stoiva(n, m, matrix, &dynamiki_stoiva);