Δημοσιεύτηκε: 13 Αύγ 2011, 23:16
από migf1
stamatiou έγραψε:
όμως έχω 2 προβλήματα:
1. Δεν είμαι σίγουρος για το τι κάνει το return i == maxelems ? -1 : i

Ισοδυναμεί με:
Κώδικας: Επιλογή όλων

if ( i == maxelems )
return -1;
else
return i;

έγραψε:2. Τι ακριβώς κάνει το memmove( &arr[1], &arr[0], (maxelems-1) * sizeof(int) );

Μετακινεί τμήματα μνήμης: http://pubs.opengroup.org/onlinepubs/00 ... mmove.html. Στην προκειμένη περίπτωση το χρησιμοποιώ για να μετακινήσω μια θέση προς τα δεξιά όλα τα στοιχεία του πίνακα, από το 1ο και μετά (με την memmove() γίνεται πολύ ταχύτερα από ότι να το έκανα με loop... στην arr_delete() που χρειάζονται πάλι μετακίνηση τα στοιχεία, προς τα αριστερά αυτή τη φορά, το κάνω με loop για να υπάρχουν και οι 2 τρόποι στο πρόγραμμα).

έγραψε:3. Στο προηγούμενο πρόγραμμα γιατί περνάγαμε τα lists με pointer δλδ *List;

Γιατί θέλουμε να διατηρούνται οι αλλαγές που κάνουμε στο πεδίο len (call by reference).

Έβαλα κι εγώ σχόλια στον κώδικα: http://ideone.com/w72Kb

Με την προϋπόθεση πως είναι όλα κατανοητά, η επόμενη άσκηση είναι να φτιάξετε μόνοι σας μια συνάρτηση:
Κώδικας: Επιλογή όλων
arr_insdescending(int arr[], int maxelems, int val);

η οποία θα εισαγάγει στον πίνακα arr ένα νέο στοιχείο με τιμή val, το οποίο θα πρέπει να μπαίνει απευθείας στη σωστή θέση, ώστε ο πίνακας είναι πάντα ταξινομημένος σε φθίνουσα σειρά.

Δηλαδή, για παράδειγμα, ξεκινώντας με έναν κενό πίνακα arr[MAX_ELEMENTS] = { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1} (αλλάξτε το EMPTY_ELEMVAL σε -1), τότε ο παρακάτω κώδικας:

Κώδικας: Επιλογή όλων

...
arr_insdescending( arr, MAX_ELEMENTS, 10);
arr_insdescending( arr, MAX_ELEMENTS, 20);
arr_insdescending( arr, MAX_ELEMENTS, 30);
...

θα πρέπει να δίνει: {30, 20, 10, -1, -1, -1, -1, -1, -1, -1}

και κατόπιν ο κώδικας...
Κώδικας: Επιλογή όλων

arr_insdescending( arr, MAX_ELEMENTS, 1);
arr_insdescending( arr, MAX_ELEMENTS, 25);

θα πρέπει να δίνει: {30, 25, 20, 10, 1, -1, -1, -1, -1, -1}