faintaki Δημοσ. 11 Απριλίου 2013 Δημοσ. 11 Απριλίου 2013 παιδια εχω μια εργασια στην οποια εχω να εισαγω δεδομενα σε λιστα αλφαβητικα.εχω καταλαβει οτι πρεπει να χρησιμοποιησω την συναρτηση strcmp.απλα μπερδευομαι πως θα το κανω να δουλευει οταν εχω να εισαγω το 2ο ας πουμε επωνυμο
bird Δημοσ. 11 Απριλίου 2013 Δημοσ. 11 Απριλίου 2013 Ξέρεις τη θεωρία σχετικά με τις λίστες; Με την strcmp() θα συγκρίνεις το νέο στοιχείο που πας να εισάγεις στη λίστα (με τα υπόλοιπα στοιχεία της λίστας) ώστε να δεις σε ποια θέση θα το εισάγεις... Αν έχεις γράψει κάποιο κώδικα, ανέβασέ τον να βοηθήσουμε...
faintaki Δημοσ. 11 Απριλίου 2013 Μέλος Δημοσ. 11 Απριλίου 2013 λοιπον για να σε βαλω λιγο στο κλιμα,η ασκηση μπλεκει δομες και λιστες μαζι.καθε κομβος της λιστας περιεχει ενα δεικτη σε δομη ενος μαθητη.η δομη αυτη του μαθητη περιεχει ενα δεικτη σε array που δειχνει το επωνυμο του.εχω γραψει την παρακατω συναρτηση (o classnodetype ειναι ο τυπος που δειχνει στη δομη του μαθητη,ο p ειναι ο δεικτης που μου εχει επιστρεψει η malloc,και ο k ενας βοηθητικος δεικτης για να ξερω που βρισκομαι) void alfavitiki(ClassNodeType head,ClassNodeType p,ClassNodeType k) { if (strcmp(p->aStudent->lastName,k->aStudent->lastName)<0) { p->next=k; k=p; } else if (strcmp(p->aStudent->lastName,k->aStudent->lastName)==0) { if (strcmp(p->aStudent->firstName,k->aStudent->firstName)<0) { p->next=k; k=p; } else { p->next=k->next; k->next=p; } } else { p->next=k->next; k->next=p; } k=k->next; } αυτο που με μπερδευει ειναι το κ,πως θα το συνδεσω με το head?
bird Δημοσ. 11 Απριλίου 2013 Δημοσ. 11 Απριλίου 2013 Τον k δεν χρειάζεται να τον περνάς σαν όρισμα (εκτός κι αν είναι δείκτης που δείχνει στο τέλος της λίστας) Στην ουσία αυτό που πρέπει να κάνεις είναι ένα loop μέσα στην συνάρτηση και να διατρέχεις την λιστα σου.. πχ. for(k=head; k != NULL; k = k->next) { /* έλεγχος με strcmp του p με τον k κτλ*/ } Τον head θα τον πειράξεις μόνο αν το στοιχείο που θέλεις να εισάγεις είναι μικρότερο του πρώτου οπότε θα πρέπει να βάλεις: p->next = head->next; head = p;
faintaki Δημοσ. 11 Απριλίου 2013 Μέλος Δημοσ. 11 Απριλίου 2013 οποτε το loop δε θα γινεται μεσα στην main αλλα στη συναρτηση? αυτο δεν απαιτει αρκετο χρονο?...... συγγνωμη για τις ερωτησεις,απλα για να δω αν θα ειναι μικροτερο του πρωτου θα βαλω μεσα στο for loop ενα if (k==head) ktl?
bird Δημοσ. 11 Απριλίου 2013 Δημοσ. 11 Απριλίου 2013 Σαφώς όσο περισσότερα στοιχεία έχει η λίστα σου, τόσο περισσότερο χρόνο θα απαιτεί. Αυτό που σου λέω είναι ο πιο απλός τρόπος για να εισάγεις αλφαβήτικά το στοιχείο που στη χειρότερη θα χρειαστεί Ν συγκρίσεις για να εισάγει ένα στοιχείο στη λίστα. (Ν ο αριθμός των στοιχείων που έχεις ήδη εισάγει) Υπάρχουν διάφορες τεχνικές για να το κάνεις πιο γρήγορο αλλα δε ξέρω αν αυτό είναι ζητούμενο της άσκησης...
ZAKKWYLDE Δημοσ. 12 Απριλίου 2013 Δημοσ. 12 Απριλίου 2013 οποτε το loop δε θα γινεται μεσα στην main αλλα στη συναρτηση? αυτο δεν απαιτει αρκετο χρονο?...... συγγνωμη για τις ερωτησεις,απλα για να δω αν θα ειναι μικροτερο του πρωτου θα βαλω μεσα στο for loop ενα if (k==head) ktl? Αυτό είναι και το μεγάλο μειονέκτημα της λίστας. Για να βρείς ένα στοιχείο πρέπει να διατρέξεις όλη το κομμάτι της λίστας πριν το στοιχείο μέχρι να το βρείς. Απο την άλλη είναι πολύ χρήσιμη όταν θέλεις να εισάγεις και να εξάγεις κάποιο στοιχείο οπως στη περίπτωσή σου. Σκέψου λίγο τι θα χρειαζόταν για να κάνεις το αντίστοιχο σε ένα ArrayList.
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα