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

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

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

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

FAIL PASS PASS οριακά

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

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

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

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

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

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

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

lab13grades 449 PASS 451 PASS PASS FAIL 1900 FAIL Page 1

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

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

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

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

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

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

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

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

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

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

Sheet PASS 1426 PASS 1428 PASS. Page 1

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

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

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

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

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

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

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

to post PASS PASS FAIL

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

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

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

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

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

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

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

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

Σύνοψη Προηγούμενου. Λίστες (Lists) Συνδεδεμένες Λίστες: Εισαγωγή (1/2) Συνδεδεμένες Λίστες. Ορέστης Τελέλης

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

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

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

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

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

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

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

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

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

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

Sheet3_2. Τα literals (3.0, 1.5, κτλ) πρέπει να ορίζονται ως σταθερές.

ΑΛΓΟΡΙΘΜΟΙ ΜΕ C. ΝΙΚΟΛΑΟΣ ΣΑΜΑΡΑΣ Αναπληρωτής Καθηγητής. CMOR Lab. Computational Methodologies and Operations Research

Α. unsigned int Β. double. Γ. int. unsigned char x = 1; x = x + x ; x = x * x ; x = x ^ x ; printf("%u\n", x); Β. unsigned char

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

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

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

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

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

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

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

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

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

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

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

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

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

Δείκτες (Pointers) Ένας δείκτης είναι μια μεταβλητή με τιμή μια διεύθυνση μνήμης. 9.8

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

Κεφάλαιο , 3.2: Συναρτήσεις II. ( ιάλεξη 12) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

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

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

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

Λύβας Χρήστος Αρχική επιµέλεια Πιτροπάκης Νικόλαος και Υφαντόπουλος Νικόλαος

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

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

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

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

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

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

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

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

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

Χαρακτηριστικά αναδροµής

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

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

Α Β Γ static; printf("%c\n", putchar( A +1)+2); B DB BD. int i = 0; while (++i); printf("*");

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

ΑΕΜ ή username. Sheet2

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

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

Προγραµµατισµός Ι ΕΡΓΑΣΤΗΡΙΟ 5 ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ

Η γλώσσα προγραμματισμού C Συνδεδεμένες Λίστες

Επανάληψη για τις Τελικές εξετάσεις. (Διάλεξη 24) ΕΠΛ 032: ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΜΕΘΟΔΩΝ ΕΠΙΛΥΣΗΣ ΠΡΟΒΛΗΜΑΤΩΝ

Δείκτες (Pointers) Ένας δείκτης είναι μια μεταβλητή με τιμή μια διεύθυνση μνήμης. 9.8

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

Δυναμική δέσμευση και αποδέσμευση μνήμης. Προγραμματισμός II 1

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

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

lab4grades Παράδοση ασκήσεων: -Όλα καλά Άσκηση 1η: -Σωστή 357 PASS

Transcript:

Α.Μ. ΒΑΘΜΟΣ ΣΧΟΛΙΑ Στη main: - Αποθηκεύετε το αποτέλεσµα της removepart στη µεταβλητή curr, αλλά στην κλήση της clearlist µετά περνάτε την παλιά κεφαλή της λίστας (µεταβλητή list) η οποία δεν είναι πια έγκυρη. Αυτό έχει ως αποτέλεσµα να τερµατίζει το πρόγραµµά σας µε segmentation fault. 1349 1482 FAIL 1556 1559 FAIL - Όλα ok. Στη removepart: - Στην αναζήτηση για το first και end θα ήταν πιο "κοµψό" να κάνατε τους δύο ελέγχους στην ίδια εντολή if. - Έπρεπε να κάνετε έλεγχο αν το first είναι ίσο µε head, γιατί σε αυτή την περίπτωση η κεφαλή της λίστας αλλάζει. Επιπλέον, σε αυτή την περίπτωση το first->prev είναι NULL και η έκφραση first->prev->next θα οδηγήσει σε segmentation fault. - Έπρεπε να κάνετε έλεγχο αν το end->next είναι NULL, γιατί τότε η έκφραση end->next->prev θα οδηγήσει σε segmentation fault. -Μεταβλητές, στοίχιση, σχόλιο καλά. -Έχετε warning επειδή δηλώνετε µεταβλητή και δεν την χρησιµοποιείτε. -Ο έλεγχος που κάνετε στις for για την εύρεση της ηµεροµηνίας είναι λάθος. Η αναζήτηση θα σταµατήσει όταν θα βρει ίδιο µήνα και ίδια µέρα όπως θέλουµε, αλλά θα σταµατήσει και αν βρει ίδια µέρα χωρίς ίδιο µήνα ή ίδιο µήνα χωρίς ίδια µέρα. -Ο κώδικά σας πετάει segmentation fault. To πρόβληµα είναι στη clearlist όπου κάνετε προσπέλαση στο curr->next αφότου το curr έχει γίνει free, και ελέγχετε αν curr->next == NULL το οποίο πετάει segfault όταν το curr είναι αρχικά NULL. -Επίσης ο κώδικάς σας τρέχει και για την περίπτωση που δε βρει κάποια ηµεροµηνία, ενώ πετάει segmetation fault αν οι ηµεροµηνίες που θέλουµε είναι στην κεφαλή ή στο τέλος της λίστας. -Η clearlist είναι λάθος υλοποιηµένη. Κάθε φορά που θέλετε να σβήσετε κάποιο κόµβο έπρεπε να κρατάτε σε µια άλλη µεταβλητή πρώτα τον επόµενο και µετά να σβήνετε τον τωρινό. - Σωστός αλγόριθµος αναζήτησης των ηµεροµηνιών και έλεγχος αν η δεύτερη ηµεροµηνία έπεται της πρώτης. - Σωστή η clearlist. - Όµως πρέπει να ελέγχετε αν κάποια date είναι η κεφαλή της λίστας ή το τέλος µε start->prev==null όπου πρέπει να ανανεώνετε τη την κεφαλή της λίστας και µε end->next==null αντίστοιχα. - Επίσης, κάτι που η άσκηση ζητάει έµµεσα είναι να αποδεσµεύσετε και το χώρο από το κοµµάτι της λίστας που αφαιρείτε. Σε αυτή την περίπτωση πρέπει να κάνετε end->next=null; και να καλέσετε clearlist(start); -Μεταβλητές, σχόλιο, στοίχιση καλά. -Στη 2η for για την εύρεση της τελικής έπρεπε να ξεκινάτε από arxiki->next. -Αν εξαιρέσουµε το πιο πάνω η υλοποίησή σας δουλεύει σωστά αν δίνετε ενδιάµεσες ηµεροµηνίες. -Αν δοθούν ηµεροµηνίες που είναι στην κεφαλή ή στο τέλος της όπως και ηµεροµηνία που δεν υπάρχει τότε θα πετάξει segmetation fault. -Η clearlist είναι λάθος υλοποιηµένη. Κάθε φορά που θέλετε να σβήσετε κάποιο κόµβο έπρεπε να κρατάτε σε µια άλλη µεταβλητή πρώτα τον επόµενο και µετά να σβήνετε τον τωρινό.

1562 FAIL 1563 FAIL 1565 - Οι δηλώσεις των συναρτήσεων βρίσκονται στο mylist.h, δεν χρειάζεται να τις ξαναδηλώσετε στο lab12.c - Στην main δεν καλείτε την printlist αφού έχετε εκτελέσει την removepart, όπως σας ζητείται στην εκφώνηση - Χρησιµοποιείτε µια βοηθητική συνάρτηση στην removepart, η οποία όµως έχει λάθος την συνθήκη της for... Το κοµµάτι ((current->date.day == search_date.day) && (current->date.month == search_date.month)); σηµαίνει ΟΣΟ βρίσκουµε ίδιες ηµεροµηνίες, η for συνεχίζει τις επαναλήψεις. Εφόσον βρεί date διάφορο του current->date, θα σταµατήσει. Άρα, η searchlist επιστρέφει κατά την πρώτη κλήση της το head και κατά την δεύτερη κλήση της το head->next. Αυτό οδηγεί σε segmentation fault παρακάτω στην removepart στην γραµµή 50, όπου γίνεται προσπέλαση του index_date1->prev->next (= index_date2->next;) το οποίο είναι ο δείκτης prev του κόµβου head, το οποίο είναι NULL - Στην removelist πρέπει να λάβετε υπόψη σας και άλλες ακραίες περιπτώσεις, όπως το date2 να είναι το τελευταίο ή το πρώτο στοιχείο της λίστας - Στην clearlist, αν το head είναι NULL, η συνθήκη του while θα προκαλέσει segmentation fault. Έπρεπε να είχατε while (current_node!= NULL) - Δεν φορτώνετε την stdlib.h µε αποτέλεσµα να µην αναγνωρίζει την free που χρησιµοποιείτε στην clearlist - Στην removepart δεν λαµβάνετε µέριµνα για καµία από τις παρακάτω περιπτώσεις (για τις οποίες προκαλείται segmentation fault): 1.Αν δεν βρεθεί η πρώτη ηµεροµηνία (δεν πρέπει να ξεκινάει καν η αναζήτηση για την δεύτερη ηµεροµηνία, αφού ο counter1->next είναι NULL) 2. Αν δεν βρεθεί η δεύτερη ηµεροµηνία, η συνάρτηση πρέπει να επιστρέψει τη λίστα όπως ήταν 3. Αν η πρώτη ηµεροµηνία είναι το head, τότε o counter1->prev είναι NULL 4. Αν η δεύτερη ηµεροµηνία είναι το τελευταίο στοιχείο της λίστας, τότε ο counter2->next είναι NULL - Όταν βρεθεί µια ηµεροµηνία, αφαιρείτε σωστά τον κόµβο αλλά δεν κάνετε free. - Δε δίνετε σωστή τιµή στο head. Είναι πάντα το τελευταίο στοιχείο πριν αυτό που αφαιρέθηκε. - Η clearlist είναι οκ ως ιδέα, αλλά αν το head είναι NULL, θα πετάξει segfault. Χρειάζεστε έναν επιπλέον έλεγχο στην αρχή. - Στην υλοποίηση της swap δε θέτετε το root->prev ίσο µε point. - Ωραία σχόλια και ονόµατα µεταβλητών, καλή στοίχιση. 1566 - Η εκτέλεση του κώδικα οδηγει σε κάποιο memory problem: το µήνυµα αναφέρετε σε double free, το οποίο σηµαίνει ότι προσπαθείτε να ελευθερώσετε δύο φορές κάποιο κοµµάτι µνήµης - To kate είναι αρρύθµιστο και ο κώδικας δεν έχει καλή στοίχιση. - Η clearlist έχει υλοποιηθεί σωστά. - ln 73 και 82, αν η ηµεροµηνία δε βρεθεί και επιστρέψετε NULL, τότε χάνετε την κεφαλή της λίστας... Για αυτό θέλετε return head. - Αν η κεφαλή της λίστας είναι NULL, τότε θα πεταχτεί segfault στη γραµµή 69. - Η αναζήτηση του curr2 για να βρείτε τη δεύτερη ηµεροµηνία δε θα πρέπει να ξεκινάει πάλι από head αλλά από εκεί που βρήκατε το curr1. Αλλιώς, δεν έχετε τρόπο να ελέγξετε αν η δεύτερη ηµεροµηνία έπεται της πρώτης. - Στην περίπτωση curr1->prev==null έπρεπε να θέτετε και το νέο head- >prev ίσο µε NULL. - Επίσης, γιατί αναθέτετε στα head->date τα date1 και date2; Μην παπαγαλίζετε τις διαφάνειες! Η συγκεκριµένη λίστα είναι χωρίς τερµατικό. 1567 FAIL Όµοιος κώδικας µε άλλη οµάδα.

1570 -Ο κώδικας σας δε δουλεύει σωστά για όλες τις περιπτώσεις. Αναλυτικότερα: -Εάν υπάρχουν δύο διαφορετικές ηµεροµηνίες και δεν βρίσκονται στην αρχή ή στο τέλος της λίστας, τότε η λειτουργία είναι σωστή. -Εάν από την άλλη κάποια είναι η κεφαλή ή η ουρά, τότε έχετε segmentation fault καθώς δεν ελέγχετε αν το hmeromhnia1->prev είναι NULL (το hmeromhnia1 κεφαλή) ή αν το curr2->next είναι NULL (το curr2 ουρά). -Η δεύτερη επανάληψη έπρεπε να ξεκινάει από hmeromhnia1->next, καθώς αν θέλετε π.χ. να αφαιρέσετε από 9/9 µέχρι 9/9, ο κώδικας σας θα αφαιρέσει πραγµατικά έναν µόνο κόµβο. -Επίσης έπρεπε να καλείτε την clear και από την removepart ώστε να διαγράφετε τους κόµβους που αφαιρείτε, και όχι µόνο από τη main. -Σωστή υλοποίηση της clear. -Καλή στοίχιση -Δεν υπάρχει αρχικό σχόλιο Στη main: - Η swaplist κάνει κάποιες αλλαγές στη λίστα και µετά επιστρέφει τη νέα κεφαλή της. Εποµένως στη main έπρεπε να αποθηκεύετε το αποτέλεσµα της swaplist στη µεταβλητή list. Έτσι, θα ήταν σωστές µετά και οι κλήσεις στις printlist και clearlist όπου περνάτε τη list. - Σωστή υλοποίηση 1571 FAIL 1573 FAIL 1574 1577 Στη swaplist: - Δεν υπολογίζετε σωστά το minimum. Η αρχικοποίηση της µεταβλητής diafora έπρεπε να γίνεται εκτός του while και όχι σε κάθε µία επανάληψη. - Η µεταβλητή last έπρεπε να παίρνει την τιµή curr πριν γίνει η πράξη curr = curr->next, αλλιώς δεν πρόκειται να κρατήσει τον τελευταίο κόµβο της λίστας αλλά το NULL. - Όταν κάνετε την προσπέλαση wanted->prev->next θα πεταχτεί segmentation fault γιατί ακριβώς πριν έχετε κάνει το wanted->prev = NULL. - Στο τέλος έπρεπε να επιστρέφετε το wanted, που είναι η νέα κεφαλή της λίστας, κι όχι το head. - Το thesh->prev->next είναι ακριβώς το ίδιο πράγµα µε το thesh και δεν έπρεπε να το κάνετε NULL. - Η εκτέλεση του προγράµµατος οδηγεί σε segmentation fault, και αυτό διότι έχετε στη σειρά 80 το εξής: head2->prev ενώ το head2 το έχετε κάνει NULL. - Έπρεπε πριν το telos->prev->next =... να γίνεται έλεγχος για το αν το telos- >prev είναι NULL (περίπτωση που το telos είναι η κεφαλή της λίστας). - Οι πράξεις σας για τις ανανεώσεις των pointers είναι λάθος. - Στην clearmem δεν κάνετε free τον τελευταίο κόµβο της λίστας. - Καλά ονόµατα µεταβλητών και καλή στοίχιση. - Να βάζετε σχόλια στο πρόγραµµα σας. - Γιατί αντιγράψατε το αρχείο mylist.h µέσα στο lab12.c; Η άσκηση δουλεύει µιά χαρά και χωρίς να το κάνετε αυτό διότι το κάνει ήδη #include - Σωστή υλοποίηση της clearlist. - Στη removepart θα έπρεπε να καλείτε και την clearlist κάθε φορά που "κόβετε" κάτι από τη λίστα. Για να µπορέσει να γίνει σωστά αυτό πρέπει πρώτα να κάνετε end-next= NULL. - Κατά τα άλλα καλή δουλειά. - Σωστός αλγόριθµος αναζήτησης των ηµεροµηνιών και έλεγχος αν η δεύτερη ηµεροµηνία έπεται της πρώτης. - Σωστή η clearlist. - Όµως πρέπει να ελέγχετε αν κάποια date είναι η κεφαλή της λίστας ή το τέλος µε start->prev==null όπου πρέπει να ανανεώνετε τη την κεφαλή της λίστας και µε end->next==null αντίστοιχα. - Επίσης, κάτι που η άσκηση ζητάει έµµεσα είναι να αποδεσµεύσετε και το χώρο από το κοµµάτι της λίστας που αφαιρείτε. Σε αυτή την περίπτωση πρέπει να κάνετε end->next=null; και να καλέσετε clearlist(start);

1579 FAIL 1581 1582 1587 FAIL - Το thesh->prev->next είναι ακριβώς το ίδιο πράγµα µε το thesh και δεν έπρεπε να το κάνετε NULL. - Η εκτέλεση του προγράµµατος οδηγεί σε segmentation fault, και αυτό διότι έχετε στη σειρά 80 το εξής: head2->prev ενώ το head2 το έχετε κάνει NULL. - Έπρεπε πριν το telos->prev->next =... να γίνεται έλεγχος για το αν το telos- >prev είναι NULL (περίπτωση που το telos είναι η κεφαλή της λίστας). - Οι πράξεις σας για τις ανανεώσεις των pointers είναι λάθος. - Στην clearmem δεν κάνετε free τον τελευταίο κόµβο της λίστας. - Καλά ονόµατα µεταβλητών και καλή στοίχιση. - Να βάζετε σχόλια στο πρόγραµµα σας. - Στην υλοποίηση της swap δε θέτετε το root->prev ίσο µε point. - Ωραία σχόλια και ονόµατα µεταβλητών, καλή στοίχιση. -Στοίχιση και µεταβλητές καλά. -Δεν έχετε σχόλιο. -Ο έλεγχος που κάνετε στις for για την εύρεση της ηµεροµηνίας είναι λάθος. Η αναζήτηση θα σταµατήσει όταν θα βρει ίδιο µήνα και ίδια µέρα όπως θέλουµε, αλλά θα σταµατήσει και αν βρει ίδια µέρα χωρίς ίδιο µήνα ή ίδιο µήνα χωρίς ίδια µέρα. -Στη δεύτερη for έπρεπε να ξεκινάτε από start->next. -Η εντολή head=start οδηγεί σε λάθος. Επιστρέφετε στην ουσία το start που είναι η αρχή του κοµµατιού που θέλουµε να σβήσουµε. Σωστό: clearlist(start); return head; -Δεν κάνετε έλεγχο για ακραίες περιπτώσεις όπως αν βάλετε µια ηµεροµηνία που είναι η κεφαλή της λίστας ή ο τελευταίος της κόµβος ή αν δεν υπάρχει καθόλου η ηµεροµηνία. - Δεν καλείτε την clearlist στο τέλος της main, αλλά τουλάχιστον είναι σωστή η υλοποίησή της. - Στην υλοποίηση σας δεν ακολουθείτε ακριβώς τις προδιαγραφές της άσκησης. Συγκεκριµένα φαίνεται να αφαιρείτε τον κόµβο από τη λίστα και όχι να κάνετε swap των τµηµάτων. - Η clearmem έχει υλοποιηθεί σωστά. - Όσον αφορά τη swaplist, η υλοποίηση σας θα µπορούσε να γίνει και πιο απλά χωρίς τη δυναµική δέσµευση του πίνακα diafores. Αλλά καλά κάνετε και τον αποδεσµεύετε κιόλας. - Ο αλγόριθµος σας µέχρι τον εντοπισµό της µικρότερης διαφοράς και την εύρεση του τελευταίου στοιχείου στη λίστα είναι σωστός. Όµως, το χαλάτε στην αλλαγή των δεικτών. Καταρχήν. head->next->next αναφέρεται πάντα προς το δείκτη στο τρίτο στοιχείο της λίστας. Στη γενική περίπτωση, αυτό δε θα έπρεπε να γίνεται πάντα NULL. Θα έπρεπε να ελέγξετε τις εξής περιπτώσεις: --- Η min διαφορά να είναι στην αρχή της λίστας, όπου δεν υπάρχει δεύτερο κοµµάτι για να γίνει swap... --- Η min διαφορά στη µέση της λίστας, --- Η min διαφορά στο τέλος της λίστας. Ζωγραφίστε αυτές τις περιπτώσεις στο χαρτί και δείτε πώς θα έπρεπε να αλλάζουν τότε οι δείκτες για να τρέχει σωστά η λίστα. - Τέλος, στη main γιατί καλείτε clearmem(list) και clearlist(newlist). Σκεφτείτε ότι η swaplist επιστρέφει την κεφαλή της λίστας, την οποία µπορείτε να την αναθέσετε στη µεταβλητή list και όχι σε καινούρια µεταβλητή. Για αυτό αρκεί να βάλλετε clearmem(list). Όπως το κάνατε, σβήνετε δύο φορές κάθε κόµβο, γιαυτό και το πρόγραµµα τερµατίζει άδοξα µε "double free"

Στη main: - Δεν καλείτε την clearlist στο τέλος του προγράµµατος - Δεν υλοποιήθηκε 1589 FAIL 1590 Στη swaplist: - Η αρχικοποίηση του min σε 80000 δεν έχει καµία λογική. Τι θα γίνει αν η λίστα περιέχει µεγαλύτερες τιµές? Έπρεπε να είχατε χρησιµοποιήσει την τιµή DBL_MAX όπως υπεδείκνυε η εκφώνηση. - Χειρίζεστε τη λίστα σα να έχει τερµατικό κόµβο, ενώ δεν έχει. Το curr έπρεπε να ξεκινάει από head, όχι από head->next. - Η συνθήκη τερµατισµού του for είναι λάθος. Πρέπει να γράψετε τι θέλετε να ισχύει όσο προχωράει το loop, κι όχι τι ισχύει όταν σταµατήσει. Επιπλέον, στην αναζήτηση πρέπει να ελέγχετε και τον τελευταίο κόµβο. Εποµένως, στο πρώτο for η συνθήκη έπρεπε να είναι curr!=null και στο δεύτερο curr->next!=null; - Γιατί κάνετε το ptr_curr ίσο µε NULL? - Η αλλαγή των pointers γίνεται µε λάθος τρόπο. - Στην υλοποίηση της remove έπρεπε πριν την ανάθεση end->next->prev =... να γίνεται έλεγχος για το αν το end->next είναι NULL (περίπτωση που το end είναι ο τελευταίος κόµβος της λίστας). Έτσι αν εγώ δώσω να πάρει σαν τελευταία ηµεροµηνία το τελευταίο κόµβο, παίρνω segmentation fault. - Έπρεπε να γίνονται κάποιες ενέργειες (τερµατισµός συνάρτησης) αν κάποια από τις ηµεροµηνίες που δόθηκαν δεν υπάρχουν µέσα στη λίστα. - Σωστή υλοποίηση της clearlist, αλλά την καλείς µε λάθος παράµετρο. Η νέα κεφαλή της λίστας είναι head, όχι list. - Ωραία ονόµατα µεταβλητών, καλή στοίχιση. - Να βάζετε σχόλια στο πρόγραµµα σας! Στη main: - Δεν καλείτε την clearlist στο τέλος του προγράµµατος - Δεν υλοποιήθηκε 1595 FAIL Στη swaplist: - Η αρχικοποίηση του min σε 80000 δεν έχει καµία λογική. Τι θα γίνει αν η λίστα περιέχει µεγαλύτερες τιµές? Έπρεπε να είχατε χρησιµοποιήσει την τιµή DBL_MAX όπως υπεδείκνυε η εκφώνηση. - Χειρίζεστε τη λίστα σα να έχει τερµατικό κόµβο, ενώ δεν έχει. Το curr έπρεπε να ξεκινάει από head, όχι από head->next. - Η συνθήκη τερµατισµού του for είναι λάθος. Πρέπει να γράψετε τι θέλετε να ισχύει όσο προχωράει το loop, κι όχι τι ισχύει όταν σταµατήσει. Επιπλέον, στην αναζήτηση πρέπει να ελέγχετε και τον τελευταίο κόµβο. Εποµένως, στο πρώτο for η συνθήκη έπρεπε να είναι curr!=null και στο δεύτερο curr->next!=null; - Γιατί κάνετε το ptr_curr ίσο µε NULL? - Η αλλαγή των pointers γίνεται µε λάθος τρόπο. 1596 FAIL -To πρόγραµµα σας δεν κάνει compile. Το όρισµα head που περνάτε στην κλήση της συνάρτησης δεν υπάρχει. Έπρεπε να χρησιµοποιήσετε το list. -Η υλοποίηση της removepart καθώς και της clear δεν είναι σωστές. 1601 FAIL - Το πρόγραµµα δεν κάνει compile. Ακόµη κι αν δικαιολογηθεί αυτό λόγω του τεχνικού προβλήµατος που είχες, ο υπάρχων κώδικας είναι πολύ λίγος και έχει αρκετά προβλήµατα στη λογική του.

Στη main: - Δεν καλείς την clearlist στο τέλος του προγράµµατος - Σωστή υλοποίηση 1602 1607 1608 1611 1612 Στη removepart: - Στην αναζήτηση ηµεροµηνίας θα ήταν πιο "κοµψό" να έκανες και τους δύο ελέγχους (για day και month) στην ίδια συνθήκη if. - Πριν την πράξη end->next->prev έπρεπε να ελέγχεις αν το end->next είναι NULL και να κάνεις διαφορετικό χειρισµό σε αυτή την περίπτωση, γιατί αλλιώς θα πετάξει segmentation fault. Το end->next είναι NULL όταν το end είναι ο τελευταίος κόµβος της λίστας. -Στοίχιση και µεταβλητές καλά. -Δεν έχετε σχόλιο. -Ο έλεγχος που κάνετε στις for για την εύρεση της ηµεροµηνίας είναι λάθος. Η αναζήτηση θα σταµατήσει όταν θα βρει ίδιο µήνα και ίδια µέρα όπως θέλουµε, αλλά θα σταµατήσει και αν βρει ίδια µέρα χωρίς ίδιο µήνα ή ίδιο µήνα χωρίς ίδια µέρα. -Στη δεύτερη for έπρεπε να ξεκινάτε από start->next. -Η εντολή head=start οδηγεί σε λάθος. Επιστρέφετε στην ουσία το start που είναι η αρχή του κοµµατιού που θέλουµε να σβήσουµε. Σωστό: clearlist(start); return head; -Δεν κάνετε έλεγχο για ακραίες περιπτώσεις όπως αν βάλετε µια ηµεροµηνία που είναι η κεφαλή της λίστας ή ο τελευταίος της κόµβος ή αν δεν υπάρχει καθόλου η ηµεροµηνία. - Δεν καλείτε την clearlist στο τέλος της main, αλλά τουλάχιστον είναι σωστή η υλοποίησή της. - Καλή δουλειά, µπράβο παιδιά! - Σωστή υλοποίηση του αλγορίθµου, µε σωστούς ελέγχους, εκτός από την περίπτωση root==last όπου ξεχάσατε το head->prev=last; - Σωστή υλοποίηση της clearmem. - Ωραία σχόλια και ονόµατα µεταβλητών και καλή στοίχιση. - Εξαιρετική δουλειά, µπράβο παιδιά! - Σωστή υλοποίηση του αλγορίθµου, µε σωστούς ελέγχους. - Σωστή υλοποίηση της clearmem. - Ωραία σχόλια και ονόµατα µεταβλητών και καλή στοίχιση. -Μεταβλητές καλά. -Στοίχιση λίγο άσχηµη. -Καλό αρχικό σχόλιο. -Ο έλεγχος που κάνεις στις for για την εύρεση της ηµεροµηνίας είναι λάθος. Η αναζήτηση θα σταµατήσει όταν θα βρει ίδιο µήνα και ίδια µέρα όπως θέλουµε, αλλά θα σταµατήσει και αν βρει ίδια µέρα χωρίς ίδιο µήνα ή ίδιο µήνα χωρίς ίδια µέρα. -Μέχρι τη σειρά 78 αν και µε το πιο πάνω λάθος ο κώδικάς σου έχει λογική, από εκεί και πέρα τον περιπλέκεις χωρίς λόγο και σου πετάει segmentation fault. Προσπάθησε να ξαναλύσεις την άσκηση στο σπίτι και ζήτα βοήθεια αν έχεις κολήσει. -Η clearlist είναι λάθος υλοποιηµένη. Κάθε φορά που θες να σβήσεις κάποιο κόµβο έπρεπε να κρατάς σε µια άλλη µεταβλητή πρώτα τον επόµενο και µετά να σβήσεις τον τωρινό.

1613 FAIL 1617 FAIL Δεν ελήφθη άσκηση 1619 1622 FAIL 1624 -Στη main, η clear πρέπει να καλείτε µε όρισµα την νέα κεφαλή της λίστας και όχι την παλιά. -Στην clear είναι έξυπνη η ιδέα να κάνετε free κάθε φορά τον προηγούµενο κόµβο, αλλά έπρεπε να το κάνετε πιο προσεκτικά. Αν το head είναι NULL, ο πρώτος έλεγχος για curr->next θα πετάξει segmentation fault. Επίσης, στο τέλος της λίστας, όταν κάνετε το curr ίσο µε curr->next, αυτό θα γίνει NULL. Αµέσως µετά κάνετε προσπέλαση του curr->prev πράξη που και πάλι θα πετάξει segmentation fault. -Η swaplist, δεν επιστρέφει σωστό αποτέλεσµα, στην περίπτωση που η πιο κοντινή τιµή είναι η πρώτη, αφού ξεκινάτε την αναζήτηση σας από τον δεύτερο κόµβο. Επίσης, σε αυτή την περίπτωση έπρεπε να ελέγχετε κι αν το location->prev είναι NULL πριν προσπελάσετε το location->prev->next. Τέλος, η πράξη location->prev = head; κάνει το ίδιο µε το location->prev = location. Έπρεπε να το είχατε κάνει NULL. -Περισσότερη προσοχή στη στοίχιση. -Δεν υπάρχει αρχικό σχόλιο. - Σωστή γενικά υλοποίηση του αλγορίθµου, µε σωστούς ελέγχους, εκτός από την περίπτωση που δοθεί δύο φορές η ίδια ηµεροµηνία. Αν στη λίστα εµφανίζονται και οι δύο ηµεροµηνίες, θα έπρεπε να αφαιρεθεί το κοµµάτι ανάµεσά τους, ενώ στη δική σας υλοποίηση το πρόγραµµα "βρίσκει" δύο φορές τον ίδιο κόµβο. - Σωστή υλοποίηση της clearlist. - Ωραία ονόµατα µεταβλητών και καλή στοίχιση. - Ακόµη έπρεπε πριν την ανάθεση curr->prev->next =... να γίνεται έλεγχος για το αν το curr->prev είναι NULL (περίπτωση που το curr είναι η κεφαλή της λίστας). - Να βάζετε σχόλια στο πρόγραµµα σας! -Μεταβλητές, στοίχιση, σχόλιο καλά. -Έχετε warning επειδή δηλώνετε µεταβλητή και δεν την χρησιµοποιείτε. -Ο έλεγχος που κάνετε στις for για την εύρεση της ηµεροµηνίας είναι λάθος. Η αναζήτηση θα σταµατήσει όταν θα βρει ίδιο µήνα και ίδια µέρα όπως θέλουµε, αλλά θα σταµατήσει και αν βρει ίδια µέρα χωρίς ίδιο µήνα ή ίδιο µήνα χωρίς ίδια µέρα. -Ο κώδικά σας πετάει segmentation fault. To πρόβληµα είναι στη clearlist όπου κάνετε προσπέλαση στο curr->next αφότου το curr έχει γίνει free, και ελέγχετε αν curr->next == NULL το οποίο πετάει segfault όταν το curr είναι αρχικά NULL. -Επίσης ο κώδικάς σας τρέχει και για την περίπτωση που δε βρει κάποια ηµεροµηνία, ενώ πετάει segmetation fault αν οι ηµεροµηνίες που θέλουµε είναι στην κεφαλή ή στο τέλος της λίστας. -Η clearlist είναι λάθος υλοποιηµένη. Κάθε φορά που θέλετε να σβήσετε κάποιο κόµβο έπρεπε να κρατάτε σε µια άλλη µεταβλητή πρώτα τον επόµενο και µετά να σβήνετε τον τωρινό. - Καλή δουλειά, µπράβο παιδιά! - Σωστή υλοποίηση του αλγορίθµου, µε σωστούς ελέγχους, εκτός από την περίπτωση root==last όπου ξεχάσατε το head->prev=last; - Σωστή υλοποίηση της clearmem. - Ωραία σχόλια και ονόµατα µεταβλητών και καλή στοίχιση.

Στη main: - Αποθηκεύετε το αποτέλεσµα της removepart στη µεταβλητή curr, αλλά στην κλήση της clearlist µετά περνάτε την παλιά κεφαλή της λίστας (µεταβλητή list) η οποία δεν είναι πια έγκυρη. Αυτό έχει ως αποτέλεσµα να τερµατίζει το πρόγραµµά σας µε segmentation fault. 1628 1629 1632 FAIL 1633 1634 - Όλα ok. Στη removepart: - Στην αναζήτηση για το first και end θα ήταν πιο "κοµψό" να κάνατε τους δύο ελέγχους στην ίδια εντολή if. - Έπρεπε να κάνετε έλεγχο αν το first είναι ίσο µε head, γιατί σε αυτή την περίπτωση η κεφαλή της λίστας αλλάζει. Επιπλέον, σε αυτή την περίπτωση το first->prev είναι NULL και η έκφραση first->prev->next θα οδηγήσει σε segmentation fault. - Έπρεπε να κάνετε έλεγχο αν το end->next είναι NULL, γιατί τότε η έκφραση end->next->prev θα οδηγήσει σε segmentation fault. -Το πρόγραµµα σας λειτουργεί σωστά εκτός από τις περιπτώσεις στις οποίες δεν υπάρχει κάποια από τις ηµεροµηνίες, καθώς δεν έχετε αντίστοιχους ελέγχους. Αντίθετα ελέγχετε σωστά, εάν η ηµεροµηνία που ψάχνετε είναι το πρώτο ή τελευταίο στοιχείο της λίστας. - Δεν έπρεπε να δεσµεύετε µνήµη για τους δείκτες first, second γιατί χρησιµοποιούνται για να δείξουν σε ήδη δεσµευµένη µνήµη. -Σωστή υλοποίηση της clear. -Καλή στοίχιση και ονόµατα µεταβλητών. -Το αρχικό σχόλιο έπρεπε να ήταν πιο περιγραφικό. -Μεταβλητές, σχόλιο, στοίχιση καλά. -Στη 2η for για την εύρεση της τελικής έπρεπε να ξεκινάτε από arxiki->next. -Αν εξαιρέσουµε το πιο πάνω η υλοποίησή σας δουλεύει σωστά αν δίνετε ενδιάµεσες ηµεροµηνίες. -Αν δοθούν ηµεροµηνίες που είναι στην κεφαλή ή στο τέλος της όπως και ηµεροµηνία που δεν υπάρχει τότε θα πετάξει segmetation fault. -Η clearlist είναι λάθος υλοποιηµένη. Κάθε φορά που θέλετε να σβήσετε κάποιο κόµβο έπρεπε να κρατάτε σε µια άλλη µεταβλητή πρώτα τον επόµενο και µετά να σβήνετε τον τωρινό. - Το πρόγραµµα δεν τρέχει σωστά µόνο στην περίπτωση όπου δεν υπάρχει η δεύτερη ηµεροµηνία, ενώ επιστρέφει την λίστα κανονικά, εφόσον δεν υπάρχει η πρώτη. - Ο έλεγχος αν η ηµεροµηνίες είναι head ή tail είναι σωστοί, εκτυπώνονται τα στοιχεία που πρέπει, εκτός από την περίπτωση που ελέγχετε στη γραµµή 77 Έπρεπε να επιστρέφετε αµέσως NULL µετά την clearlist. Στην περίπτωση της γραµµής 85 έπρεπε να θέτετε και το νέο curr->prev ίσο µε NULL. - Η clearlist είναι σωστή - Καλή προσπάθεια - Γιατί αντιγράψατε το αρχείο mylist.h µέσα στο lab12.c; Η άσκηση δουλεύει µιά χαρά και χωρίς να το κάνετε αυτό διότι το κάνει ήδη #include - Σωστή υλοποίηση της clearlist. - Στη removepart θα έπρεπε να καλείτε και την clearlist κάθε φορά που "κόβετε" κάτι από τη λίστα. Για να µπορέσει να γίνει σωστά αυτό πρέπει πρώτα να κάνετε end-next= NULL. - Κατά τα άλλα καλή δουλειά.

1643 FAIL 1648 -Στη main, η clear πρέπει να καλείται µε όρισµα την νέα κεφαλή της λίστας και όχι την παλιά. -Στην clear είναι έξυπνη η ιδέα να κάνετε free κάθε φορά τον προηγούµενο κόµβο, αλλά έπρεπε να το κάνετε πιο προσεκτικά. Αν το head είναι NULL, ο πρώτος έλεγχος για curr->next θα πετάξει segmentation fault. Επίσης, στο τέλος της λίστας, όταν κάνετε το curr ίσο µε curr->next, αυτό θα γίνει NULL. Αµέσως µετά κάνετε προσπέλαση του curr->prev πράξη που και πάλι θα πετάξει segmentation fault. -Η swaplist, δεν επιστρέφει σωστό αποτέλεσµα, στην περίπτωση που η πιο κοντινή τιµή είναι η πρώτη, αφού ξεκινάτε την αναζήτηση σας από τον δεύτερο κόµβο. Επίσης, σε αυτή την περίπτωση έπρεπε να ελέγχετε κι αν το location->prev είναι NULL πριν προσπελάσετε το location->prev->next. Τέλος, η πράξη location->prev = head; κάνει το ίδιο µε το location->prev = location. Έπρεπε να το είχατε κάνει NULL. -Περισσότερη προσοχή στη στοίχιση. -Δεν υπάρχει αρχικό σχόλιο. - Στην clearlist δεν έπρεπε να δεσµεύετε µνήµη για τον temp γιατί απλά χρησιµοποιείται για να δείχνει σε ήδη δεσµευµένη µνήµη. Κατά τα άλλα σωστή υλοποίηση της clearlist. - Αν οι ηµεροµηνίες δεν υπάρχουν στη λίστα, οι curr και end θα περιέχουν "σκουπίδια" και θα προκληθεί segmentation fault. Κατά τα άλλα σωστή η υλοποίηση. - Ωραία σχόλια και ονόµατα µεταβλητών και καλή στοίχιση. 1649 1650 FAIL Όµοιος κώδικας µε άλλη οµάδα. 1653 - Η εκτέλεση του κώδικα οδηγει σε κάποιο memory problem: το µήνυµα αναφέρετε σε double free, το οποίο σηµαίνει ότι προσπαθείτε να ελευθερώσετε δύο φορές κάποιο κοµµάτι µνήµης - To kate είναι αρρύθµιστο και ο κώδικας δεν έχει καλή στοίχιση. - Η clearlist έχει υλοποιηθεί σωστά. - ln 73 και 82, αν η ηµεροµηνία δε βρεθεί και επιστρέψετε NULL, τότε χάνετε την κεφαλή της λίστας... Για αυτό θέλετε return head. - Αν η κεφαλή της λίστας είναι NULL, τότε θα πεταχτεί segfault στη γραµµή 69. - Η αναζήτηση του curr2 για να βρείτε τη δεύτερη ηµεροµηνία δε θα πρέπει να ξεκινάει πάλι από head αλλά από εκεί που βρήκατε το curr1. Αλλιώς, δεν έχετε τρόπο να ελέγξετε αν η δεύτερη ηµεροµηνία έπεται της πρώτης. - Στην περίπτωση curr1->prev==null έπρεπε να θέτετε και το νέο head- >prev ίσο µε NULL. - Επίσης, γιατί αναθέτετε στα head->date τα date1 και date2; Μην παπαγαλίζετε τις διαφάνειες! Η συγκεκριµένη λίστα είναι χωρίς τερµατικό. - Στην υλοποίηση της swap έπρεπε το loop σας να ξεκινάει από το head κι όχι το head->next.επίσης έπρεπε πριν την ανάθεση found->prev->next =... να γίνεται έλεγχος για το αν το found->prev είναι NULL (περίπτωση που το found είναι η κεφαλή της λίστας). Επίσης, στο τέλος πρέπει να κάνετε το found->prev ίσο µε NULL. - Σωστή υλοποίηση της clearmem αλλά δεν την καλείτε σωστά: Μετά την κλήση της swaplist η κεφαλή της λίστας είναι η newlist. Η µεταβλητή list είναι ένας κόµβος στο ενδιάµεσο της λίστας. Με το να κάνετε free τους κόµβους από το newlist και πέρα, γίνονται free και αυτοί από το list και πέρα, οπότε η δεύτερη κλήση στην clearmem θα κάνει διπλό free. - Ωραία ονόµατα µεταβλητών, καλή στοίχιση. - Να βάζετε σχόλια στο πρόγραµµα σας! 1654 FAIL Δεν ελήφθη άσκηση 1655 - Πολύ καλή προσπάθεια, µπράβο

1657 1658 - Σωστή γενικά υλοποίηση του αλγορίθµου, µε σωστούς ελέγχους, εκτός από την περίπτωση που δοθεί δύο φορές η ίδια ηµεροµηνία. Αν στη λίστα εµφανίζονται και οι δύο ηµεροµηνίες, θα έπρεπε να αφαιρεθεί το κοµµάτι ανάµεσά τους, ενώ στη δική σας υλοποίηση το πρόγραµµα "βρίσκει" δύο φορές τον ίδιο κόµβο. - Σωστή υλοποίηση της clearlist. - Ωραία ονόµατα µεταβλητών και καλή στοίχιση. - Ακόµη έπρεπε πριν την ανάθεση curr->prev->next =... να γίνεται έλεγχος για το αν το curr->prev είναι NULL (περίπτωση που το curr είναι η κεφαλή της λίστας). - Να βάζετε σχόλια στο πρόγραµµα σας! - Στην υλοποίηση της swap έπρεπε το loop σας να ξεκινάει από το head κι όχι το head->next.επίσης έπρεπε πριν την ανάθεση found->prev->next =... να γίνεται έλεγχος για το αν το found->prev είναι NULL (περίπτωση που το found είναι η κεφαλή της λίστας). Επίσης, στο τέλος πρέπει να κάνετε το found->prev ίσο µε NULL. - Σωστή υλοποίηση της clearmem αλλά δεν την καλείτε σωστά: Μετά την κλήση της swaplist η κεφαλή της λίστας είναι η newlist. Η µεταβλητή list είναι ένας κόµβος στο ενδιάµεσο της λίστας. Με το να κάνετε free τους κόµβους από το newlist και πέρα, γίνονται free και αυτοί από το list και πέρα, οπότε η δεύτερη κλήση στην clearmem θα κάνει διπλό free. - Ωραία ονόµατα µεταβλητών, καλή στοίχιση. - Να βάζετε σχόλια στο πρόγραµµα σας! 1659 - Στην clearlist δεν έπρεπε να δεσµεύετε µνήµη για τον temp γιατί απλά χρησιµοποιείται για να δείχνει σε ήδη δεσµευµένη µνήµη. Κατά τα άλλα σωστή υλοποίηση της clearlist. - Αν οι ηµεροµηνίες δεν υπάρχουν στη λίστα, οι curr και end θα περιέχουν "σκουπίδια" και θα προκληθεί segmentation fault. Κατά τα άλλα σωστή η υλοποίηση. - Ωραία σχόλια και ονόµατα µεταβλητών και καλή στοίχιση. Στη main: - Η removepart κάνει κάποιες αλλαγές στη λίστα και µετά επιστρέφει τη νέα κεφαλή της. Εποµένως στη main έπρεπε να αποθηκεύετε το αποτέλεσµα της removepart στη µεταβλητή list. Έτσι, θα ήταν σωστές µετά και οι κλήσεις στις printlist και clearlist όπου περνάτε τη list. - Δεν υλοποιήθηκε. 1661 FAIL Στη removepart: - Σωστή η εύρεση του start. Για την εύρεση του end έπρεπε να ξεκινάς από το start->next. Διαφορετικά, αν δοθεί δύο φορές η ίδια ηµεροµηνία, θα βρείς τον ίδιο κόµβο για το start και το end. - Αν δε βρεθεί µια από τις δύο ηµεροµηνίες, το start ή και το end θα είναι NULL. Έπρεπε να γίνεται έλεγχος γι αυτό και να τερµατίζει η συνάρτηση πριν γίνει προσπέλαση αυτών των δεικτών. - Αρχικά, θέτεις σωστά τα next, prev των start και end, αλλά µετά χαλάς τις συνδέσεις. Το curr1->next = NULL είναι ισοδύναµο µε start->next = NULL, οπότε το κοµµάτι προς αφαίρεση χάνεται. Έπρεπε να κάνεις µόνο το end->next = NULL και µετά clearlist(start) για να ελευθερώσεις το κοµµάτι ανάµεσα στο start και στο end. Τώρα ελευθερώνεις µόνο τον κόµβο start και µόνο τον κόµβο end. - Δεν υπάρχει πρόβλεψη για την περίπτωση που το start είναι ίδιο µε το head. Όχι µόνο είναι NULL το start->prev σε αυτή την περίπτωση, αλλά πρέπει να ανανεωθεί και η τιµή του head. - Δεν υπάρχει πρόβλεψη για την περίπτωση που το end->next είναι NULL. Αυτό έχει ως συνέπεια η έκφραση end->next->prev να προκαλέσει segmentation fault.

1664 1666 FAIL 1668 1669 1671 -Στοίχιση και µεταβλητές καλά. -Δεν έχετε αρχικό σχόλιο. - Δεν καλείτε την clearlist στο τέλος της main. -Ο κώδικάς σας δουλεύει σωστά για όλες τις περιπτώσεις. -Πολύ καλή δουλειά. - Δεν φορτώνετε την stdlib.h µε αποτέλεσµα να µην αναγνωρίζει την free που χρησιµοποιείτε στην clearlist - Στην removepart δεν λαµβάνετε µέριµνα για καµία από τις παρακάτω περιπτώσεις (για τις οποίες προκαλείται segmentation fault): 1.Αν δεν βρεθεί η πρώτη ηµεροµηνία (δεν πρέπει να ξεκινάει καν η αναζήτηση για την δεύτερη ηµεροµηνία, αφού ο counter1->next είναι NULL) 2. Αν δεν βρεθεί η δεύτερη ηµεροµηνία, η συνάρτηση πρέπει να επιστρέψει τη λίστα όπως ήταν 3. Αν η πρώτη ηµεροµηνία είναι το head, τότε o counter1->prev είναι NULL 4. Αν η δεύτερη ηµεροµηνία είναι το τελευταίο στοιχείο της λίστας, τότε ο counter2->next είναι NULL - Όταν βρεθεί µια ηµεροµηνία, αφαιρείτε σωστά τον κόµβο αλλά δεν κάνετε free. - Δε δίνετε σωστή τιµή στο head. Είναι πάντα το τελευταίο στοιχείο πριν αυτό που αφαιρέθηκε. - Η clearlist είναι οκ ως ιδέα, αλλά αν το head είναι NULL, θα πετάξει segfault. Χρειάζεστε έναν επιπλέον έλεγχο στην αρχή. - Εξαιρετική δουλειά, µπράβο παιδιά! - Σωστή υλοποίηση του αλγορίθµου, µε σωστούς ελέγχους. - Σωστή υλοποίηση της clearmem. - Ωραία σχόλια και ονόµατα µεταβλητών και καλή στοίχιση. -Το πρόγραµµα σας λειτουργεί σωστά εκτός από τις περιπτώσεις στις οποίες δεν υπάρχει κάποια από τις ηµεροµηνίες, καθώς δεν έχετε αντίστοιχους ελέγχους. Αντίθετα ελέγχετε σωστά, εάν η ηµεροµηνία που ψάχνετε είναι το πρώτο ή τελευταίο στοιχείο της λίστας. - Δεν έπρεπε να δεσµεύετε µνήµη για τους δείκτες first, second γιατί χρησιµοποιούνται για να δείξουν σε ήδη δεσµευµένη µνήµη. -Σωστή υλοποίηση της clear. -Καλή στοίχιση και ονόµατα µεταβλητών. -Το αρχικό σχόλιο έπρεπε να ήταν πιο περιγραφικό. -Στοίχιση και µεταβλητές καλά. -Δεν έχετε αρχικό σχόλιο. - Δεν καλείτε την clearlist στο τέλος της main. -Ο κώδικάς σας δουλεύει σωστά για όλες τις περιπτώσεις. -Πολύ καλή δουλειά. Στη main: - Η swaplist κάνει κάποιες αλλαγές στη λίστα και µετά επιστρέφει τη νέα κεφαλή της. Εποµένως στη main έπρεπε να αποθηκεύετε το αποτέλεσµα της swaplist στη µεταβλητή list. Έτσι, θα ήταν σωστές µετά και οι κλήσεις στις printlist και clearlist όπου περνάτε τη list. - Σωστή υλοποίηση 1672 FAIL Στη swaplist: - Δεν υπολογίζετε σωστά το minimum. Η αρχικοποίηση της µεταβλητής diafora έπρεπε να γίνεται εκτός του while και όχι σε κάθε µία επανάληψη. - Η µεταβλητή last έπρεπε να παίρνει την τιµή curr πριν γίνει η πράξη curr = curr->next, αλλιώς δεν πρόκειται να κρατήσει τον τελευταίο κόµβο της λίστας αλλά το NULL. - Όταν κάνετε την προσπέλαση wanted->prev->next θα πεταχτεί segmentation fault γιατί ακριβώς πριν έχετε κάνει το wanted->prev = NULL. - Στο τέλος έπρεπε να επιστρέφετε το wanted, που είναι η νέα κεφαλή της λίστας, κι όχι το head.

1673 FAIL 1676 FAIL 1679 FAIL 1684 - Οι δηλώσεις των συναρτήσεων βρίσκονται στο mylist.h, δεν χρειάζεται να τις ξαναδηλώσετε στο lab12.c - Στην main δεν καλείτε την printlist αφού έχετε εκτελέσει την removepart, όπως σας ζητείται στην εκφώνηση - Χρησιµοποιείτε µια βοηθητική συνάρτηση στην removepart, η οποία όµως έχει λάθος την συνθήκη της for... Το κοµµάτι ((current->date.day == search_date.day) && (current->date.month == search_date.month)); σηµαίνει ΟΣΟ βρίσκουµε ίδιες ηµεροµηνίες, η for συνεχίζει τις επαναλήψεις. Εφόσον βρεί date διάφορο του current->date, θα σταµατήσει. Άρα, η searchlist επιστρέφει κατά την πρώτη κλήση της το head και κατά την δεύτερη κλήση της το head->next. Αυτό οδηγεί σε segmentation fault παρακάτω στην removepart στην γραµµή 50, όπου γίνεται προσπέλαση του index_date1->prev->next (= index_date2->next;) το οποίο είναι ο δείκτης prev του κόµβου head, το οποίο είναι NULL - Στην removelist πρέπει να λάβετε υπόψη σας και άλλες ακραίες περιπτώσεις, όπως το date2 να είναι το τελευταίο ή το πρώτο στοιχείο της λίστας - Στην clearlist, αν το head είναι NULL, η συνθήκη του while θα προκαλέσει segmentation fault. Έπρεπε να είχατε while (current_node!= NULL) -To πρόγραµµα σας δεν κάνει compile. Το όρισµα head που περνάτε στην κλήση της συνάρτησης δεν υπάρχει. Έπρεπε να χρησιµοποιήσετε το list. -Η υλοποίηση της removepart καθώς και της clear δεν είναι σωστές. - Το πρόγραµµα σου δεν κάνει compile, έχει 1 error,1 warning. Το error αναφέρεται στο γεγονός ότι έχεις ξεχάσει το τελευταίο } ενώ το warning στο ότι ενώ δηλώνεις τη συνάρτηση listt *removepart(listt *head, datet date1, datet date2) αυτή καταλήγει να τερµατίζει σαν void. Δεν επιστέφει κάτι δηλαδή. Εάν λύσουµε το λάθος σου: - ότι και να δώσω µου επιστρέφει No such date! και αυτό γιατί δεν επιστρέφεις κάτι στην removepart. - Στη συνάρτηση removepart έπρεπε να γίνονται περισσότεροι έλεγχοι. Έπρεπε πιο σωστά να κάνεις έλεγχους για τα first->prev->next=last->next; και last->next->prev=first->prev; αν είναι NULL : first->prev == NULL κεφαλή λίστας και last->next == NULL τελευταίος κόµβος της λίστας. - Το loop που έχεις στην clearlist έπρεπε να ξεκινάει από το head και όχι head- >next. - Η στοίχιση σου είναι απαράδεκτη. - Να βάζεις πιο περιγραφικά σχόλια! -Ο κώδικας σας δε δουλεύει σωστά για όλες τις περιπτώσεις. Αναλυτικότερα: -Εάν υπάχουν δύο διαφορετικές ηµεροµηνίες και δεν βρίσκονται στην αρχή ή στο τέλος της λίστας, τότε η λειτουργία είναι σωστή. -Εάν απο την άλλη κάποια είναι η κεφαλή ή η ουρά, τότε έχετε segmentation καθώς δεν ελέγχετε αν το hmeromhnia1->prev είναι NULL (το hmeromhnia1 κεφαλή) ή αν το curr2->next είναι NULL (το curr2 ουρά). -Η δεύτερη επανάληψη έπρεπε να ξεκινάει από hmeromhnia1->next, καθώς αν θέλετε π.χ. να αφαιρέσετε από 9/9 µέχρι 9/9, ο κώδικας σας θα αφαιρέσει πραγµατικά έναν µόνο κόµβο. -Επίσης έπρεπε να καλείτε την clear και από την removepart ώστε να διαγράφετε τους κόµβους που αφαιρείτε, και όχι µόνο από τη main. -Σωστή υλοποίηση της clear. -Καλή στοίχιση -Δεν υπάρχει αρχικό σχόλιο

1692 Οριακό - Καλά ονόµατα µεταβλητών - Η removepart επιστρέφει τη νέα κεφαλή της λίστας την οποία αποθηκεύετε στη µεταβλητή afairese_tmima_listas. Ακολούθως, στις printlist και clearlist έπρεπε να περνάτε ως παράµετρο την afairese_tmima_listas και όχι την list που ήταν η παλιά κεφαλή (και η οποία πιθανώς να έχει ήδη σβηστεί) - Στην removepart δεν λαµβάνετε µέριµνα για καµία από τις παρακάτω περιπτώσεις (για τις οποίες προκαλείται segmentation fault): - Αν δεν βρεθεί η πρώτη ηµεροµηνία (δεν πρέπει να ξεκινάει καν η αναζήτηση για την δεύτερη ηµεροµηνία, αφού ο counter1->next είναι NULL) - Αν δεν βρεθεί η δεύτερη ηµεροµηνία, η συνάρτηση πρέπει να επιστρέψει τη λίστα όπως ήταν - Αν η πρώτη ηµεροµηνία είναι το head, τότε o counter1->prev είναι NULL - Αν η δεύτερη ηµεροµηνία είναι το τελευταίο στοιχείο της λίστας, τότε ο counter2->next είναι NULL - Η clearlist είναι σωστή 1693 FAIL Όµοιος κώδικας µε άλλη οµάδα. 1703 Οριακό 1704 FAIL Όµοιος κώδικας µε άλλη οµάδα. 1705 - Καλά ονόµατα µεταβλητών - Η removepart επιστρέφει τη νέα κεφαλή της λίστας την οποία αποθηκεύετε στη µεταβλητή afairese_tmima_listas. Ακολούθως, στις printlist και clearlist έπρεπε να περνάτε ως παράµετρο την afairese_tmima_listas και όχι την list που ήταν η παλιά κεφαλή (και η οποία πιθανώς να έχει ήδη σβηστεί) - Στην removepart δεν λαµβάνετε µέριµνα για καµία από τις παρακάτω περιπτώσεις (για τις οποίες προκαλείται segmentation fault): - Αν δεν βρεθεί η πρώτη ηµεροµηνία (δεν πρέπει να ξεκινάει καν η αναζήτηση για την δεύτερη ηµεροµηνία, αφού ο counter1->next είναι NULL) - Αν δεν βρεθεί η δεύτερη ηµεροµηνία, η συνάρτηση πρέπει να επιστρέψει τη λίστα όπως ήταν - Αν η πρώτη ηµεροµηνία είναι το head, τότε o counter1->prev είναι NULL - Αν η δεύτερη ηµεροµηνία είναι το τελευταίο στοιχείο της λίστας, τότε ο counter2->next είναι NULL - Η clearlist είναι σωστή - Το πρόγραµµα δεν τρέχει σωστά µόνο στην περίπτωση όπου δεν υπάρχει η δεύτερη ηµεροµηνία, ενώ επιστρέφει την λίστα κανονικά, εφόσον δεν υπάρχει η πρώτη. - Ο έλεγχος αν η ηµεροµηνίες είναι head ή tail είναι σωστοί, εκτυπώνονται τα στοιχεία που πρέπει, εκτός από την περίπτωση που ελέγχετε στη γραµµή 77 Έπρεπε να επιστρέφετε αµέσως NULL µετά την clearlist. Στην περίπτωση της γραµµής 85 έπρεπε να θέτετε και το νέο curr->prev ίσο µε NULL. - Η clearlist είναι σωστή - Καλή προσπάθεια

1711 FAIL 1714 FAIL - Στην υλοποίηση σας δεν ακολουθείτε ακριβώς τις προδιαγραφές της άσκησης. Συγκεκριµένα φαίνεται να αφαιρείτε τον κόµβο από τη λίστα και όχι να κάνετε swap των τµηµάτων. - Η clearmem έχει υλοποιηθεί σωστά. - Όσον αφορά τη swaplist, η υλοποίηση σας θα µπορούσε να γίνει και πιο απλά χωρίς τη δυναµική δέσµευση του πίνακα diafores. Αλλά καλά κάνετε και τον αποδεσµεύετε κιόλας. - Ο αλγόριθµος σας µέχρι τον εντοπισµό της µικρότερης διαφοράς και την εύρεση του τελευταίου στοιχείου στη λίστα είναι σωστός. Όµως, το χαλάτε στην αλλαγή των δεικτών. Καταρχήν. head->next->next αναφέρεται πάντα προς το δείκτη στο τρίτο στοιχείο της λίστας. Στη γενική περίπτωση, αυτό δε θα έπρεπε να γίνεται πάντα NULL. Θα έπρεπε να ελέγξετε τις εξής περιπτώσεις: --- Η min διαφορά να είναι στην αρχή της λίστας, όπου δεν υπάρχει δεύτερο κοµµάτι για να γίνει swap... --- Η min διαφορά στη µέση της λίστας, --- Η min διαφορά στο τέλος της λίστας. Ζωγραφίστε αυτές τις περιπτώσεις στο χαρτί και δείτε πώς θα έπρεπε να αλλάζουν τότε οι δείκτες για να τρέχει σωστά η λίστα. - Τέλος, στη main γιατί καλείτε clearmem(list) και clearlist(newlist). Σκεφτείτε ότι η swaplist επιστρέφει την κεφαλή της λίστας, την οποία µπορείτε να την αναθέσετε στη µεταβλητή list και όχι σε καινούρια µεταβλητή. Για αυτό αρκεί να βάλλετε clearmem(list). Όπως το κάνατε, σβήνετε δύο φορές κάθε κόµβο, γιαυτό και το πρόγραµµα τερµατίζει άδοξα µε "double free" - Καλό είναι να αποφεύγεις να κάνεις σύγκριση ανάµεσα σε double αριθµούς µε == γιατί τα αποτελέσµατα δεν είναι πάντα ακριβή. Στη συγκεκριµένη άσκηση δε µας ενδιέφερε καν ισότητα, αλλά µόνο ποιος κόµβος είναι αυτός που περιέχει την κοντινότερη τιµή. Εποµένως, αρκούσε στο σηµείο που δίνεις τιµή στο nearestdiff να αποθηκεύεις και τον κόµβο curr σε µια κατάλληλη µεταβλητή. - Το µόνο που κάνεις είναι να σπας τη λίστα στα δύο κοµµάτια, αλλά δεν τα "κολλάς" µεταξύ τους µε την ανάποδη σειρά όπως ήταν το ζητούµενο. Πέρα από το head1 έπρεπε να βρεις και τον τελευταίο κόµβο της λίστας (ας πούµε last), να κάνεις το last->next ίσο µε head, το head->prev ίσο µε last και να θέσεις και τα next/prev των head1, head2. - Σωστή η clearlist και οι κλήσεις των συναρτήσεων.