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

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

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

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

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

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

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

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

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

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

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

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

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

Υλοποίηση Λειτουργιών Στοίβας Απλά(1/2)

Ενότητα 2 Στοίβες Ουρές - Λίστες. ΗΥ240 - Παναγιώτα Φατούρου 1

Στοίβες Ουρές - Λίστες

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

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

ΕΠΛ 231 Δομές Δεδομένων και Αλγόριθμοι 4-1

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

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ. Δομές δεδομένων. Ενότητα 2η: Στοίβες Ουρές - Λίστες Παναγιώτα Φατούρου Τμήμα Επιστήμης Υπολογιστών

Ενότητα 2 Στοίβες Ουρές - Λίστες

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

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

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

IsEmptyList(L): επιστρέφει true αν L = < >, false

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

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

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

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

ΕΠΛ 231 οµές εδοµένων και Αλγόριθµοι Άννα Φιλίππου,

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

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

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

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

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

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

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

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

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

Ενότητες 3 & 4: Δένδρα, Σύνολα & Λεξικά Ασκήσεις και Λύσεις

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

Ενότητα 2 Στοίβες Ουρές - Λίστες

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

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

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

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

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

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

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

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

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

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

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αντικείμενα με πίνακες. Constructors. Υλοποίηση Στοίβας

Συλλογές, Στοίβες και Ουρές

ΕΝΟΤΗΤΑ 3 ΓΡΑΜΜΙΚΕΣ ΛΙΣΤΕΣ

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

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

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

Τύποι Δεδομένων και Απλές Δομές Δεδομένων. Παύλος Εφραιμίδης V1.0 ( )

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

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

Στοιχειώδεις Δομές Δεδομένων

ΗΥ240: Δοµές Δεδοµένων Εαρινό Εξάµηνο Ακαδηµαϊκό Έτος 2017 Διδάσκουσα: Παναγιώτα Φατούρου Προγραµµατιστική Εργασία - 1 ο Μέρος

ΗΥ240: Δομές Δεδομένων Εαρινό Εξάμηνο Ακαδημαϊκό Έτος 2018 Διδάσκουσα: Παναγιώτα Φατούρου Προγραμματιστική Εργασία - 1o Μέρος

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

Διάλεξη 08: Λίστες ΙΙ Κυκλικές Λίστες

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

ΗΥ240: Δομές Δεδομένων Εαρινό Εξάμηνο Ακαδημαϊκό Έτος 2018 Διδάσκουσα: Παναγιώτα Φατούρου Προγραμματιστική Εργασία - 2o Μέρος

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

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

Διάλεξη 08: Λίστες ΙΙ Κυκλικές Λίστες

Δομές Δεδομένων (Data Structures)

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

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

lab13grades Άσκηση 2 -Σωστά απελευθερώνετε ολόκληρη τη λίστα και την κεφαλή

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

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ. ΘΕΩΡΗΤΙΚΗ ΑΣΚΗΣΗ 2 ΛΥΣΕΙΣ Γραμμικές Δομές Δεδομένων, Ταξινόμηση

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

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

Διάλεξη 05: Αφηρημένοι Τύποι Δεδομένων

Αναδρομικοί Αλγόριθμοι

Αλγόριθμοι Ταξινόμησης Μέρος 1

ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 5. Αφηρημένοι Τύποι Δεδομένων / Στοίβες και Ουρές

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

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

Ιδιοκτησία Αντικειµένου

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

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

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

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

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

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

Οι λίστες, χάνοντας τα πλεονεκτήματα των πινάκων, λύνουν προβλήματα που παρουσιάζουν οι πίνακες

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

Διάλεξη 15: Αναδρομή (Recursion) Διδάσκων: Παναγιώτης Ανδρέου

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

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αντικείμενα με πίνακες. Constructors. Υλοποίηση Στοίβας

Διάλεξη 12: Δέντρα ΙΙ Δυαδικά Δέντρα

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

ΚΕΦΑΛΑΙΟ 8: Αφαίρεση δεδοµένων

Transcript:

Ενότητα 2: Στοίβες Ουρές - Λίστες Ασκήσεις και Λύσεις Άσκηση 1 Έστω ότι μια βιβλιοθήκη σας παρέχει πρόσβαση σε στοίβες ακεραίων. Η βιβλιοθήκη σας επιτρέπει να ορίσετε μια στοίβα και να καλέσετε τις 5 βασικές λειτουργίες σε αυτή. Για παράδειγμα, ο ορισμός μιας στοίβας (ή μιας ουράς) S1 γίνεται με τη δήλωση: Stack S1, ενώ υποστηρίζονται οι εξής λειτουργίες: void MakeEmptyStack(stack S) boolean IsEmptyStack(stack S) int Top(Stack S) int Pop(Stack S) void Push(Stack S, int x) Έστω ότι θέλετε να δημιουργήσετε ένα πρόγραμμα το οποίο απαιτεί επιπρόσθετα των παραπάνω λειτουργιών και την εκτέλεση της λειτουργίας PrintStack(Stack S), η οποία εκτυπώνει όλα τα στοιχεία της στοίβας S. Η εκτέλεση της PrintStack() δεν θα πρέπει να επηρεάζει τη μορφή της στοίβας (δηλαδή η στοίβα θα πρέπει να περιέχει τα ίδια στοιχεία και με την ίδια σειρά πριν και μετά την εκτέλεση της PrintStack()). Παρουσιάστε ψευδο-κώδικα που θα υλοποιεί την PrintStack(). Υπόδειξη: Επιτρέπεται να χρησιμοποιήσετε μια ή περισσότερες extra στοίβες προκειμένου να υλοποιήσετε τις παραπάνω λειτουργίες. Λύση void PrintStack(Stack S) { int element; Stack tmps; MakeEmptyStack(tmpS); // βοηθητική στοίβα while(!isemptystack(s)){ // Διατρέχουμε τη στοίβα S, εκτελώντας επαναληπτικά την Pop. // Τα στοιχεία που αφαιρούνται από την S τοποθετούνται στην tmps // για να μεταφερθούν και πάλι στην S μετά την περάτωση της εκτύπωσης element = Pop(S); // αφαίρεσε το επόμενο στοιχείο από την S Push(tmpS, element); // τοποθέτησέ το στην στοίβα tmps // τύπωσε το print(element); while (!IsEmptyStack(tmpS)) { element = Pop(tmpS); Push(S, element); // επαναφορά της S στην αρχική της μορφή // αφαίρεσε στοιχείο από την S // τοποθέτησέ το στην S, όπου και υπήρχε αρχικά

Άσκηση 2 Δίνεται η ακόλουθη υλοποίηση για αραιούς δυσδιάστατους πίνακες. O αραιός δισδιάστατος πίνακας Α[n][m] υλοποιείται με έναν boolean δυσδιάστατο πίνακα B[n][m] (κάθε στοιχείο του B έχει την τιμή 0 ή 1) και μια δυναμική συνδεδεμένη λίστα που περιέχει τα μη-μηδενικά στοιχεία του πίνακα Α. Για τον πίνακα Β ισχύουν τα ακόλουθα. Για κάθε i, j, με 0 i n, 1 j m, B[i][j] = 1 αν και μόνο αν Α[i][j] 0, και Β[i][j] = 0 αν και μόνο αν Α[i][j] = 0. Τα μη-μηδενικά στοιχεία στη λίστα αποθηκεύονται ως εξής: «τα μη-μηδενικά στοιχεία οποιασδήποτε γραμμής i είναι αποθηκευμένα στη λίστα πριν από τα μη-μηδενικά στοιχεία οποιαδήποτε γραμμής j > i και τα μη-μηδενικά στοιχεία οποιασδήποτε στήλης k απαντώνται στη λίστα πριν από τα μη-μηδενικά στοιχεία οποιασδήποτε στήλης m > k». Για παράδειγμα, δίνεται ο αραιός πίνακας Α: 0 7 0 0 0 1 2 0 0 3 0 0 4 0 0 12 0 0 0 0 Ο πίνακας Β που αντιστοιχεί στον Α είναι ο ακόλουθος: και η λίστα έχει την εξής μορφή: 0 1 0 0 0 1 1 0 0 1 0 0 1 0 0 1 0 0 0 0 7 1 2 3 4 12 Παρουσιάστε αλγόριθμο που θα υλοποιεί τη λειτουργία: int Access(int i, int j) η οποία επιστρέφει το στοιχείο στη γραμμή i και στη στήλη j του Α, δεδομένου ότι ο Α υλοποιείται όπως περιγράφτηκε παραπάνω. Λύση int Search(int i, int j){ int k,l; struct node *p; int cnt = 0; if (i > n OR i < 0 OR j > m OR j < 0) { error(); if (B[i][j]==0) return 0; // το στοιχείο προς πρόσβαση είναι 0 // το στοιχείο προς πρόσβαση είναι εκτός ορίων πίνακα

for (k = 0; k < i; k++) { // διατρέχουμε τις γραμμές 0 ως i του B for (l = 0; l < m; l++) // διατρέχουμε όλα τα στοιχεία κάθε τέτοιας γραμμής if (B[k][l] == 1) cnt++; // μετράμε πόσα μη-μηδενικά στοιχεία υπάρχουν σε αυτές τις γραμμές for (l = 0; l < j; l++){ if (B[i][l]) cnt++; // διατρέχουμε τη γραμμή i // και συναθροίζουμε στη cnt τα μη μηδενικά στοιχεία // που προηγούνται του στοιχείου j σε αυτή p = L; while (p!= NULL) { // διατρέχουμε τη λίστα L, στην οποία βρίσκονται τα μη-μηδενικά στοιχεία, // μέχρι να φτάσουμε στο (cnt+1)-οστό στοιχείο της L, // το οποίο αντιστοιχεί στο στοιχείο [i,j] που ζητείται if (cnt == 0) return p->data; p = p->next; cnt--; Άσκηση 3 Υλοποιήστε αλγόριθμο για την διαγραφή στοιχείου από μια ταξινομημένη λίστα. Λύση: Node * ListDelete(Node *L, int x) { Node *prev = NULL, *curr = L; // βοηθητικοί δείκτες while(curr!= NULL && curr->data < x){ // όσο δεν έχω διατρέξει όλη τη λίστα // και δεν έχω βρει το στοιχείο // αποθηκεύω δείκτη στο προηγούμενο στοιχείο πριν προχωρήσω τον curr // μετακινώ τον curr στο επόμενο στοιχείο της L prev=curr; curr=curr->next; if (curr == NULL curr->data > x) { // αν δεν υπάρχει το x στη λίστα printf("element x does not exist in L"); return L; if (prev == NULL) L = L->next; else prev->next = curr->next; return L; // το x είναι το πρώτο στοιχείο της L // αφαίρεσέ το μετακινώντας τον L στο επόμενο στοιχείο // το x δεν είναι το πρώτο στοιχείο της L // διαγραφή του x // επιστροφή (ενδεχόμενης) νέας τιμής του δείκτη L

Άσκηση 4 Να παρουσιαστεί υλοποίηση δύο στοιβών, τα στοιχεία των οποίων αποθηκεύονται στον ίδιο πίνακα Α[Ν] (τα στοιχεία του πίνακα είναι τα Α[0],..., Α[Ν-1]). Η υλοποίηση πρέπει να γίνει με τέτοιο τρόπο ώστε καμία στοίβα να μην υπερχειλίζει παρά μόνο αν το συνολικό πλήθος των στοιχείων και στις δύο στοίβες να ισούται με n. Όλες οι λειτουργίες στις στοίβες θα πρέπει να εκτελούνται σε χρόνο Θ(1). Λύση Έστω S0 και S1 οι δύο στοίβες. Έστω επίσης ότι τα στοιχεία Length[0] και Length[1] ενός πίνακα Length[] δύο θέσεων περιέχουν το μήκος των στοιβών S1 και S2, αντίστοιχα. Στην υλοποίηση που ακολουθεί, η S1 αυξάνει από αριστερά προς τα δεξιά, ενώ η S2 από δεξιά προς τα αριστερά. Κάθε μια από τις λειτουργίες, παίρνει ως παράμετρο μια ακέραια μεταβλητή which που υποδηλώνει σε ποια στοίβα θα πρέπει να εφαρμοστεί η λειτουργία. Συγκεκριμένα, όταν η which έχει την τιμή 0 (1) η λειτουργία πρέπει να εφαρμοστεί στην S0 (S1, αντίστοιχα). Απλή υλοποίηση (στην οποία οι πίνακες A[] και Length[] είναι καθολικές μεταβλητές). Type A[n]; int Length[2] = {0,0; void MakeEmptyStack(boolean which){ Length[which] = 0; boolean IsEmptyStack(boolean which){ if (Length[which] == 0) return 1; else return 0; Type Top(boolean which){ if (IsEmptyStack(which)) { else if (which==0) return A[Length[which] - 1]; // η S0 αναπτύσσεται από την αρχή του πίνακα προς το τέλος του else return A[N Length[which]]; // η S1 αναπτύσσεται από το τέλος του πίνακα προς της αρχή του // άρα το κορυφαίο στοιχείο της βρίσκεται στη θέση N Length[1] του Α Type Pop(boolean which) { Type x; if (Length[which] == 0) {

x=top(which); Length[which] = Length[which] - 1; // το αφαιρώ, μειώνοντας το μήκος της στοίβας κατά 1 return x; // αποθηκεύω στο x το κορυφαίο στοιχείο της στοίβας και void Push(Type x, boolean which) { if (Length[0] + Length[1] == N) { print( Stack is full ); Length[which] = Length[which] + 1; if (which == 0) A[Length[which] - 1] = x; else A[N - Length[which]] = x; Πιο πολύπλοκη υλοποίηση (στην οποία οι πίνακες A[] και Length[] είναι πεδία ενός struct). typedef struct stack{ int Length[2]; Type A[N]; STACK; pointer MakeEmptyStack(boolean which) { pointer S; int flag = 0; // βοηθητικός δείκτης if (flag == 0) { S=newcell(STACK); flag = 1; S->Length[which] = 0; return S; // η ανάθεση μνήμης πρέπει να γίνει μόνο μια φορά boolean IsEmptyStack(pointer S, boolean which){ if (S->Length[which] == 0) return 1; else return 0; Type Top(pointer S, boolean which){ if (IsEmptyStack(S, which)) { else if (which==0) return (S->A)[S->Length[which] - 1]; else return (S->A)[N S->Length[which]];

Type Pop(pointer S, boolean which){ Type x; if (S->Length[which] == 0) { x = Top(S, which); S->Length[which] = S->Length[which] - 1; return x; void Push(pointer S, Type x, boolean which){ if (S->Length[0] + S->Length[1] == N) { print( Stack is full ); S->Length[which] = S->Length[which] + 1; if (which == 0) (S->A)[S->Length[which] - 1] = x; else (S->A)[N S->Length[which]] = x; Άσκηση 3 Υλοποιήστε αναδρομικό αλγόριθμο για την εκτύπωση των στοιχείων μιας λίστας με ανάποδη σειρά. Λύση: void ListPrint(Node *L) { if (L == NULL) ListPrint(L->next); print(l->data) Ευχαριστίες // Αν φτάσαμε στο τέλος της λίστας // Καλώ αναδρομικά μέχρι να βρώ το τελευταίο στοιχείο //Εκτυπώνω τα στοιχεία της λίστας Ευχαριστούμε την πρώην βοηθό του μαθήματος Κατερίνα Τζομπανάκη για την παραγωγή της ηλεκτρονικής έκδοσης του παραπάνω υλικού.