- Το πρόγραµµα σας δίνει τα αναµενόµενα αποτελέσµατα.

Σχετικά έγγραφα
Sheet2. Σωστή, και µπράβο που µεριµνήσατε για λίστες διαφορετικών µεγεθών.

403 FAIL Λάθος στο πακετάρισµα του αρχείου.

Στην clearlist: - Όλα ok. οριακό PASS

FAIL PASS PASS οριακά

Sheet2. - Άσκηση 1 οκ - Άσκηση 2 οκ. Σκέψου πώς θα µπορούσες να την

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

Δείτε τώρα και πώς θα έπρεπε να ήταν το παραπάνω: Page 1

Sheet2 Α.Μ FAIL. οριακό PASS. - Έπρεπε να χρησιµοποιήσετε συναρτήσεις από τη string.h

ΑΕΜ ΒΑΘΜΟΣ ΣΧΟΛΙΑ. 812 PASS Καλή δουλειά

-Δεν έχεις σχόλια, καλό θα ήταν να έχεις πιο περιγραφικό σχόλιο στην αρχή

Sheet1_2. - Δεν απελευθερώνεις τη δυναµικά δεσµευµένη µνήµη. - Η έξοδος του προγράµµατός σου δεν είναι ακριβώς όπως ζητούσε η άσκηση.

lab13grades 449 PASS 451 PASS PASS FAIL 1900 FAIL Page 1

Sheet1_2 FAIL. - To πρόγραµµα δεν κάνει compile Δεν παρέδωσε FAIL

Βαθμός Σχόλια. lab6 PASS PASS. - Πολύ καλή δουλειά, αλλά προσπάθησε να κάνεις την άσκηση χρησιµοποιώντας συναρτήσεις από το string.

lab10grades - Το αποτέλεσµα της τοµής θα έπρεπε να εµφανίζετε µέσα σε εισαγωγικά "Helo".

Βαθμός Σχόλια. lab8. οριακά PASS 1194 PASS

lab7 PASS -Δεν έχεις καθόλου σχόλια! Διάβασε το φυλλάδιο. PASS -Πολύ καλή εργασία µε σωστά και επεξηγηµατικά σχόλια. -Πρόσεξε την στοίχισή σου!

Βαθμός Σχόλια. lab5 PASS PASS PASS PASS PASS. Οριακά PASS - Καλή δουλειά

- Ο τελευταίος έλεγχος στη συνάρτηση είναι περιττός. Αν έχει φτάσει µέχρι εκεί το πρόγραµµα, τότε αναγκαστικά το µήκος είναι >= του PASSWD_MIN_LEN.

ΣΕΤ ΑΣΚΗΣΕΩΝ 3. Προθεσµία: 7/1/2014, 22:00

Βαθμός Σχόλια. lab PASS 1194 PASS 1238 PASS 1239 PASS

οριακό PASS 402 PASS Πολύ σωστά, µπράβο οριακό PASS

ΣΕΤ ΑΣΚΗΣΕΩΝ 4. Προθεσµία: 22/12/2016, 21:00

Α.Μ. ΒΑΘΜΟΣ ΣΧΟΛΙΑ 321 FAIL

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

Διάλεξη 13η: Δυναμική Διαχείρηση Μνήμης, μέρος 1

lab11 - Να εκτυπώνεις πιο κατατοπιστικά µηνύµατα λάθους. Αν είναι όλα ίδια, δεν είναι ξεκάθαρο ποιο αρχείο έχει πρόβληµα.

Μ.Σ. lab12grades FAIL. η συνθήκη για έξοδο είναι και αυτή σωστή. Οριακό PASS. στα string. - σωστή και η κλήση της συνάρτησης.

Διαδικασιακός Προγραμματισμός

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

ΣΕΤ ΑΣΚΗΣΕΩΝ 4. Προθεσµία: 13/1/13, 22:00

lab9grades Άσκηση 1 - Σωστοί τύποι (παραµέτρων και επιστρεφόµενης τιµής) της series_cosh.

Sheet PASS 1426 PASS 1428 PASS. Page 1

Παράδοση άσκησης: Εστάλη με καθυστέρηση. Να μην επαναληφθεί Προσέξτε τις νέες οδηγίες για την ονομασία του φακέλου.

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

ΣΕΤ ΑΣΚΗΣΕΩΝ 4. Προθεσμία: 17/1/14, 22:00

to post PASS PASS FAIL

ΣΕΤ ΑΣΚΗΣΕΩΝ 4. Προθεσµία: 8/1/12, 22:00

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

ΕΡΓΑΣΤΗΡΙΟ 9: Συμβολοσειρές και Ορίσματα Γραμμής Εντολής

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

lab6grades ΑΕΜ ΒΑΘΜΟΣ ΣΧΟΛΙΑ Διαδικαστικά: Όλα οκ.

lab2 -Στην printf να βάζεις \n έτσι ώστε να αλλάζει γραµµή όποτε σου εµφανίζει κάποιο µήνυµα.

ΠΡΟΗΓΜΕΝΟΙ ΜΙΚΡΟΕΠΕΞΕΡΓΑΣΤΕΣ PROJECT 2: MEMORY MANAGEMENT

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

ΣΕΤ ΑΣΚΗΣΕΩΝ 3. Προθεσµία: 18/12/12, 22:00

lab9grades -Έπρεπε να χρησιµοποιήσεις την sprintf για το formatting των strings.

lab14grades ΑΕΜ ΒΑΘΜΟΣ ΣΧΟΛΙΑ

Τα ονόµατα των φακέλων πρέπει να έχουν το επίθετά σας και όχι τα username που χρησιµοποιείτε στα εργαστήρια.

Sheet1_2. - Δεν υπάρχουν σχόλια συναρτήσεων - Να χρησιµοποιείς πιο περιγραφικά ονόµατα µεταβλητών (και σίγουρα όχι απλούς χαρακτήρες όπως c, d) Page 1

lab7grades ΑΕΜ ΒΑΘΜΟΣ ΣΧΟΛΙΑ

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

lab10grades Άσκηση 2η: - Δεν κάνει compile: Δείτε την λύση και ξανα προσπαθήστε τα υπόλοιπα στο σπίτι.

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

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

Α.Μ. ΒΑΘΜΟΣ ΣΧΟΛΙΑ. οριακό PASS

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

ΕΡΓΑΣΤΗΡΙΟ 8: Πολυδιάστατοι Πίνακες και Δυναμική Δέσμευση Μνήμης

- Σωστή χρήση του προσδιοριστή const για την σταθερά pi. Καλό θα ήταν επιλέξετε κεφαλαία γράµµατα για το όνοµα της σταθεράς.

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

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

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

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

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

ΕΡΓΑΣΤΗΡΙΟ 9: Συμβολοσειρές και Ορίσματα Γραμμής Εντολής

lab7grades -Σωστή χρήση της sprintf -Σωστά ανιχνεύετε τον χαρακτήρα που πρέπει να αφαιρέσετε. -Σωστή µεταφορά στοιχείων µια θέση αριστερά.

Βαθμός Σχόλιο. lab3_grades

char name[5]; /* define a string of characters */

Κεφάλαιο Αλφαριθµητικές Σειρές Χαρακτήρων (Strings)

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Μαθήματα από τα εργαστήρια

ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΙΑΣ ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ

lab6grades - Δεν έχετε δηλώσει το βαθµό βάσης ως σταθερά. - Το µήνυµα εισόδου θέλει χαρακτήρα κενού ' ' στο τέλος και όχι TAB '\t'.

Σημειωματάριο Τετάρτης 18 Οκτ. 2017

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Αναφορές

lab2grades - Στη scanf υπολογίζετε τουλάχιστον 5 χαρακτήρες %5.2f προδιαγραφές που ζητούνται στην εκφώνηση. -

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

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

Οι δείκτες στη γλώσσα C

ΤΜΗΜΑ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ ΚΑΙ ΜΗΧΑΝΙΚΩΝ Η/Υ, ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΙΑΣ

Δεν έστειλες την άσκηση 1, και αυτό που έστειλες ήταν σκέτο αρχείο, όχι το tgz που ζητούσε η εκφώνηση.

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

Πως θα αποθηκεύσει τη λίστα με τα ψώνια του και θα την ανακτήσει στο Σ/Μ; και πως θα προσθέσει στη λίστα του επιπλέον προϊόντα;

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

Άσκηση 2: -Δεν παραδόθηκε. Το εµαιλ είχε λάθος θέµα. Έπρεπε να είναι CE120 lab6

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

lab5 -Ο κώδικάς σου είναι σωστός αλλά από εδώ και στο εξής προσπάθησε να βάζεις σχόλια στην µορφή που ζητάει το φυλλάδιο

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

ΣΕΤ ΑΣΚΗΣΕΩΝ 3. Προθεσµία: 5/12/10, 23:59

Κεφάλαιο Αλφαριθμητικές Σειρές Χαρακτήρων (Strings) (Διάλεξη 20) 1) Strings στη C

Εντολές της LOGO (MicroWorlds Pro)

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

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

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

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

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αντικείμενα ως ορίσματα Εισαγωγή στις αναφορές

Εισαγωγή στον Προγραµµατισµό «C»

Εισαγωγή στον δομημένο προγραμματισμό

2 Ορισμός Κλάσεων. Παράδειγμα: Μηχανή για Εισιτήρια. Δομή μιας Κλάσης. Ο Σκελετός της Κλάσης για τη Μηχανή. Ορισμός Πεδίων 4/3/2008

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

ΑΣΚΗΣΗ 5: ΠΙΝΑΚΕΣ. Σχήµα 1: H έννοια των πινάκων

Transcript:

Α.Μ. ΒΑΘΜΟΣ ΣΧΟΛΙΑ 1349 FAIL Δεν ελήφθη άσκηση 1482 1556 1559 1562 1563 1565 1566 FAIL - Στην initialize πρέπει να κάνετε έλεγχο αν η malloc αποτυγχάνει για κάθε κλήση της, άρα και για δέσµευση χώρου για το name - Μάλιστα, σε περίπτωση αποτυχίας δέσµευσης χώρου για το name πρέπει να κάνετε clear και το someone - Η clear δεν είναι σωστή. Τρέχει µόνο για την πρώτη επανάληψη και µετά, αφού to κάνετε free, ο έλεγχος της while δεν βγάζει νόηµα. - Η clone πρέπει να κατασκευάζει ένα ακριβές αντίγραφο του κόµβου που παίρνει ως παράµετρο. Kάνοντας nnode->name = someone->name; βάζετε το nnode-name να δείχνει στο name του someone και δεν δεσµεύετε χώρο στο κλόνο για το name(αντιγράφοντάς το κιόλας). - Στην initialize η υλοποίηση είναι σωστή - Πολύ σωστά δεσµεύετε χώρο για το name, υπολογίζετε χώρο και για το \0 στο τέλος του αλφαριθµητικού - Η clone είναι πολύ σωστή - Μπορείτε βέβαια να καλείτε την clear για αποδέσµευση των δεικτών µετά από αποτυχία της malloc - Η clear δουλεύει σωστά για έναν κόµβο, σε περίπτωση κεφαλής λίστας όµως, θέλουµε να κάνει free όλους τους κόµβους της λίστας. - Το loop στην clear (στα σχόλια) είναι λάθος γιατί δεν ανανεώνει το runner. -Στη malloc για το ονοµα έχετε υπολογίσει σωστά χώρο και για το '\0', αλλά δεν ελέγχετε αν επιστρέφει NULL. -Στην αποτυχία κάποιας malloc, έπρεπε να καλείτε την killgremlins ώστε να απελευθερώνεται η µνήµη όλης της λίστας, και όχι να κάνετε απλά free. Επίσης ότι εντολές βάζετε µετά τη return απλά δεν εκτελούνται. - Συνάρτηση clone: ln 104. Αν δε µπορεί να δεσµευτεί χώρος καλείτε ορθά την clear. Όµως ξανακαλέιτε την clear µέσα στη main, κάτι που είναι λάθος. Η clear πρέπει να καλείται µία φορά. - Οµοίως στη ln 112, θα έπρεπε να κληθεί η clear. - Συνάρτηση initialize: ΟΚ - Καλύτερα αντί για define στο µέγεθος του ονόµατος να είχατε κάνει ακριβώς δέσµευση όσου χώρου χρειαζότανε. - Το πρόγραµµα σου δε δίνει ακριβώς τα αναµενόµενα αποτελέσµατα. Εµφανίζει στο τέλος κάτι για το οποίο ευθύνεται η memcpy. - Σας το λέµε συνεχώς να βάζετε αρχικό σχόλιο. - Έπρεπε να δηµιουργείς και το name δυναµικά, και µετά να το αντιγράφεις µε strcpy και όχι µε απλή ανάθεση τιµής. - Όταν κάνεις έλεγχο για τη αποτυχία δέσµευσης µνήµης να βάζεις και κανένα σχόλιο. - Η συνάρτηση killgremlins δεν είναι εντελώς σωστή. Επίσης θα έπρεπε να κάνεις free και το name εκεί. - Πολύ pass. - Σε κάθε έλεγχο που κάνετε για αποτυχία δέσµευσης µνήµης θα έπρεπε να καλείτε την killgremlins. - Η συνάρτηση killgremlins δεν είναι εντελώς σωστή. Κάνετε free τοhold (το οποίο µόλις έχετε κάνει ίδιο µε το curr) κι αµέσως µετά γίνεται η πράξη curr = curr->next. Η προσπέλαση curr->next είναι λάθος, γιατί το curr έχει ήδη γίνει free. Στείλατε το lab11.c χωρίς καµµία αλλαγή - προσθήκη δικού σας κώδικα..

1567 - Συνάρτηση clone: ln 86, εφόσον δε µπόρεσε να δεσµευτεί χώρος για την duplicate δε µπορείτε να κάνετε free τη duplicate! Πρέπει να αποδεσµεύσετε όλους τους κόµβους που έχουν δεσµευτεί µέχρι στιγµής. Θα µπορούσατε να καλέσετε τη συνάρτηση clear για να το πετύχετε αυτό. - Συνάρτηση initialize: Για να γράψετε το name, θα έπρεπε να κάνετε malloc και strcpy. Κατά τα άλλα όκ. Για το πεδίο name του struct τα ίδια θα έπρεπε να κάνετε και στη συνάρτηση clone. 1570 1571 1573 1574 1577 1579 - Στην initialize η υλοποίηση της είναι αρκετά σωστή. - Πολύ σωστά δεσµεύετε χώρο για το name, υπολογίζετε χώρο και για το \0 στο τέλος του αλφαριθµητικού. - Η clone είναι πολύ σωστή. - Σωστή η χρήση της clear για αποδέσµευση των δεικτών µετά από αποτυχία της malloc, απλά θα έπρεπε να κάνετε και στη συνάρτηση initialize στον έλεγχο clear. - Η clear είναι σωστή. - Μη ξεχνάτε το αρχικό σχόλιο!!! - Μνήµη πρέπει να δεσµεύετε µόνο όταν χρειάζεται. Για παράδειγµα, στην killgremlins το curr και το last πρόκειται να χρησιµοποιηθούν για να δείξουν σε ήδη υπάρχουσα µνήµη, οπότε είναι λάθος να δεσµεύσετε κάτι για αυτά. Δεν πρόκειται να αποθηκευτεί κάτι καινούργιο σε αυτή τη µνήµη που δεσµεύετε. Επιπλέον, µε το να κάνετε curr=first αργότερα, "χάνετε" πρόσβαση στη µνήµη που δεσµεύσατε (και το πρόγραµµά σας έχει memory leak). - Σε κάθε έλεγχο που κάνετε για αποτυχία δέσµευσης µνήµης έπρεπε να καλείτε την killgremlins, δηλαδή και για το name. name επίσης. Επιπλέον, κάνετε free το last (το οποίο µόλις έχετε κάνει ίδιο µε το curr) κι αµέσως µετά γίνεται η πράξη curr = curr->next. Η προσπέλαση curr->next είναι λάθος, γιατί το curr έχει ήδη γίνει free. - Στην malloc που κάνετε για το name, θα έπρεπε να δεσµεύετε και χώρο για Επειδή είναι string έπρεπε να χρησιµοποιείτε την strcpy και όχι απλή ανάθεση τιµής. - Να βάζετε πιο περιγραφικό σχόλιο. name. - Συνάρτηση clone: Θα έπρεπε να ελεγχεί η δέσµευση χώρου και µετά τη malloc για το node->name. Επίσης αφού αποδεσµευτεί ο χώρος πρέπει η συνάρτηση να κάνει κάποιο return, γιατί αλλιώς προσπαθεί να γράψει σε µεταβλητές που έχει κάνει free. - Συνάρτηση initialize: Για το newnode->name έπρεπε να γίνει malloc ακριβώς τόσου χώρου όσο το όνοµα, έλεγχος για δέσµευση µνήµης και strcpy. - Στην initialize η υλοποίηση είναι σωστή - Πολύ σωστά δεσµεύετε χώρο για το name, υπολογίζετε χώρο και για το \0 στο τέλος του αλφαριθµητικού - Η clone είναι πολύ σωστή - Μπορείτε βέβαια να καλείτε την clear για αποδέσµευση των δεικτών µετά από αποτυχία της malloc - Η clear δουλεύει σωστά για έναν κόµβο, σε περίπτωση κεφαλής λίστας όµως, θέλουµε να κάνει free όλους τους κόµβους της λίστας. - Το loop στην clear (στα σχόλια) είναι λάθος γιατί δεν ανανεώνει το runner. name.

1581 1582 1587 - Σε κάθε έλεγχο που κάνετε για αποτυχία δέσµευσης µνήµης θα έπρεπε να καλείτε την killgremlins. - Η συνάρτηση killgremlins δεν είναι εντελώς σωστή. Κάνετε free τοhold (το οποίο µόλις έχετε κάνει ίδιο µε το curr) κι αµέσως µετά γίνεται η πράξη curr = curr->next. Η προσπέλαση curr->next είναι λάθος, γιατί το curr έχει ήδη γίνει free. - Συνάρτηση clear: Πριν τη γραµµή 52 (free(temp)) θα έπρεπε να κάνετε και free(temp->name). - Συνάρτηση clone: Αν δε µπορεί να δεσµευτέι χώρος, θα έπρεπε να καλέσετε την clear µε κατάλληλη παράµετρο για να αποδεσµεύσετε ότι χώρο έχει δεσµευτεί µέχρι στιγµής. Μετά τη malloc για το curr->name θα έπρεπε να βάλλετε έλεγχο για το αν έγινε σωστά η δέσµευση. - Συνάρτηση initialize: Οµόιως για τη δέσµευση του stoixeia->name. -Δεν έχετε σχόλιο στην αρχή. -Στον έλεγχο αν πέτυχε η malloc έπρεπε να καλείτε την killgremlins αν υπάρχει κάποιο πρόβληµα και όχι να κάνετε απλά free. -Στην killgremlins έχετε first = first->next; και µετά free(first). Έπρεπε να είχατε ακόµα µία µεταβλητή που να κράταγε τον επόµενο κόµβο και να κάνετε free αυτή που κρατά τον τωρινό κόµβο. 1589 FAIL 1590 1591 FAIL 1595 Το πρόγραµµα δεν κάνει compile -Κάθε φορά που κάνετε έλεγχο αν απέτυχε η malloc έπρεπε να καλείτε την killgremlins και όχι να επιστρέφετε NULL. - Το πρόγραµµα σας δε δίνει τα αναµενόµενα αποτελέσµατα. Αυτό που έπρεπε να δίνει είναι ένας κάτω τριγωνικός πίνακας στην ουσία. Το λάθος είναι στον τρόπο που "κολάτε" το νέο κόµβο στο someone. Θέτετε το someone (δηλαδή την κεφαλή της λίστας) να είναι ίσο µε το νέο κόµβο που φτιάξατε και επιστρέφετε αυτό. Ως αποτέλεσµα, η υπόλοιπη λίστα χάνεται. Επιπλέον, στη main δεν αποθηκεύετε πουθενά το αποτέλεσµα που επιστρέφει η clone. - Σωστή η δέσµευση και για το \0. - Καλό είναι για την κάθε malloc να κάνετε τον δικό της έλεγχο, σε περίπτωση αποτυχίας να ξέρουµε δηλαδή ποιο ευθύνεται. Αν η malloc επιστρέψει NULL, τότε πρέπει να τερµατίζει η συνάρτηση, γιατί αν συνεχίσει θα πετάξει segfault. - Μέσα στον έλεγχο για τη αποτυχία δέσµευσης µνήµης έπρεπε να καλείτε και την clear. - Η σύνταξη της clear δεν είναι εντελώς σωστή. Η συνθήκη έπρεπε να έχει!= αντί για == - Αυξάνετε το someone->age κάθε φορά ενώ δε θα έπρεπε. - Προσέξτε λίγο τη στοίχιση σας! - Συνάρτηση clear: Πριν τη γραµµή 52 (free(temp)) θα έπρεπε να κάνετε και free(temp->name). - Συνάρτηση clone: Αν δε µπορεί να δεσµευτέι χώρος, θα έπρεπε να καλέσετε την clear µε κατάλληλη παράµετρο για να αποδεσµεύσετε ότι χώρο έχει δεσµευτεί µέχρι στιγµής. Μετά τη malloc για το curr->name θα έπρεπε να βάλλετε έλεγχο για το αν έγινε σωστά η δέσµευση. - Συνάρτηση initialize: Οµόιως για τη δέσµευση του stoixeia->name.

1596 1598 1601 FAIL 1602 1604 1607 1608 1609 -Η initialize είναι σωστή, αλλά θα έπρεπε να ελέγχετε το αποτέλεσµα της malloc για τον κόµβο. Επίσης σωστά υπολογίσατε το '\0' για το όνοµα. -Στην clone επρεπε να ελέγχεται και τη malloc για το όνοµα. -Σε περίπτωση αποτυχίας δέσµευσης µνήµης, έπρεπε να καλείτε την clear και όχι να κάνετε free(komvos); -Δεν καλείτε πουθενά την clear και επίσης δεν είναι σωστά υλοποιηµένη. -Κάθε φορά που κάνετε έλεγχο αν απέτυχε η malloc έπρεπε να καλείτε την killgremlins και όχι να επιστρέφετε NULL. Το πρόγραµµα δεν κάνει compile - Στην initialize η υλοποίηση είναι σωστή - Και η συνάρτηση clone είναι σωστή - Μπορείτε βέβαια να καλείτε την clear για αποδέσµευση των δεικτών µετά από αποτυχία της malloc - Στην clear δεν λαµβάνετε µέριµνα για την περίπτωση που η λίστα έχει µόνο ένα στοιχείο, οπότε δεν θα µπούµε ποτέ στην for. - Όταν γράφουµε "Adam" το \0 περιλαµβάνεται ήδη. Δε χρειάζεται να το ξαναβάλετε κάπου. -Στη malloc για το ονοµα έχετε βάλει καρφωτά ότι το όνοµα έχει µέγεθος 10. Θα έπρεπε να είναι strlen(table[i].name) + 1 (για το '\0'). Επίσης δεν ελέγχετε εάν επιστρέφει NULL. -Στην αποτυχία κάποιας malloc, έπρεπε να καλείτε την killgremlins ώστε να απελευθερώνεται η µνήµη όλης της λίστας, και όχι να κάνετε free(curr). -Περισσότερη προσοχή στη στοίχιση. - Η άσκηση µπορεί να µην περιέχει errors ή warnings αλλά κάνετε 1 σοβαρό λάθος. - Αυτό που κάνατε µε την p στην initialize είναι µεν σωστό για τα συγκεκριµένα δεδοµένα, αλλά πολύ επικίνδυνο (η p είναι τοπική µεταβλητή) οπότε να το προσέχετε. - Στο ίδιο σηµείο, ο δείκτης next του struct θα έπρεπε να έχει τιµή NULL. - Για να γράψετε το Adam θα έπρεπε να είχατε δεσµεύσει χώρο. - H clone είναι σε γενικές γραµµές οκ. Οµοίως και η clear. - Σε κάθε έλεγχο που κάνετε για αποτυχία δέσµευσης µνήµης έπρεπε να καλείτε την killgremlins. - Στη συνάρτηση killgremlins δεν κάνετε τον κάθε κόµβο free µόνο τον αρχικό. Άσκηση 2: - Στην επανάληψη που ψάχνετε τη σωστή θέση έπρεπε απλά να "προχωράτε" µια θέση πιο πέρα το node και το prev. Μετά, βγαίνοντας από το loop, τσεκάρετε αν βγήκατε επειδή τέλειωσε η λίστα (curr == NULL) ή επειδή βρήκατε κόµβο µε µεγαλύτερο όνοµα, και τότε κάνετε την εισαγωγή του νέου κόµβου. - Η άσκηση µπορεί να µην περιέχει errors ή warnings αλλά κάνετε 1 σοβαρό λάθος. - Αυτό που κάνατε µε την p στην initialize είναι µεν σωστό για τα συγκεκριµένα δεδοµένα, αλλά πολύ επικίνδυνο (η p είναι τοπική µεταβλητή) οπότε να το προσέχετε. - Στο ίδιο σηµείο, ο δείκτης next του struct θα έπρεπε να έχει τιµή NULL. - Για να γράψετε το Adam θα έπρεπε να είχατε δεσµεύσει χώρο. - H clone είναι σε γενικές γραµµές οκ. Οµοίως και η clear.

1611 - Έπρεπε να κάνετε δυναµική δέσµευση µνήµης και για το name, µε µέγεθος strlen(name)+1. Επειδή είναι string έπρεπε να χρησιµοποιείτε την strcpy και όχι απλή ανάθεση τιµής. name. 1612 1613 1617 FAIL 1618 1619 - Η clear είναι λάθος. Κάνετε free(runner) κι αµέσως µετά προσπέλαση του runner->next ενώ το runner έχει γίνει free. Επίσης, δεν αποδεσµεύετε τη µνήµη που δεσµεύθηκε για το name. - Στην clone, µετά το malloc για το όνοµα έπρεπε πάλι να καλείτε την clear. - Στη main, αν το first είναι NULL δεν πρέπει να το κάνετε free. - Σας το λέµε συνεχώς να βάζετε αρχικό σχόλιο. - Μετά από κάθε malloc πρέπει να κάνεις έλεγχο. Σε µία δεν έχετε κάνει. Έπρεπε µεν να εµφανίζετε κάποιο σχετικό µήνυµα σε περίπτωση αποτυχίας όπως επίσης και να καλείτε τη συνάρτηση killgremlins. - Στην killgremlins, αν το first είναι αρχικά NULL, το curr=first->next θα πετάξει αµέσως segfault. Αν το first->next είναι αρχικά NULL, ο έλεγχος του while θα πετάξει πάλι segfault. Ξαναδιαβάστε πώς γίνεται σωστά η αποδέσµευση. -Το πρόγραµµα περιέχει warnings και η εκτέλεση οδηγεί σε Segmentation Fault. - Στη ln 34 έχετε βάλλει το προτότυπο της συνάρτησης, αντί για κανονική κλήση της. - Συνάρτηση clear: Ο τελεστής ισότητας είναι ==. Δεν προχωράτε κάπως τη διάτρεξη της λίστας. - Συνάρτηση clone: Πολλά λογικά λάθη. Περνάτε σα παράµετρο τη µεταβλητή someone, η οποία αναπαριστά την κεφαλή της λίστας, και τη χαλάτε γιατί σε αυτή πάτε και δεσµεύσετε χώρο στη γραµµή 87. -- Στο ptr->name πώς θα γράψετε Adam αφού δεν έχει δεσµευτεί χώρος. -- Στη γραµµή 91 γιατί κάνετε έλεγχο αν η curr είναι NULL ενώ δεν έχετε κάνει malloc σε αυτή. Μετά προσπαθείτε να κάνετε free στηνη ίδια µεταβλητή που είναι NULL... - H initialize έχει οµοίως πολλά λογικά λάθη. -Στη malloc για το ονοµα έχετε βάλει καρφωτά ότι το όνοµα έχει µέγεθος 10. Θα έπρεπε να είναι strlen(table[i].name) + 1 (για το '\0'). Επίσης δεν ελέγχετε εάν επιστρέφει NULL. -Στην αποτυχία κάποιας malloc, έπρεπε να καλείτε την killgremlins ώστε να απελευθερώνεται η µνήµη όλης της λίστας, και όχι να κάνετε free(curr). -Περισσότερη προσοχή στη στοίχιση. -Δεν έχετε σχόλιο στην αρχή. -Όταν δεσµεύετε µνήµη για το temp->name έπρεπε να έχετε len+1 για το \0. -Στην killgremlins αρχίζετε να σβήνετε από το δεύτερο κόµβο γιατί έχετε λάθος την αρχικοποίηση. Έξω από while θέλετε µόνο curr = first. 1622 - Στην initialize πρέπει να κάνετε έλεγχο αν η malloc αποτυγχάνει για κάθε κλήση της, άρα και για δέσµευση χώρου για το name - Μάλιστα, σε περίπτωση αποτυχίας δέσµευσης χώρου για το name πρέπει να κάνετε clear και το someone - Η clear δεν είναι σωστή. Τρέχει µόνο για την πρώτη επανάληψη και µετά, αφού to κάνετε free, ο έλεγχος της while δεν βγάζει νόηµα. - Η clone πρέπει να κατασκευάζει ένα ακριβές αντίγραφο του κόµβου που παίρνει ως παράµετρο. Kάνοντας nnode->name = someone->name; βάζετε το nnode-name να δείχνει στο name του someone και δεν δεσµεύετε χώρο στο κλόνο για το name(αντιγράφοντάς το κιόλας).

- Σε κάθε έλεγχο που κάνετε για αποτυχία δέσµευσης µνήµης έπρεπε να καλείτε την killgremlins. - Στη συνάρτηση killgremlins δεν κάνετε τον κάθε κόµβο free µόνο τον αρχικό. 1624 1625 FAIL 1627 Άσκηση 2: - Στην επανάληψη που ψάχνετε τη σωστή θέση έπρεπε απλά να "προχωράτε" µια θέση πιο πέρα το node και το prev. Μετά, βγαίνοντας από το loop, τσεκάρετε αν βγήκατε επειδή τέλειωσε η λίστα (curr == NULL) ή επειδή βρήκατε κόµβο µε µεγαλύτερο όνοµα, και τότε κάνετε την εισαγωγή του νέου κόµβου. -Το πρόγραµµα περιέχει warnings και η εκτέλεση οδηγεί σε Segmentation Fault. - Στη ln 34 έχετε βάλλει το προτότυπο της συνάρτησης, αντί για κανονική κλήση της. - Συνάρτηση clear: Ο τελεστής ισότητας είναι ==. Δεν προχωράτε κάπως τη διάτρεξη της λίστας. - Συνάρτηση clone: Πολλά λογικά λάθη. Περνάτε σα παράµετρο τη µεταβλητή someone, η οποία αναπαριστά την κεφαλή της λίστας, και τη χαλάτε γιατί σε αυτή πάτε και δεσµεύσετε χώρο στη γραµµή 87. -- Στο ptr->name πώς θα γράψετε Adam αφού δεν έχει δεσµευτεί χώρος. -- Στη γραµµή 91 γιατί κάνετε έλεγχο αν η curr είναι NULL ενώ δεν έχετε κάνει malloc σε αυτή. Μετά προσπαθείτε να κάνετε free στηνη ίδια µεταβλητή που είναι NULL... - H initialize έχει οµοίως πολλά λογικά λάθη. -Έπρεπε να κάνετε free και το curr->name στην killgremlins. 1628 FAIL Δεν ελήφθη άσκηση 1629 1630 1632 - Πολύ καλή δουλειά - Στην initialize, αν το curr->name είναι NULL πρέπει να κάνετε free και το curr. - Στη main, µετά την κλήση στην initialize, αν το first είναι NULL δεν έχει νόηµα να το κάνετε free. - Η clear είναι λάθος. Κάνετε free(runner) κι αµέσως µετά προσπέλαση του runner->next ενώ το runner έχει γίνει free. Επίσης, δεν αποδεσµεύετε τη µνήµη που δεσµεύθηκε για το name. - Στην clone, µετά το malloc για το όνοµα έπρεπε πάλι να καλείτε την clear. - Στη main, αν το first είναι NULL δεν πρέπει να το κάνετε free. -Στη malloc για το ονοµα έχετε υπολογίσει σωστά χώρο και για το '\0', αλλά δεν ελέγχετε αν επιστρέφει NULL. -Στην αποτυχία κάποιας malloc, έπρεπε να καλείτε την killgremlins ώστε να απελευθερώνεται η µνήµη όλης της λίστας, και όχι να κάνετε απλά free. Επίσης ότι εντολές βάζετε µετά τη return απλά δεν εκτελούνται. 1633 - Στην initialize πρέπει να ξανακαλέσετε την malloc για το name, να ελέγξετε τι επιστρέφει και αν αποτύχει να κάνετε clear και το new_p. Αν πετύχει, κάντε strcpy για το όνοµα. - Παροµοίως και στην clone, σχετικά µε την δέσµαυση χώρου για την name. - Η clear είναι σωστή

1634 1637 FAIL 1643 1648 FAIL 1649 1650 1651 FAIL 1652 1653 - Συνάρτηση clone: Θα έπρεπε να ελεγχεί η δέσµευση χώρου και µετά τη malloc για το node->name. Επίσης αφού αποδεσµευτεί ο χώρος πρέπει η συνάρτηση να κάνει κάποιο return, γιατί αλλιώς προσπαθεί να γράψει σε µεταβλητές που έχει κάνει free. - Συνάρτηση initialize: Για το newnode->name έπρεπε να γίνει malloc ακριβώς τόσου χώρου όσο το όνοµα, έλεγχος για δέσµευση µνήµης και strcpy. Το πρόγραµµα δεν κάνει compile - Σας το λέµε συνεχώς να βάζετε αρχικό σχόλιο. - Μετά από κάθε malloc πρέπει να κάνεις έλεγχο. Σε µία δεν έχετε κάνει. Έπρεπε µεν να εµφανίζετε κάποιο σχετικό µήνυµα σε περίπτωση αποτυχίας όπως επίσης και να καλείτε τη συνάρτηση killgremlins. - Στην killgremlins, αν το first είναι αρχικά NULL, το curr=first->next θα πετάξει αµέσως segfault. Αν το first->next είναι αρχικά NULL, ο έλεγχος του while θα πετάξει πάλι segfault. Ξαναδιαβάστε πώς γίνεται σωστά η αποδέσµευση. -Ο κώδικας σας δεν τρέχει σωστά και πετάει Segmentation fault. -To warning στη γραµµη 68 θα µπορούσατε να το διορθώσετε εύκολα. -Έπρεπε να ελέγχετε και το αποτέλεσµα της malloc για το όνοµα. Επίσης στη δέσµευση του χώρου δεν λαµβάνετε υπόψη το '\0'. -Οι αλλαγές των δεικτών κατά την εισαγωγή ενός νέου κόµβου δεν είναι σωστές. Δεν χρειάζεται το root->next αλλά το root. Οι αναθέσεις που κάνετε έχουν ως αποτέλεσµα το Segmentation fault. -Δεν καλείτε την killgremlins από τη main και επίσης στη συνάρτηση αυτή έπρεπε να κάνετε free και το όνοµα. -Δεν έχετε αρχικό σχόλιο. -Στη malloc για το newnode->name έπρεπε να είχατε (len+1)*sizeof(char), όπου len το µέγεθος του name της θέσης που πίνακα που είσατε. -Έπρεπε να κάνετε έλεγχο για τη malloc και για τη newnode->name. - Συνάρτηση clone: ln 86, εφόσον δε µπόρεσε να δεσµευτεί χώρος για την duplicate δε µπορείτε να κάνετε free τη duplicate! Πρέπει να αποδεσµεύσετε όλους τους κόµβους που έχουν δεσµευτεί µέχρι στιγµής. Θα µπορούσατε να καλέσετε τη συνάρτηση clear για να το πετύχετε αυτό. - Συνάρτηση initialize: Για να γράψετε το name, θα έπρεπε να κάνετε malloc και strcpy. Κατά τα άλλα όκ. Για το πεδίο name του struct τα ίδια θα έπρεπε να κάνετε και στη συνάρτηση clone. Στείλατε το lab11.c χωρίς καµµία αλλαγή - προσθήκη δικού σας κώδικα.. -Στον έλεγχο για αποτυχία της malloc έπρεπε να καλείτε την killgremlins και να µην κάνετε free µόνο το συγκεκριµένο κόµβο. -Στην killgremlins έπρεπε να κάνετε free και το first->name. - Σε κάθε έλεγχο που κάνετε για αποτυχία δέσµευσης µνήµης θα µπορούσατε να καλείτε την killgremlins. Δεν τον κάνετε αυτό τον έλεγχο σε όλες τις περιπτώσεις αποτυχίας. 1654 -Στον έλεγχο για αποτυχία της malloc έπρεπε να καλείτε την killgremlins και να µην κάνετε free µόνο το συγκεκριµένο κόµβο. -Στην killgremlins έπρεπε να κάνετε free και το first->name.

1655 1656 1657 - Μέσα σε κάθε έλεγχο αποτυχίας δέσµευσης µνήµης έπρεπε να καλείς την clear. Εσύ δε το κάνεις σε όλες τις περιπτώσεις (initialize). - Σωστά κάνεις malloc και για το όνοµα...αλλά...δε δεσµεύεις χώρο για το \0! - Στη συνάρτηση clear έπρεπε να κάνεις και το name free, εσύ το έχεις σε σχόλιο και αν το βγάλεις σου δίνει segmentation fault. Γενικά είναι λάθος η υλοποίηση της clear. Προσπάθησε να την ξανακάνεις. - Μη ξεχνάς το αρχικό σχόλιο!!! -Δεν έχετε αρχικό σχόλιο. -Στη malloc για το newnode->name έπρεπε να είχατε (len+1)*sizeof(char), όπου len το µέγεθος του name της θέσης που πίνακα που είσατε. -Έπρεπε να κάνετε έλεγχο για τη malloc και για τη newnode->name. -Δεν έχετε σχόλιο στην αρχή. -Όταν δεσµεύετε µνήµη για το temp->name έπρεπε να έχετε len+1 για το \0. -Στην killgremlins αρχίζετε να σβήνετε από το δεύτερο κόµβο γιατί έχετε λάθος την αρχικοποίηση. Έξω από while θέλετε µόνο curr = first. 1658 - Σε κάθε έλεγχο που κάνετε για αποτυχία δέσµευσης µνήµης θα µπορούσατε να καλείτε την killgremlins. Δεν τον κάνετε αυτό τον έλεγχο σε όλες τις περιπτώσεις αποτυχίας. 1659 FAIL 1660 FAIL - Το αρχείο που έστειλες είναι το lab9. 1661 1664 1666 -Ο κώδικας σας δεν τρέχει σωστά και πετάει Segmentation fault. -To warning στη γραµµη 68 θα µπορούσατε να το διορθώσετε εύκολα. -Έπρεπε να ελέγχετε και το αποτέλεσµα της malloc για το όνοµα. Επίσης στη δέσµευση του χώρου δεν λαµβάνετε υπόψη το '\0'. -Οι αλλαγές των δεικτών κατά την εισαγωγή ενός νέου κόµβου δεν είναι σωστές. Δεν χρειάζεται το root->next αλλά το root. Οι αναθέσεις που κάνετε έχουν ως αποτέλεσµα το Segmentation fault. -Δεν καλείτε την killgremlins από τη main και επίσης στη συνάρτηση αυτή έπρεπε να κάνετε free και το όνοµα. -Έπρεπε να κάνετε free και το curr->name στην killgremlins. -Στην initialize πρέπει να κάνετε έλεγχο αν η malloc επιστρέφει NULL για όλες τις κλήσεις της malloc, άρα και για το head->name. - Η clear πρέπει να κάνει free όλη τη λίστα, εφόσον αυτή περιέχει παραπάνω από ένα στοιχεία - Η κλήση της clear στην main προκαλεί segfault - Στην εκτύπωση των αποτελεσµάτων πρέπει να φαίνονται όλα τα στάδια της λίστας, όχι µόνο η τελική της µορφή - Η έξοδος του προγράµµατος είναι η αναµενόµενη. - Μην ξεχνάτε το αρχικό σχόλιο. - Δεν κάνετε έλεγχο δέσµευσης µνήµης σε όλες τις περιπτώσεις, και µάλιστα πρέπει να τον κάνετε ακριβώς µετά τη δέσµευση µνήµης. Έπρεπε να κάνετε και για το name εφόσον το δηλώνετε δυναµικά. Ακόµη, µέσα στους ελέγχους αυτούς έπρεπε να κάνετε και clear στην περίπτωση αποτυχίας. - Για τη δέσµευση µνήµης του name έπρεπε να έχετε +1 για το \0. - Στην clear έπρεπε να έχετε και free για το name, καθώς το δηλώνετε δυναµικά.

1668 - Έπρεπε να κάνετε δυναµική δέσµευση µνήµης και για το name, µε µέγεθος strlen(name)+1. Επειδή είναι string έπρεπε να χρησιµοποιείτε την strcpy και όχι απλή ανάθεση τιµής. name. 1669 - Πολύ καλή δουλειά - Στην initialize, αν το curr->name είναι NULL πρέπει να κάνετε free και το curr. - Στη main, µετά την κλήση στην initialize, αν το first είναι NULL δεν έχει νόηµα να το κάνετε free. 1670 FAIL Δεν ελήφθη άσκηση 1671 1672 1673 1676 1677 FAIL -Στην initialize πρέπει να κάνετε έλεγχο αν η malloc επιστρέφει NULL για όλες τις κλήσεις της malloc, άρα και για το head->name. - Η clear πρέπει να κάνει free όλη τη λίστα, εφόσον αυτή περιέχει παραπάνω από ένα στοιχεία - Η κλήση της clear στην main προκαλεί segfault - Στην εκτύπωση των αποτελεσµάτων πρέπει να φαίνονται όλα τα στάδια της λίστας, όχι µόνο η τελική της µορφή - Μνήµη πρέπει να δεσµεύετε µόνο όταν χρειάζεται. Για παράδειγµα, στην killgremlins το curr και το last πρόκειται να χρησιµοποιηθούν για να δείξουν σε ήδη υπάρχουσα µνήµη, οπότε είναι λάθος να δεσµεύσετε κάτι για αυτά. Δεν πρόκειται να αποθηκευτεί κάτι καινούργιο σε αυτή τη µνήµη που δεσµεύετε. Επιπλέον, µε το να κάνετε curr=first αργότερα, "χάνετε" πρόσβαση στη µνήµη που δεσµεύσατε (και το πρόγραµµά σας έχει memory leak). - Σε κάθε έλεγχο που κάνετε για αποτυχία δέσµευσης µνήµης έπρεπε να καλείτε την killgremlins, δηλαδή και για το name. name επίσης. Επιπλέον, κάνετε free το last (το οποίο µόλις έχετε κάνει ίδιο µε το curr) κι αµέσως µετά γίνεται η πράξη curr = curr->next. Η προσπέλαση curr->next είναι λάθος, γιατί το curr έχει ήδη γίνει free. - Στην malloc που κάνετε για το name, θα έπρεπε να δεσµεύετε και χώρο για Επειδή είναι string έπρεπε να χρησιµοποιείτε την strcpy και όχι απλή ανάθεση τιµής. - Να βάζετε πιο περιγραφικό σχόλιο. - Συνάρτηση clone: ln 104. Αν δε µπορεί να δεσµευτεί χώρος καλείτε ορθά την clear. Όµως ξανακαλέιτε την clear µέσα στη main, κάτι που είναι λάθος. Η clear πρέπει να καλείται µία φορά. - Οµοίως στη ln 112, θα έπρεπε να κληθεί η clear. - Συνάρτηση initialize: ΟΚ Καλύτερα αντί για define στο µέγεθος του ονόµατος να είχατε κάνει ακριβώς δέσµευση όσου χώρου χρειαζότανε. -Η initialize είναι σωστή, αλλά θα έπρεπε να ελέγχετε το αποτέλεσµα της malloc για τον κόµβο. Επίσης σωστά υπολογίσατε το '\0' για το όνοµα. -Στην clone επρεπε να ελέγχεται και τη malloc για το όνοµα. -Σε περίπτωση αποτυχίας δέσµευσης µνήµης, έπρεπε να καλείτε την clear και όχι να κάνετε free(komvos); -Δεν καλείτε πουθενά την clear και επίσης δεν είναι σωστά υλοποιηµένη. Το πρόγραµµα δεν κάνει compile

1679 1681 FAIL 1684 1690 FAIL 1691 FAIL 1692 - Στην initialize η υλοποίηση είναι σωστή - Και η συνάρτηση clone είναι σωστή - Μπορείτε βέβαια να καλείτε την clear για αποδέσµευση των δεικτών µετά από αποτυχία της malloc - Στην clear δεν λαµβάνετε µέριµνα για την περίπτωση που η λίστα έχει µόνο ένα στοιχείο, οπότε δεν θα µπούµε ποτέ στην for. - Όταν γράφουµε "Adam" το \0 περιλαµβάνεται ήδη. Δε χρειάζεται να το ξαναβάλετε κάπου. Το πρόγραµµα δεν κάνει compile - Στην initialize η υλοποίηση της είναι αρκετά σωστή. - Πολύ σωστά δεσµεύετε χώρο για το name, υπολογίζετε χώρο και για το \0 στο τέλος του αλφαριθµητικού. - Η clone είναι πολύ σωστή. - Σωστή η χρήση της clear για αποδέσµευση των δεικτών µετά από αποτυχία της malloc, απλά θα έπρεπε να κάνετε και στη συνάρτηση initialize στον έλεγχο clear. - Η clear είναι σωστή. - Μη ξεχνάτε το αρχικό σχόλιο!!! - Το πρόγραµµα σας δε δίνει τα αναµενόµενα αποτελέσµατα. Αυτό που έπρεπε να δίνει είναι ένας κάτω τριγωνικός πίνακας στην ουσία. Το λάθος είναι στον τρόπο που "κολάτε" το νέο κόµβο στο someone. Θέτετε το someone (δηλαδή την κεφαλή της λίστας) να είναι ίσο µε το νέο κόµβο που φτιάξατε και επιστρέφετε αυτό. Ως αποτέλεσµα, η υπόλοιπη λίστα χάνεται. Επιπλέον, στη main δεν αποθηκεύετε πουθενά το αποτέλεσµα που επιστρέφει η clone. - Σωστή η δέσµευση και για το \0. - Καλό είναι για την κάθε malloc να κάνετε τον δικό της έλεγχο, σε περίπτωση αποτυχίας να ξέρουµε δηλαδή ποιο ευθύνεται. Αν η malloc επιστρέψει NULL, τότε πρέπει να τερµατίζει η συνάρτηση, γιατί αν συνεχίσει θα πετάξει segfault. - Μέσα στον έλεγχο για τη αποτυχία δέσµευσης µνήµης έπρεπε να καλείτε και την clear. - Η σύνταξη της clear δεν είναι εντελώς σωστή. Η συνθήκη έπρεπε να έχει!= αντί για == - Αυξάνετε το someone->age κάθε φορά ενώ δε θα έπρεπε. - Προσέξτε λίγο τη στοίχιση σας! - Το πρόγραµµα σου έχει προειδοποιήσεις, τις οποίες θα µπορούσες να έχεις αποφύγει. Ακόµη η έξοδος δεν είναι εντελώς η αναµενόµενη. - Μη ξεχνάς το αρχικό σχόλιο. - Σε κάθε έλεγχο για την αποτυχία δέσµευσης µνήµης έπρεπε να κάνεις free, ή να καλείς την killgremlins. - Δεν υλοποιείς την killgremlins. - Όσον αφορά το µέγεθος του ονόµατος, έπρεπε να δεσµεύεις µνήµη και για το \0 (+1 δηλαδή). -Καλή στοίχιση και µεταβλητές. -Στη malloc για το ονοµα δεν ελέγχετε εάν επιστρέφει NULL. -Έχετε σωστά υπολογίσει και το '\0' στη δέσµευση του χώρου. -Στην αποτυχία της malloc για έναν κόµβο, έπρεπε να καλείτε την killgremlins ώστε να απελευθερώνεται η µνήµη όλης της λίστας. -Επίσης, δεν γίνονται free όλοι οι κόµβοι της λίστας, αλλά τρεις. 1693 - Δεν εµφανίζεται τη πρώτη φορά ο αρχικός κόµβος, αυτό το πετυχαίνετε µε µία print έξω από την επανάληψη. - Στην initialize η υλοποίηση της είναι αρκετά σωστή, έπρεπε όµως µέσα στον έλεγχο δέσµευσης µνήµης να καλείτε και την clear. - Πολύ σωστά δεσµεύετε χώρο για το name, υπολογίζετε χώρο και για το \0 στο τέλος του αλφαριθµητικού. - Η clone είναι πολύ σωστή. - Η clear δεν είναι σωστή, έπρεπε να κάνετε και free το name, καθώς το δηλώνετε δυναµικά. Επίσης, αν το first είναι αρχικά NULL, θα πετάξει segfault. - Μη ξεχνάτε το αρχικό σχόλιο!!!

1703 -Καλή στοίχιση και µεταβλητές. -Στη malloc για το ονοµα δεν ελέγχετε εάν επιστρέφει NULL. -Έχετε σωστά υπολογίσει και το '\0' στη δέσµευση του χώρου. -Στην αποτυχία της malloc για έναν κόµβο, έπρεπε να καλείτε την killgremlins ώστε να απελευθερώνεται η µνήµη όλης της λίστας. -Επίσης, δεν γίνονται free όλοι οι κόµβοι της λίστας, αλλά τρεις. 1704 - Η έξοδος του προγράµµατος είναι η αναµενόµενη. - Μην ξεχνάτε το αρχικό σχόλιο. - Δεν κάνετε έλεγχο δέσµευσης µνήµης σε όλες τις περιπτώσεις, και µάλιστα πρέπει να τον κάνετε ακριβώς µετά τη δέσµευση µνήµης. Έπρεπε να κάνετε και για το name εφόσον το δηλώνετε δυναµικά. Ακόµη, µέσα στους ελέγχους αυτούς έπρεπε να κάνετε και clear στην περίπτωση αποτυχίας. - Για τη δέσµευση µνήµης του name έπρεπε να έχετε +1 για το \0. - Στην clear έπρεπε να έχετε και free για το name, καθώς το δηλώνετε δυναµικά. 1705 1711 1714 - Στην initialize πρέπει να ξανακαλέσετε την malloc για το name, να ελέγξετε τι επιστρέφει και αν αποτύχει να κάνετε clear και το new_p. Αν πετύχει, κάντε strcpy για το όνοµα. - Παροµοίως και στην clone, σχετικά µε την δέσµαυση χώρου για την name. - Η clear είναι σωστή -Δεν έχετε σχόλιο στην αρχή. -Στον έλεγχο αν πέτυχε η malloc έπρεπε να καλείτε την killgremlins αν υπάρχει κάποιο πρόβληµα και όχι να κάνετε απλά free. -Στην killgremlins έχετε first = first->next; και µετά free(first). Έπρεπε να είχατε ακόµα µία µεταβλητή που να κράταγε τον επόµενο κόµβο και να κάνετε free αυτή που κρατά τον τωρινό κόµβο. - Καλό θα ήταν τις µεταβλητές να τις δηλώνεις στην αρχή της συνάρτησης - Όταν δεσµεύεις µνήµη για το όνοµα χρειάζεται µια ακόµη θέση για το \0 - Αν το malloc αποτύχει κι επιστρέψει NULL, δεν έχει νόηµα να κάνεις free το συγκεκριµένο δείκτη. Αφού δε δεσµεύτηκε! - Η strdup κάνει δέσµευση και αντιγραφή. Ή θα χρησιµοποιήσεις malloc και strcpy, ή θα χρησιµοποιήσεις strdup. Με τον τρόπο που το έκανες η αρχική µνήµη που δέσµευσες για το όνοµα µε malloc χάνεται (και το πρόγραµµα έχει memory leak) - Η clear δεν είναι σωστά υλοποιηµένη. Κάνοντας first = first->next παρακάµπτεις τον κόµβο που µάλλον εννοούσες να κάνεις free. Επιπλέον, σκέψου τι γίνεται από τη µία επανάληψη στην άλλη. Κάνεις free(first) κι ενώ το first έχει ήδη αποδεσµευτεί µετά κάνεις προσπέλαση και στο first->name και στο first->next. Θα έπρεπε να έχεις µια βοηθητική µεταβλητή να κρατάει το first, µετά κάνεις first=first->next και µετά κάνεις free τη βοηθητική