Επειδή αρκετοί εξακολουθείτε να βάζετε σχόλια στην ίδια γραµµή αλλά πολύ πιο "δεξιά" από τον κώδικα που σχολιάζουν, δείτε παρακάτω πώς µοιάζει ένα τέτοιο πρόγραµµα σε συµβατικό terminal. Όπως έχουµε πει και στο φυλλάδιο "Αρχές καλού προγραµµατισµού", πρέπει να αποφεύγετε να γράφετε πέρα από την 80ή στήλη µιας γραµµής (η οποία µαρκάρεται µε κόκκινη γραµµή στο παρακάτω terminal) Επι τη ευκαιρία, δείτε στο παρακάτω παράδειγµα ότι δεν είναι καθόλου προφανές πού τελειώνει η insertnth και πού ξεκινά η removenth. Εδώ θα βοηθούσε πολύ να υπήρχαν σχόλια συνάρτησης πάνω από τη removenth. Δείτε τώρα και πώς θα έπρεπε να ήταν το παραπάνω: Page 1
ΑΕΜ ΒΑΘΜΟΣ ΣΧΟΛΙΑ 449 - Σωστή υλοποίηση της print_list(). - Σωστή υλοποίηση της insertnth(). - Σωστή υλοποίηση της removenth(). - Καλά σχόλια και σωστή στοίχιση. 451 - Σωστή υλοποίηση της print_list(). - Σωστή υλοποίηση της insertnth(). - Σωστή υλοποίηση της removenth(). - Καλά σχόλια και σωστή στοίχιση. 476 - Σωστή insertnth(). - Σωστή removenth(). - Καλά σχόλια και σωστή στοίχιση. 1733 - Καλή στοίχιση - ΔΕΝ έχετε σχεδόν καθόλου σχόλια - Το πρόγραµµα τυπώνει σωστά τη λίστα - Η insertνth λειτουργεί µεν, αλλά δεν είναι καλά υλοποιηµένη. Διατρέχετε τη λίστα πολύ περισσότερες φορές από όσες χρειάζεται. Προσπαθήστε να την ξαναγράψετε διατρέχοντας τη λίστα το πολύ µια φορά. Δε χρειάζεται να υπολογίζετε το µήκος της (απλά τσεκάρετε αν φτάσατε σε NULL) και οι µόνες περιπτώσεις που χρειάζεται να χειριστείτε είναι για pos == 0 και για pos > 0 - Όταν η removenth λειτουργεί σωστά είναι κατά λάθος, αν τύχει το count να πάρει αρχική τιµή 0. Δεν το έχετε αρχικοποιήσει. Επίσης, αν κληθεί σε άδεια λίστα, θα πετάξει segmentation fault στο *list_head=(*list_head)->next->next; Επίσης, δε λειτουργεί σωστά στην περίπτωση που ζητηθεί να αφαιρεθεί ο τελευταίος κόµβος (δοκιµάστε αφαίρεση από τη θέση 6 αντί για 20 στην τελευταία κλήση στη main). Όπως ειπώθηκε στο εργαστήριο, πρέπει πάντα να ελέγχετε τις οριακές περιπτώσεις. Διαδικαστικά: Καθυστερήσατε αρκετά να στείλετε την άσκηση - έπρεπε να µπορείτε να τελειώσετε µία άσκηση σε 2.5 ώρες! 1899 FAIL - Λάθος print_list(). Η ανανέωση του δείκτη έπρεπε να ήταν curr = curr->next, όχι curr->next = curr - Τι σκοπό εξυπηρετεί οο πρώτο for στην insertnth? Απλά κάνει το count ίσο µε το pos. Δε χρειάζεται ολόκληρο loop για να κάνετε κάτι τέτοιο! - Μετά από κάθε κλήση της malloc πρέπει να ελέγχετε αν επέστρεψε NULL κι αν ναι να κάνετε κάτι λογικό (στη συγκεκριµένη περίπτωση να επιστρέφετε FAILURE) - Στην insertnth, στην περίπτωση που το pos δεν είναι µηδέν, δεν εισάγετε τον κόµβο στη σωστή θέση. - Στη removenth το loop δεν έχει συνθήκη τερµατισµού. Page 2
Διαδικαστικά: Καθυστερήσατε αρκετά να στείλετε την άσκηση - έπρεπε να µπορείτε να τελειώσετε µία άσκηση σε 2.5 ώρες! 1900 FAIL 1901 - Λάθος print_list(). Η ανανέωση του δείκτη έπρεπε να ήταν curr = curr->next, όχι curr->next = curr - Τι σκοπό εξυπηρετεί οο πρώτο for στην insertnth? Απλά κάνει το count ίσο µε το pos. Δε χρειάζεται ολόκληρο loop για να κάνετε κάτι τέτοιο! - Μετά από κάθε κλήση της malloc πρέπει να ελέγχετε αν επέστρεψε NULL κι αν ναι να κάνετε κάτι λογικό (στη συγκεκριµένη περίπτωση να επιστρέφετε FAILURE) - Στην insertnth, στην περίπτωση που το pos δεν είναι µηδέν, δεν εισάγετε τον κόµβο στη σωστή θέση. - Στη removenth το loop δεν έχει συνθήκη τερµατισµού. - Τα σχόλια τα βάζουµε πάνω από τον κώδικα και όχι δίπλα. - remove_duplicates: Αφαιρείτε τους κόµβους από την λίστα, αλλά δεν ελευθερώνετε τη µνήµη που έχει δεσµευτεί για αυτούς. Επαναλάβετε την άσκηση στο σπίτι. 1904 1908 - Σχόλια: Δεν υπήρχαν καθόλου σχόλια. - Υπήρξε πολύ µεγάλη καθυστέρηση στην ολοκλήρωση και αποστολή της άσκησης. Γνωρίζετε πολύ καλά οτι η άσκηση θα πρέπει να έχει αποσταλεί πριν το πέρας της διαθέσιµης ώρας του εργαστηρίου! - Στοίχιση: OK - Ονόµατα µεταβλητών: OK - Σχόλια: Ελάχιστα - create_duplicates: --- Διπλασιασµός: ανάθεση δεικνούµενου αντικειµένου πριν γίνει ο έλεγχος για failure (τι θα γίνει αν pointer == NULL στην εντολή *pointer=*current ;). Επίσης, µην κάνετε ποτέ αναθέσεις της µορφής *pointer=*current ; όταν τα εµπλεκόµενα structs έχουν πεδία που είναι pointers. --- Επιστροφή: Επιστρέφει 0/1 αντί για SUCCESS/FAILURE - remove duplicates: --- Αφαίρεση: Δεν γίνεται σωστή αφαίρεση, έτσι όπως είναι γραµµένο αφαιρεί µόνο τα διαδοχικά ίδια. Δε θα λειτουργήσει αν η λίστα είναι πχ 1 1 2 2 1 1 --- free: ΟΚ. --- Ξανακάντε την άσκηση στο σπίτι µε βάση τις παραπάνω επισηµάνσεις. Page 3
1909 - Σχόλια: Τα σχόλια πρέπει να µπαίνουν πάνω απο τον κώδικα και οχι απο δίπλα γιατί δεν χωράνε και σε µικρότερη οθόνη διπλώνονται στην απο κάτω γραµµή. Κατα τα άλλα σωστά σχόλια, αλλά το if είναι περιττό και δείχνει µη-κατανόηση της λειτουργίας της for: Εφόσον ο µόνος τρόπος να µπούµε στο σώµα της for είναι η συνθήκη curr!=null, τότε προφανώς η συνθήκη της if θα είναι πάντα αληθής. 1911 1914 - Σωστή duplicate_list(). Για την περίπτωση που η malloc() είναι σωστότερο να επιστρέφουµε απλά FAILURE, αφήνοντας αυτόν που κάλεσε την duplicate_list() να διαχειριστεί όπως θέλει την αποτυχία δέσµευσης µνήµης. - Σωστή remove_duplicates(). - Στοίχιση: ΟΚ - Ονόµατα µεταβλητών: ΟΚ - Σχόλια: Κανένα Σχόλιο! - create_duplicates: --- Διπλασιασµός: OK --- Επιστροφή: OK - remove duplicates: --- Αφαίρεση: η γραµµή iter_prev = current->next; θα έπρεπε να είναι iter_prev = iter και να βρίσκεται πριν το iter=iterm->next. Ίσως να µην καταλάβατε την εκφώνηση, προσπαθήστε να την ξανακάνετε σπίτι. Σαν τέστ, αλλάξτε την print_list ώστε να εκτυπώνει και τη διεύθυνση, και στην remove πριν κάνετε free τον κόµβο, εκτυπώστε επίσης τη διεύθυνση και τα περιεχόµενα. Θα δείτε ότι τελικά δε σβήνετε όλους τους κόµβους, αλλά βάζετε τα βελάκια έτσι ώστε να παρακάµψετε κάποιους. --- free: ΟΚ 1927 - Η print_list() δεν είναι σωστή. Αν κληθεί σε άδεια λίστα, το list_head θα είναι NULL οπότε θα πετάξει segmentation fault στην προσπέλαση list_head- >data.το σωστό θα ήταν να είχες αρχικοποιήσει το curr που είναι µέσα στο loop σε list_head και κάθε εκτύπωση να γίνεται µόνο µέσα στο loop (οπότε και το curr θα είναι εγγυηµένα διάφορο του NULL) - Σωστή insertnth() αλλά έχεις πολύ επιπλέον κώδικα. Διατρέχεις δύο φορές τη λίστα ενώ θα µπορούσες να τη διατρέξεις µία φορά έως ότου είτε φτάσεις σε NULL είτε προχωρήσεις κατά pos κόµβους. Γενικά είναι πολύ µπερδεµένη συνάρτηση. Προσπάθησε να την ξαναφτιάξεις ώστε να είναι πιο συνοπτική. - Σωστή removenth() και υλοποιηµένη µε πιο συνοπτικό τρόπο. - Καθόλου σχόλια και αρκετά άσχηµη στοίχιση. Μην αφήνεις τόσες πολλές κενές γραµµές. Page 4
1928 1929 1931 1932 1934 - Στοίχιση: ΟΚ - Ονόµατα µεταβλητών: ΟΚ - Σχόλια: Κανένα Σχόλιο! - create_duplicates: --- Διπλασιασµός: OK --- Επιστροφή: OK - remove duplicates: --- Αφαίρεση: η γραµµή iter_prev = current->next; θα έπρεπε να είναι iter_prev = iter και να βρίσκεται πριν το iter=iterm->next. Ίσως να µην καταλάβατε την εκφώνηση, προσπαθήστε να την ξανακάνετε σπίτι. Σαν τέστ, αλλάξτε την print_list ώστε να εκτυπώνει και τη διεύθυνση, και στην remove πριν κάνετε free τον κόµβο, εκτυπώστε επίσης τη διεύθυνση και τα περιεχόµενα. Θα δείτε ότι τελικά δε σβήνετε όλους τους κόµβους, αλλά βάζετε τα βελάκια έτσι ώστε να παρακάµψετε κάποιους. --- free: ΟΚ - Σχόλια: OK - Έπρεπε να χρησιµοποιήσετε SUCCESS/FAILURE αντί για 1/0, αλλά µην κάνετε ποτέ αναθέσεις της µορφής *new_node=*ptr; όταν τα εµπλεκόµενα structs έχουν πεδία που είναι pointers. Επίσης, στην περίπτωση που αποτυγχάνει η malloc έπρεπε να επιστρέφετε FAILURE. Σε κάθε περίπτωση, πριν τον τερµατισµό ενός προγράµµατος πρέπει να ελευθερώνετε τη δυναµικά δεσµευµένη µνήµη. - Σχόλια: OK - Έπρεπε να χρησιµοποιείτε SUCCESS/FAILURE αντί για 1/0 - remove_duplicates: Αφαιρείτε τους κόµβους από την λίστα, αλλά δεν ελευθερώνετε τη µνήµη που έχει δεσµευτεί για αυτούς. Επαναλάβετε την άσκηση στο σπίτι. Page 5
1942 - Σχόλια: Τα σχόλια πρέπει να µπαίνουν πάνω απο τον κώδικα και οχι απο δίπλα γιατί δεν χωράνε και σε µικρότερη οθόνη διπλώνονται στην απο κάτω γραµµή. Κατα τα άλλα σωστά σχόλια 1946 1949 Διαδικαστικά: Καθυστερήσατε αρκετά να στείλετε την άσκηση - έπρεπε να µπορείτε να τελειώσετε µία άσκηση σε 2.5 ώρες! - Το πρόγραµµα τερµατίζει µε segmentation fault µόλις πάει να αφαιρέσει το τελευταίο στοιχείο της λίστας, γιατί έχετε υλοποιήσει λάθος τη removenth - Σχόλια και στοίχιση οκ - Η κλήση της malloc είναι (listt *) malloc(sizeof(listt)) - Σωστή υλοποίηση της insertnth - Δεν υλοποιείτε σωστά την removenth: --- Δεν υλοποιείτε την περίπτωση διαγραφής από την αρχή της λίστας (την κεφαλή της λίστας) --- Γράφοντας στο while( i<pos+1) έτσι όπως υλοποιείτε στη συνέχεια τον κώδικα το curr πλέον έχει πάει στον επόµενο κόµβο έτσι δε διαγράφεται το σωστό κόµβο αλλά τον επόµενο µε αποτέλεσµα να πετάει Segmentation fault µόλις πάει να αφαιρεθεί το τελευταίο στοιχείο της λίστας 1950 Πολύ καλή δουλειά! - Έπρεπε να χρησιµοποιείτε SUCCESS/FAILURE αντί για 1/0 1959 -Σχόλια και στοίχιση οκ -Σωστή υλοποίηση των συναρτήσεων print_list removenth και insertnth -Μέσα στην removenth το current->next= NULL πριν τη free δεν χρειαζόταν Page 6
1960 1962 FAIL -Στοίχιση οκ - Κακογραµµένα σχόλια. Είναι πολύ µακρυά από τον κώδικα που σχολιάζουν και κάνουν wrap στις επόµενες γραµµές µε αποτέλεσµα άσχηµη µορφή του προγράµµατος. Να τα βάζετε σε ξεχωριστή γραµµή πριν τον κώδικα που σχολιάζουν, ή σε µορφή παραγράφου. -Σωστή υλοποίηση των συναρτήσεων print_list removenth και insertnth - Warning στο compile γιατί δεν επιστρέφετε τίποτα από την insertnth - Καλή στοίχιση - ΔΕΝ έχετε καθόλου σχόλια - Το πρόγραµµα τυπώνει σωστά τη λίστα - Αλλά δεν δουλεύει σωστά η insertnth. Κάθε φορά που θέλετε ένα νέο κόµβο, πρέπει να δεσµεύετε µνήµη εκ νέου. Επίσης, δε διατρέχετε ποτέ τη λίστα. - Η removenth δεν είναι υλοποιηµένη καθόλου 1964 - Σωστή duplicate_list(). Για την περίπτωση που η malloc() είναι σωστότερο να επιστρέφουµε απλά FAILURE, αφήνοντας αυτόν που κάλεσε την duplicate_list() να διαχειριστεί όπως θέλει την αποτυχία δέσµευσης µνήµης. - Σωστή remove_duplicates(). 1965 -Καλή στοίχιση -Καλά σχόλια, αλλά γενικά τα γράφουµε σε ξεχωριστές γραµµές γιατί δηµιουργούν πρόβληµα µε το word wrapping -Σωστά ονόµατα µεταβλητών -Σωστή print_list -Λάθος insertnth, βάζετε το στοιχείο µία θέση πιο µετά από αυτή που σας ζητήθηκε. Επίσης ο έλεγχος µε το LIST_LENGTH είναι άκυρος διότι αυτή η σταθερά απλά σας δείχνει πόσο µεγάλη αρχικοποιήθηκε η λίστα και δεν αντικατοπτρίζει το µήκος της ανά πάσα στιγµή. -Λάθος removenth, προσπαθείτε να κάνετε free ακόµα και αν σας ζητήσουν έναν κόµβο που έχει "index" κατά ένα µεγαλύτερο από το µήκος της λίστας -Γενικά δεν χρειάζεται να µετράτε το µήκος της λίστας, δοκιµάστε να κάνετε την άσκηση µε 1 for-loop ανά function 1973 -Δεν γράψατε σωστά το θέµα στο mail. -Η στοίχιση σε αρκετά σηµεία είναι λάθος. -Καλά σχόλια, αλλά γενικά τα γράφουµε σε ξεχωριστές γραµµές γιατί δηµιουργούν πρόβληµα µε το word wrapping. Τα for σας επίσης έπρεπε να είναι πιο προσεκτικά γραµµένα ώστε να µην κάνουν wrap. -Σωστά ονόµατα µεταβλητών -Σωστή print_list -Σωστή insertnth -Σωστή removenth Page 7
1975 FAIL - Warning στο compile γιατί δεν επιστρέφετε τίποτα από την insertnth - Καλή στοίχιση - ΔΕΝ έχετε καθόλου σχόλια - Το πρόγραµµα τυπώνει σωστά τη λίστα - Αλλά δεν δουλεύει σωστά η insertnth. Κάθε φορά που θέλετε ένα νέο κόµβο, πρέπει να δεσµεύετε µνήµη εκ νέου. Επίσης, δε διατρέχετε ποτέ τη λίστα. - Η removenth δεν είναι υλοποιηµένη καθόλου 1984 -Σωστή στοίχιση -Καλά σχόλια -Σωστά ονόµατα µεταβλητών -Σωστή print_list -Στην insertnth τα σχόλιά σας είναι λάθος για την εισαγωγή κόµβου στο τέλος της λίστας. Η LIST_LENGTH δείχνει µόνο το *αρχικό* µήκος της λίστας, εποµένως είναι λάθος να χρησιµοποιείται σε κάθε εισαγωγή. Να προσέχετε τις συµβουλές που δίνονται την ώρα του εργαστηρίου. -Λάθος removenth η LIST_LENGTH δείχνει µόνο το *αρχικό* µήκος της λίστας. 1985 - Σχόλια: Δεν υπήρχαν καθόλου σχόλια. - Υπήρξε πολύ µεγάλη καθυστέρηση στην ολοκλήρωση και αποστολή της άσκησης. Γνωρίζετε πολύ καλά οτι η άσκηση θα πρέπει να έχει αποσταλεί πριν το πέρας της διαθέσιµης ώρας του εργαστηρίου! 1986 - Σχόλια: OK 1988 - Σωστή υλοποίηση της print_list(). - Σωστή υλοποίηση της insertnth(). - Σωστή υλοποίηση της removenth(). - Καλή στοίχιση - Τα σχόλια τα γράφουµε σε ξεχωριστές γραµµές γιατί δηµιουργούν πρόβληµα µε το word wrapping. Page 8
1992 - Στοίχιση: OK - Ονόµατα µεταβλητών: OK - Σχόλια: OK - create_duplicates: --- Διπλασιασµός: OK --- Επιστροφή: Πρέπει να επιστρέφει 1/0 αντί για SUCCESS/FAILURE - remove duplicates: --- Αφαίρεση: Δεν δουλεύει. Σκέψου τι θα γίνει αν βρεις ένα duplicate. Το current θα γίνει free (οπότε δε δείχνει πια σε έγκυρη διεύθυνση), κι αµέσως µετά κάνεις προσπέλαση του current->next. Εφόσον το current δεν είναι έγκυρο, το current->next µπορεί να προκαλέσει segmentation fault. --- free: ΟΚ 1994 - Σωστή duplicate_list(). - Σωστή remove_duplicates(). - Καλά σχόλια και στοίχιση 1996 - Σωστή υλοποίηση της print_list(). - Σωστή υλοποίηση της insertnth(). - Σωστή υλοποίηση της removenth(). - Καλά σχόλια και σωστή στοίχιση. 2001 2010 2012 - Σωστή insertnth(). - Σωστή removenth(). - Καλά σχόλια και σωστή στοίχιση. -Στοίχιση οκ - Κακογραµµένα σχόλια. Είναι πολύ µακρυά από τον κώδικα που σχολιάζουν και κάνουν wrap στις επόµενες γραµµές µε αποτέλεσµα άσχηµη µορφή του προγράµµατος. Να τα βάζετε σε ξεχωριστή γραµµή πριν τον κώδικα που σχολιάζουν, ή σε µορφή παραγράφου. -Σωστή υλοποίηση των συναρτήσεων print_list removenth και insertnth Page 9
2013 lab12grades -Σωστή στοίχιση -Καλά σχόλια -Σωστά ονόµατα µεταβλητών -Σωστή print_list -Στην insertnth τα σχόλιά σας είναι λάθος για την εισαγωγή κόµβου στο τέλος της λίστας. Η LIST_LENGTH δείχνει µόνο το *αρχικό* µήκος της λίστας, εποµένως είναι λάθος να χρησιµοποιείται σε κάθε εισαγωγή. Να προσέχετε τις συµβουλές που δίνονται την ώρα του εργαστηρίου. -Λάθος removenth η LIST_LENGTH δείχνει µόνο το *αρχικό* µήκος της λίστας. 2017 2020 2028 - Σωστή insertnth(). - Σωστή removenth(). - Καλά σχόλια και σωστή στοίχιση. -Δεν γράψατε σωστά το θέµα στο mail. -Η στοίχιση σε αρκετά σηµεία είναι λάθος. -Καλά σχόλια, αλλά γενικά τα γράφουµε σε ξεχωριστές γραµµές γιατί δηµιουργούν πρόβληµα µε το word wrapping. Τα for σας επίσης έπρεπε να είναι πιο προσεκτικά γραµµένα ώστε να µην κάνουν wrap. -Σωστά ονόµατα µεταβλητών -Σωστή print_list -Σωστή insertnth -Σωστή removenth Πολύ καλή δουλειά! - Έπρεπε να χρησιµοποιείτε SUCCESS/FAILURE αντί για 1/0 Page 10
2029 lab12grades Διαδικαστικά: Καθυστερήσατε αρκετά να στείλετε την άσκηση - έπρεπε να µπορείτε να τελειώσετε µία άσκηση σε 2.5 ώρες! - Το πρόγραµµα τερµατίζει µε segmentation fault µόλις πάει να αφαιρέσει το τελευταίο στοιχείο της λίστας, γιατί έχετε υλοποιήσει λάθος τη removenth - Σχόλια και στοίχιση οκ - Η κλήση της malloc είναι (listt *) malloc(sizeof(listt)) - Σωστή υλοποίηση της insertnth - Δεν υλοποιείτε σωστά την removenth: --- Δεν υλοποιείτε την περίπτωση διαγραφής από την αρχή της λίστας (την κεφαλή της λίστας) --- Γράφοντας στο while( i<pos+1) έτσι όπως υλοποιείτε στη συνέχεια τον κώδικα το curr πλέον έχει πάει στον επόµενο κόµβο έτσι δε διαγράφεται το σωστό κόµβο αλλά τον επόµενο µε αποτέλεσµα να πετάει Segmentation fault µόλις πάει να αφαιρεθεί το τελευταίο στοιχείο της λίστας 2030 - Σχόλια: OK - Έπρεπε να χρησιµοποιήσετε SUCCESS/FAILURE αντί για 1/0, αλλά µην κάνετε ποτέ αναθέσεις της µορφής *new_node=*ptr; όταν τα εµπλεκόµενα structs έχουν πεδία που είναι pointers. Επίσης, στην περίπτωση που αποτυγχάνει η malloc έπρεπε να επιστρέφετε FAILURE. Σε κάθε περίπτωση, πριν τον τερµατισµό ενός προγράµµατος πρέπει να ελευθερώνετε τη δυναµικά δεσµευµένη µνήµη. 2031 -Καλή στοίχιση -Καλά σχόλια, αλλά γενικά τα γράφουµε σε ξεχωριστές γραµµές γιατί δηµιουργούν πρόβληµα µε το word wrapping -Σωστά ονόµατα µεταβλητών -Σωστή print_list -Λάθος insertnth, βάζετε το στοιχείο µία θέση πιο µετά από αυτή που σας ζητήθηκε. Επίσης ο έλεγχος µε το LIST_LENGTH είναι άκυρος διότι αυτή η σταθερά απλά σας δείχνει πόσο µεγάλη αρχικοποιήθηκε η λίστα και δεν αντικατοπτρίζει το µήκος της ανά πάσα στιγµή. -Λάθος removenth, προσπαθείτε να κάνετε free ακόµα και αν σας ζητήσουν έναν κόµβο που έχει "index" κατά ένα µεγαλύτερο από το µήκος της λίστας -Γενικά δεν χρειάζεται να µετράτε το µήκος της λίστας, δοκιµάστε να κάνετε την άσκηση µε 1 for-loop ανά function 2034 - Έπρεπε να χρησιµοποιείτε SUCCESS/FAILURE αντί για 1/0 Page 11
2036 FAIL - Warning στο compile - Μέτρια στοίχιση - ΔΕΝ έχετε καθόλου σχόλια - Το πρόγραµµα τυπώνει σωστά τη λίστα - H insertnth δεν δουλεύει σωστά. Δεν δίνετε τιµή στο nodeptr->data. Το newnode δεν είναι δείκτης και δε προφανώς δε δείχνει σε δυναµικά δεσµευµένη µνήµη. Τι σκοπό εξυπηρετεί? - Η removenth είναι υλοποιηµένη αλλά ούτε αυτή δουλεύει σωστά. - Το output του προγράµµατος δεν είναι προσεγµενο. 2041 -Σχόλια και στοίχιση οκ -Σωστή υλοποίηση των συναρτήσεων print_list removenth και insertnth -Μέσα στην removenth το current->next= NULL πριν τη free δεν χρειαζόταν 2045 - Καλή στοίχιση - ΔΕΝ έχετε σχεδόν καθόλου σχόλια - Το πρόγραµµα τυπώνει σωστά τη λίστα - Η insertνth λειτουργεί µεν, αλλά δεν είναι καλά υλοποιηµένη. Διατρέχετε τη λίστα πολύ περισσότερες φορές από όσες χρειάζεται. Προσπαθήστε να την ξαναγράψετε διατρέχοντας τη λίστα το πολύ µια φορά. Δε χρειάζεται να υπολογίζετε το µήκος της (απλά τσεκάρετε αν φτάσατε σε NULL) και οι µόνες περιπτώσεις που χρειάζεται να χειριστείτε είναι για pos == 0 και για pos > 0 - Όταν η removenth λειτουργεί σωστά είναι κατά λάθος, αν τύχει το count να πάρει αρχική τιµή 0. Δεν το έχετε αρχικοποιήσει. Επίσης, αν κληθεί σε άδεια λίστα, θα πετάξει segmentation fault στο *list_head=(*list_head)->next->next; Επίσης, δε λειτουργεί σωστά στην περίπτωση που ζητηθεί να αφαιρεθεί ο τελευταίος κόµβος (δοκιµάστε αφαίρεση από τη θέση 6 αντί για 20 στην τελευταία κλήση στη main). Όπως ειπώθηκε στο εργαστήριο, πρέπει πάντα να ελέγχετε τις οριακές περιπτώσεις. 2046 FAIL - Warning στο compile - Μέτρια στοίχιση - ΔΕΝ έχετε καθόλου σχόλια - Το πρόγραµµα τυπώνει σωστά τη λίστα - H insertnth δεν δουλεύει σωστά. Δεν δίνετε τιµή στο nodeptr->data. Το newnode δεν είναι δείκτης και δε προφανώς δε δείχνει σε δυναµικά δεσµευµένη µνήµη. Τι σκοπό εξυπηρετεί? - Η removenth είναι υλοποιηµένη αλλά ούτε αυτή δουλεύει σωστά. - Το output του προγράµµατος δεν είναι προσεγµενο. 2047 - Σωστή insertnth(). - Σωστή removenth(). - Καλά σχόλια και σωστή στοίχιση. Page 12
2048 2052 - Σωστή duplicate_list(). - Σωστή remove_duplicates(). - Καλά σχόλια και στοίχιση 2062 - Στοίχιση: OK - Ονόµατα µεταβλητών: OK - Σχόλια: Ελάχιστα - create_duplicates: --- Διπλασιασµός: ανάθεση δεικνούµενου αντικειµένου πριν γίνει ο έλεγχος για failure (τι θα γίνει αν pointer == NULL στην εντολή *pointer=*current ;). Επίσης, µην κάνετε ποτέ αναθέσεις της µορφής *pointer=*current ; όταν τα εµπλεκόµενα structs έχουν πεδία που είναι pointers. --- Επιστροφή: Επιστρέφει 0/1 αντί για SUCCESS/FAILURE - remove duplicates: --- Αφαίρεση: Δεν γίνεται σωστή αφαίρεση, έτσι όπως είναι γραµµένο αφαιρεί µόνο τα διαδοχικά ίδια. Δε θα λειτουργήσει αν η λίστα είναι πχ 1 1 2 2 1 1 --- free: ΟΚ. --- Ξανακάντε την άσκηση στο σπίτι µε βάση τις παραπάνω επισηµάνσεις. Διαδικαστικά ΟΚ 2071 - Μη χρησιµοποιείς επιπλέον παρανθέσεις.το if ((i==pos)) έπρεπε να ήταν if (i==pos) - Σωστή print_list() - Σωστή insertnth() - Σωστή removenth() - Καλή στοίχιση αλλά δεν υπάρχουν σχόλια. 2074 2075 - remove_duplicates: Αφαιρείτε τους κόµβους από την λίστα, αλλά δεν ελευθερώνετε τη µνήµη που έχει δεσµευτεί για αυτούς. Επαναλάβετε την άσκηση στο σπίτι. Page 13
2076 2084 2088 2089 - Σωστή duplicate_list(). - Σωστή remove_duplicates(). - Γενικά καλά σχόλια, αλλά και µερικά περιττά: Δε χρειάζεται να πεις τι κάνουν οι malloc και free - Τα σχόλια τα βάζουµε πάνω από τον κώδικα και όχι δίπλα. - remove_duplicates: Αφαιρείτε τους κόµβους από την λίστα, αλλά δεν ελευθερώνετε τη µνήµη που έχει δεσµευτεί για αυτούς. Επαναλάβετε την άσκηση στο σπίτι. - Σχόλια: Τα σχόλια πρέπει να µπαίνουν πάνω απο τον κώδικα και οχι απο δίπλα γιατί δεν χωράνε και σε µικρότερη οθόνη διπλώνονται στην απο κάτω γραµµή. Κατα τα άλλα σωστά σχόλια, αλλά το if είναι περιττό και δείχνει µη-κατανόηση της λειτουργίας της for: Εφόσον ο µόνος τρόπος να µπούµε στο σώµα της for είναι η συνθήκη curr!=null, τότε προφανώς η συνθήκη της if θα είναι πάντα αληθής. - Σχόλια: Τα σχόλια πρέπει να µπαίνουν πάνω απο τον κώδικα και οχι απο δίπλα γιατί δεν χωράνε και σε µικρότερη οθόνη διπλώνονται στην απο κάτω γραµµή. Κατα τα άλλα σωστά σχόλια Page 14