Εργαστήριο Τεχνολογίας Λογισμικού
0 votes
231 views

Στην παρακάτω εντολή:

while (p!=NULL) {
     if (frasi<=p->data)
               return p->previous;
     p=p->next;
}

εάν η frasi είναι <= του p το οποίο έχει πρόσβαση στο data, τότε επίστρεψε ως τιμή p τη διεύθυνση του προηγούμενου κόμβου. Η παράσταση p=p->next; τι επίδραση έχει; Εννοεί ότι αν δεν τηρείται το if (δηλαδή αν frasi>p->data) τότε επίστρεψε ως τιμή p τη διεύθυνση του επόμενου κόμβου;

in progintro by (820 points)
edited by | 231 views
0

>τότε επέστρεψε ως τιμή p τη διεύθυνση του επόμενου κόμβου

Όχι. Πρόσεξε ότι το p->next δεν επιστρέφεται, αλλά ανατίθεται στο p και το while συνεχίζει.

1 Answer

+1 vote

Δεν καταλαβαίνω πώς έχεις μπλεχτεί τόσο πολύ. Είσαι σε ένα while loop. Εάν ισχύει το if, θα εκτελεστεί η εντολή στο if. Όσο δεν ισχύει το if, εκτελείται κανονικά το loop με όλες τις εντολές του πλην της μίας που είναι μέσα στην if. Το p = p->next δεν έχει return, είναι μία παλιά καλή ανάθεση.

Αυτό που λέει ο κώδικας που έχεις γράψει είναι ότι "εάν η frasi είναι μικρότερη ή ίση από το p->data [1] τότε επίστρεψε το πεδίο previous στη δομή που δείχνει το p [2]. Σε κάθε περίπτωση όμως, προχώρα το p να δείχνει στο επόμενο στοιχείο, μπας και βρούμε εκεί το στοιχείο όπου η frasi <= p->data".

Αν δεν βάλεις το p = p->next τότε το loop σου δεν θα βγάζει πολύ νόημα, γιατί το loop σου θα τρέχει συνέχεια για το ίδιο p (99% infinite loop, εκτός και αν η συνθήκη αληθεύει για το 1ο στοιχείο). Αντίστοιχα θα συμβούν αν δεν βάλεις το i = i + 1 σε κάποιο παλιό καλό loop ακεραίων...

[1] κάτι που βγάζει ή δεν βγάζει νόημα ανάλογα τον τύπο του frasi. Αν ας πούμε είναι char *, δεν βγάζει νόημα η συνθήκη. Θα βοηθούσε αν μας έδινες και τον ορισμό του struct...
[2] που υποθέτω είναι δείκτης στο προηγούμενο στοιχείο, καθώς δεν μας έχεις δώσει τον ορισμό του struct. Δεν βρήκα αυτό τον κώδικα στις διαφάνειες και δεν έχω τη διάθεση να ψάξω να βρω πού τον βρήκες :)

by (800 points)
0

Οκ με αυτό που μου έγραψες το κατάλαβα ακριβώς τι συμβαίνει. Η πραγματικότητα είναι ότι πρόκειται για διατεταγμένη συνδεδεμένη λίστα (sorted linked list) και ο κώδικας αφορά συνάρτηση εύρεσης θέσης νέου κόμβου, ο οποίος είναι ο παρακάτω:

node *fposition (string frasi) {
   node *p;
   p=list_head;
   while (p!=NULL) {
     if (frasi<=p->data)
        return p->previous;
     p=p->next;
   }
   return list_tail;
} 

Ευχαριστώ πολύ για την απάντηση!

301 questions

289 answers

288 comments

903 users