marsel Δημοσ. 25 Μαΐου 2010 Δημοσ. 25 Μαΐου 2010 Καλησπέρα παιδιά, έχω ένα πρόβλημα με τον ακόλουθο κώδικα. Eνώ κάνει insert ένα στοιχείο την πρώτη φορά, αν την ξανακαλέσω πετάει segmentation fault... > struct listnode { int data; struct listnode *next; struct listnode *prev; }; void insertNode(struct listnode **head,int item) { struct listnode *newNode, *currNode, *prevNode; newNode = (struct listnode *) malloc(sizeof(struct listnode)); if(newNode != NULL) { newNode->data = item; newNode->next = NULL; newNode->prev = NULL; currNode = *head; prevNode = NULL; while ((currNode != NULL) && (item > currNode->data)) { prevNode = currNode; currNode = currNode->next; } if(prevNode == NULL) { newNode->next = *head; newNode->prev = *head; *head = newNode; } else { prevNode->next = newNode; newNode->prev = prevNode; newNode->next = currNode; currNode->prev = newNode; } } else { printf("No Memory\n"); } } Ευχαριστώ εκ των προτέρων.
parsifal Δημοσ. 25 Μαΐου 2010 Δημοσ. 25 Μαΐου 2010 Καλημέρα. Το πρόβλημα υπάρχει σε αυτήν τη γραμμή κώδικα: > else { prevNode->next = newNode; newNode->prev = prevNode; newNode->next = currNode; [b][u]currNode->prev = newNode;[/u][/b] } ...στην περίπτωση που κατά τη διάσχιση της λίστας με το while loop φτάσεις στο τέλος της λίστας. Αυτό θα συμβαίνει κάθε φορά που προσπαθείς σε μη κενή λίστα να εισάγεις κόμβο με τιμή μεγαλύτερη από την τρέχουσα μεγαλύτερη της λίστας (οριακά για 2 εισαγωγές, αν π.χ. στην 1η κλήση της insertNode εισάγεις την τιμή A και στη 2η εισάγεις οποιοδήποτε B > A). Σε αυτήν την περίπτωση, ο δείκτης currNode θα έχει τιμή NULL, δηλαδή δε θα δείχνει σε allocated μπλοκ μνήμης και γι' αυτό η απόπειρα να προσπελάσεις το μέλος prev του struct οδηγεί σε segmentation fault. Μία if για έλεγχο αυτής της περίπτωσης και είσαι έτοιμος: > if(currNode) { currNode->prev = newNode; }
marsel Δημοσ. 25 Μαΐου 2010 Μέλος Δημοσ. 25 Μαΐου 2010 Καλημέρα. Το πρόβλημα υπάρχει σε αυτήν τη γραμμή κώδικα: ...στην περίπτωση που κατά τη διάσχιση της λίστας με το while loop φτάσεις στο τέλος της λίστας. Αυτό θα συμβαίνει κάθε φορά που προσπαθείς σε μη κενή λίστα να εισάγεις κόμβο με τιμή μεγαλύτερη από την τρέχουσα μεγαλύτερη της λίστας (οριακά για 2 εισαγωγές, αν π.χ. στην 1η κλήση της insertNode εισάγεις την τιμή A και στη 2η εισάγεις οποιοδήποτε B > A). Σε αυτήν την περίπτωση, ο δείκτης currNode θα έχει τιμή NULL, δηλαδή δε θα δείχνει σε allocated μπλοκ μνήμης και γι' αυτό η απόπειρα να προσπελάσεις το μέλος prev του struct οδηγεί σε segmentation fault. Μία if για έλεγχο αυτής της περίπτωσης και είσαι έτοιμος: > if(currNode) { currNode->prev = newNode; } Ευχαριστώ για την απάντηση, αλλά θέλω η λίστα να είναι διπλά συνδεδεμένη κυκλική και στην συνάρτηση printList που έχω κάνει διαπιστώνω ότι η λίστα τελειώνει στη συνθήκη (currNode == NULL) ενώ θα έπρεπε να είναι (currNode->next == *head).
marsel Δημοσ. 28 Μαΐου 2010 Μέλος Δημοσ. 28 Μαΐου 2010 Καλησπέρα, παιδία εχω ενα πρόβλημα με την ακόλουθη λίστα. > struct indexRecord { char lastname[len]; char firstname[len]; char email[len]; struct phoneRecord *phones; struct indexRecord *next; struct indexRecord *prev; }; void insertNode(struct indexRecord **head,char *sname,char *fname,struct phoneRecord *pnums,char *mail) { struct indexRecord *newNode, *currNode, *prevNode; newNode = (struct indexRecord *) malloc(sizeof(struct indexRecord)); if(newNode != NULL) { strcpy(newNode->lastname,sname); strcpy(newNode->firstname,fname); newNode->phones = pnums; strcpy(newNode->email,mail); newNode->next = *head; newNode->prev = *head; currNode = *head; prevNode = NULL; while ((currNode != *head) && (strcmp(sname,currNode->lastname) > 0)) { prevNode = currNode; currNode = currNode->next; } if(prevNode == NULL) { if(currNode) { newNode->next = currNode; currNode->prev = newNode; } *head = newNode; } else { prevNode->next = newNode; newNode->prev = prevNode; newNode->next = currNode; if(currNode) { currNode->prev = newNode; } } } else { printf("No memory\n"); } } void printList(struct indexRecord *head) { struct indexRecord *currNode; currNode = head; if(currNode != NULL) { printf("%s - %s -",currNode->lastname,currNode->firstname); printPhones(currNode->phones); printf("%s \n",currNode->email); currNode = currNode->next; while(currNode != head) { printf("%s - %s -",currNode->lastname,currNode->firstname); printPhones(currNode->phones); printf("%s \n",currNode->email); currNode = currNode->next; } } else { printf("List Is Empty\n\n"); } printf("\n"); } Θέλω η λίστα να είναι διπλά συνδεδεμένη κυκλική αλλά μου πετάει segm. fault. Έκανα debugging αλλά δεν βρίσκω κάτι λάθος. ευχαριστώ εκ των προτέρων.
bxenos Δημοσ. 28 Μαΐου 2010 Δημοσ. 28 Μαΐου 2010 ένα λάθος είναι: > [color="Red"]currNode = *head;[/color] prevNode = NULL; while (([color="#ff0000"]currNode != *head[/color]) && (strcmp(sname,currNode->lastname) > 0)) ότι το loop δεν θα εκτελεστεί ποτέ. Στο debugging δεν σε παραξένεψε που δεν μπαίνει ποτέ μέσα; και τις αρχικές τιμές μήπως να τις κάνεις NULL; γιατι μετά δεν ενημερώνεις με σωστά δεδομένα > newNode->next = [color="Red"]*head[/color]; NULL newNode->prev = [color="Red"]*head;[/color] NULL Δεν έψαξα περισσότερο, δες το και πες τι έγινε. ---------- Προσθήκη στις 01:03 ---------- Προηγούμενο μήνυμα στις 00:50 ---------- εγω είχα απαντήσει στο θέμα του marsel "Πρόβλημα σε λίστα C" αλλά αυτό μετακινήθηκε στο "C debugging", ενώ η απάντηση μου παρέμηνε εδώ. Οπότε μήπως να μπεί και το μήνυμα μου στη θέση του;
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.