AEM ΒΑΘΜΟΣ ΣΧΟΛΙΑ 1413. Σκέψου πώς θα µπορούσες να την 1417 κάνεις χωρίς χρήση της βοηθητικής µεταβλητής curr - Πρώτη άσκηση οκ - Στη δεύτερη άσκηση το free(head) δεν έπρεπε να είναι στο else, αλλά να εκτελείται πάντα µετά την 1420 κλήση στο clearlist(head->next). Αν το head είναι NULL, τότε η συνάρτηση απλά τερµατίζει. 1424 1426 1428 (δηλαδή το list είναι από την αρχή NULL), θα σου πετάξει segmentation fault στην προσπέλαση list->next. 1429 Έπρεπε να ελέγχεις το list, όχι το head->next σε εκείνο το σηµείο και στην περίπτωση που list==null να µην κάνεις τίποτα. - Στην άσκηση 1, το 0 έχει 1 ψηφίο οπότε έπρεπε να επιστρέφετε 1 στην πρώτη περίπτωση, κι όχι µηδέν. 1435 (δηλαδή το head είναι από την αρχή NULL), θα σου Έπρεπε να ελέγχεις το head, όχι το head->next σε εκείνο το σηµείο. (δηλαδή το head είναι από την αρχή NULL), θα 1440 Έπρεπε να ελέγχετε το head, όχι το head->next σε εκείνο το σηµείο. Επίσης, δε γίνεται ποτέ free η αρχική κεφαλή της λίστας, γιατί όταν καλείτε free(head), αυτό έχει ήδη 1442 FAIL γίνει head->next. Έπρεπε να χρησιµοποιήσετε µια βοηθητική µεταβλητή για να µη χάνετε την τιµή του head ή να µην το αλλάξετε καθόλου, απλά να περάσετε απευθείας το head->next στην αναδροµική κλήση - Στη δεύτερη άσκηση, χρησιµοποιείτε = αντί για == στη συνθήκη του if. Να προσέχετε τα warnings του compiler. Στη γραµµή 45 έπρεπε να εκτυπώνετε το head->num κι 1445 FAIL όχι το head. Επίσης, έπρεπε να έχετε το prototype της συνάρτησης πριν τη main. - Λάθος όνοµα φακέλου.. - Η άσκηση 2 δεν κάνει compile κι έχει σοβαρά λάθη. Page 1
1447 1449 1454 1456 1458 1459 FAIL 1460 1465 1467 1468 - Πρώτη άσκηση οκ, αλλά προσέξτε τη στοίχιση - Δεύτερη άσκηση οκ, αλλά προσέξτε τη στοίχιση. Σκεφτείτε πώς θα µπορούσατε να κάνετε τη δεύτερη άσκηση χωρίς να χρησιµοποιήσετε άλλη µεταβλητή (χωρίς την curr δηλαδή). - Στην πρώτη άσκηση, η συνάρτηση που γράψατε ΔΕΝ είναι αναδροµική. Μη χρησιµοποιείτε ποτέ static µεταβλητές σε "αναδροµικές" συναρτήσεις.. - Πρώτη άσκηση οκ, αλλά προσέξτε τη στοίχιση - Δεύτερη άσκηση οκ, αλλά προσέξτε τη στοίχιση. Σκεφτείτε πώς θα µπορούσατε να κάνετε τη δεύτερη άσκηση χωρίς να χρησιµοποιήσετε άλλη µεταβλητή (χωρίς την curr δηλαδή). - Άσκηση 1: Απαγορεύονται αυστηρά οι καθολικές µεταβλητές. Ο τρόπος που χρησιµοποιείς την psifia αναιρεί την αναδροµή. - Άσκηση 2: Καλείς την clearlist µε παράµετρο runner την οποία όµως έχεις ήδη κάνει free. Έπρεπε να την καλείς µε παράµετρο head... (δηλαδή το list είναι από την αρχή NULL), θα σου πετάξει segmentation fault στην προσπέλαση list->next. Έπρεπε να ελέγχεις το list, όχι το head->next σε εκείνο το σηµείο και στην περίπτωση που list==null να µην κάνεις τίποτα. Page 2
1470 1484 1485 FAIL 1486 1487 1489 1490 1493 1497 1498 1502. - Στην άσκηση 2, αν η λίστα είναι άδεια (δηλαδή. γι' αυτό πριν προσπελάσεις το root->next - Στην πρώτη άσκηση, η συνάρτησή σου επιστρέφει 0 όταν η παράµετρος είναι 10, ενώ έπρεπε να επιστρέφει 2. - Στη δεύτερη άσκηση η συνάρτηση δεν είναι αναδροµική (και το πρόγραµµα τερµατίζει µε segmentation fault) - Στη δεύτερη άσκηση κάνετε περισσότερα free από όσα πρέπει και "πηδάτε" κόµβους µε τα συνεχή next. Φαίνεται να έχετε τη βασική ιδέα αλλά την έχετε υλοποιήσει λάθος. Σωστά υπολογίζετε το curr, αλλά µετά πρέπει απλά να καλείτε τη συνάρτηση αναδροµικά µε παράµετρο το curr. Μόνο το head πρέπει να κάνετε free, κι όχι το curr->next.. γι' αυτό πριν προσπελάσεις το cur->next., αλλά την κάνατε µε κάπως πολύπλοκο τρόπο. Προσπαθήστε να την ξανακάνετε χωρίς να χρησιµοποιήσετε και την r και την counter, αλλά µόνο µία από αυτές (ή και καµία από τις δύο - δεν είναι απαραίτητες). - Άσκηση 2: warning στη γραµµή 43. Η συνάρτηση έχει void return type, οπότε γιατί βάλετε return 1? Κατά τα άλλα οκ. - Να προσέχετε τη στοίχιση - η αρχική άσκηση που στείλατε δεν ήταν καλά στοιχισµένη. Page 3
1503 1504 1505 1506 1508 FAIL 1510 1519 1524 1531 1532, αλλά την κάνατε µε κάπως πολύπλοκο τρόπο. Προσπαθήστε να την ξανακάνετε χωρίς να χρησιµοποιήσετε και την r και την counter, αλλά µόνο µία από αυτές (ή και καµία από τις δύο - δεν είναι απαραίτητες). - Άσκηση 2: warning στη γραµµή 43. Η συνάρτηση έχει void return type, οπότε γιατί βάλετε return 1? Κατά τα άλλα οκ. - Να προσέχετε τη στοίχιση - η αρχική άσκηση που στείλατε δεν ήταν καλά στοιχισµένη. - Πρώτη άσκηση οκ - Στη δεύτερη άσκηση το free(head) δεν έπρεπε να είναι στο else, αλλά να εκτελείται πάντα µετά την κλήση στο clearlist(head->next). Αν το head είναι NULL, τότε η συνάρτηση απλά τερµατίζει. - Ο έλεγχος if (head!= NULL) στην άσκηση 2 είναι περιττός. Αν ο πρώτος έλεγχος (head==null) είναι ψευδής, τότε προφανώς θα µπούµε στο else. - Ο έλεγχος if (head!= NULL) στην άσκηση 2 είναι περιττός. Αν ο πρώτος έλεγχος (head==null) είναι ψευδής, τότε προφανώς θα µπούµε στο else. - Στη δεύτερη άσκηση, χρησιµοποιείτε = αντί για == στη συνθήκη του if. Να προσέχετε τα warnings του compiler. Στη γραµµή 45 έπρεπε να εκτυπώνετε το head->num κι όχι το head. Επίσης, έπρεπε να έχετε το prototype της συνάρτησης πριν τη main.. γι' αυτό πριν προσπελάσεις το root->next 1511 FAIL Δεν εστάλη άσκηση 1514. 1516 1517 Page 4
1533. 1534 FAIL Δεν εστάλη άσκηση 1537 1539 1547 FAIL 1550 - Στην πρώτη άσκηση, η συνάρτηση που γράψατε ΔΕΝ είναι αναδροµική. Μη χρησιµοποιείτε ποτέ static µεταβλητές σε "αναδροµικές" συναρτήσεις. (δηλαδή το head είναι από την αρχή NULL), θα Έπρεπε να ελέγχετε το head, όχι το head->next σε εκείνο το σηµείο. Επίσης, δε γίνεται ποτέ free η αρχική κεφαλή της λίστας, γιατί όταν καλείτε free(head), αυτό έχει ήδη γίνει head->next. Έπρεπε να χρησιµοποιήσετε µια βοηθητική µεταβλητή για να µη χάνετε την τιµή του head ή να µην το αλλάξετε καθόλου, απλά να περάσετε απευθείας το head->next στην αναδροµική κλήση - Στη δεύτερη άσκηση κάνετε περισσότερα free από όσα πρέπει και "πηδάτε" κόµβους µε τα συνεχή next. Φαίνεται να έχετε τη βασική ιδέα αλλά την έχετε υλοποιήσει λάθος. Σωστά υπολογίζετε το curr, αλλά µετά πρέπει απλά να καλείτε τη συνάρτηση αναδροµικά µε παράµετρο το curr. Μόνο το head πρέπει να κάνετε free, κι όχι το curr->next. - Άσκηση 1: Απαγορεύονται αυστηρά οι καθολικές µεταβλητές. Ο τρόπος που χρησιµοποιείτε την psifia αναιρεί την αναδροµή. - Άσκηση 2: Καλείτε την clearlist µε παράµετρο runner την οποία όµως έχετε ήδη κάνει free. Έπρεπε να την καλείτε µε παράµετρο head. - Στην άσκηση 1, το 0 έχει 1 ψηφίο οπότε έπρεπε να επιστρέφετε 1 στην πρώτη περίπτωση, κι όχι µηδέν. Page 5