Δεν καταλαβαίνω πώς έχεις μπλεχτεί τόσο πολύ. Είσαι σε ένα 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. Δεν βρήκα αυτό τον κώδικα στις διαφάνειες και δεν έχω τη διάθεση να ψάξω να βρω πού τον βρήκες :)