ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΕΠΛ 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);