kingofcool Δημοσ. 17 Νοεμβρίου 2011 Δημοσ. 17 Νοεμβρίου 2011 Καλησπερα Εχω να υλοποιησω μια ασκηση σε c με συναρτησεις για εισαγωγη, διαγραφη και αναζητηση στοιχειου σε λιστες.Η εισαγωγη γινεται σε ταξινομημενη λιστα.Με μια δικια μου main που ελεγξα,συνεχιζει να μου βγαζει segmentation fault το προγραμμα οτι και αν αλλαξω στον κωδικα. Αν μπορουσε να βοηθησει καποιος θα ημουν υποχρεος Εδω ο κωδικας: >struct b{ int data; struct b *next; }; void Insert(int, struct b *); void Delete(int, struct b *); int LookUp(int, struct b *); void Insert(int data, struct book *v){ struct b *List = v, *pList = NULL, *item; if(List == NULL){ List = (struct book *)malloc(sizeof(struct book)); List->data = data; List->next = NULL; } else{ while(List != NULL){ if(List->data > data){ break; } pList = List; List = List->next; } item = (struct book *)malloc(sizeof(struct book)); item->data = data; pList->next = item; item->next = List; } } void Delete(int data, struct book *v){ struct b *List = v, *temp; while(List != NULL){ if(List->data == data){ temp = (struct book *)malloc(sizeof(struct book)); temp = List->next; List->data = List->next->data; List->next = temp->next; free(temp); } List = List->next; } } int LookUp(int data, struct book *v){ struct b *List = v; while(List != NULL){ if(List->data != data){ List = List->next; } else return 1; } return 0; }
nilosgr Δημοσ. 17 Νοεμβρίου 2011 Δημοσ. 17 Νοεμβρίου 2011 Τα prototype των συναρτυσεων πρεπει να ειναι αυτα;
migf1 Δημοσ. 17 Νοεμβρίου 2011 Δημοσ. 17 Νοεμβρίου 2011 Αυτή τη στιγμή δεν έχω χρόνο να το κοιτάξω, πες μας όμως σε ποια συνάρτηση χτυπάει στο run-time. Πες μας επίσης αν σου βγάζει warnings κατά το compilation (αν είσαι με gcc, βάλε -Wall -Wextra στο command line του). Το μόνο που μπορώ αυτή τη στιγμή είναι να σου δώσω 2 εκδοχές συναρτήσεων εισαγωγής σε ταξινομημένα λίστα, μια με by value πέρασμα και μια by ref... > /* ------------------------------------------------------------------ * Ascending order Insertion of data into list (passing the list By Reference) */ Bool list_insascend( List **list, int data ) { List *head = NULL, *prev = NULL; List *new = calloc( 1, sizeof(struct node) ); if ( !new ) return FALSE; new->data = data; new->next = NULL; if ( !*list ) { *list = new; return TRUE; } // find spot for the insertion head = prev = *list; while ( head && head->data <= data ) { // use <= data, to allow duplicates prev = head; // save previous node head = head->next; } // case 1: insert BEFORE 1st node if ( *list == head ) { *list = new; new->next = head; return TRUE; } // case 2: insert AFTER 1st node (anywhere between first and last node) if ( !head || head->data != data ) { prev->next = new; new->next = head; } return TRUE; } /* ------------------------------------------------------------------ * Descending order Insertion of data into list (passing the list By Value) */ List *vlist_insdescend( List *list, int data ) { List *head = NULL, *prev = NULL; List *new = calloc( 1, sizeof(struct node) ); if ( !new ) return list; new->data = data; new->next = NULL; if ( !list ) return new; // find spot for the insertion head = prev = list; while ( head && head->data > data ) { // use >= data, to allow duplicates prev = head; // save every previous node head = head->next; } // case 1: insert BEFORE 1st node if ( list == head ) { list = new; new->next = head; return list; } // case 2: insert AFTER 1st node (anywhere between first and last node) if ( !head || head->data != data ) { prev->next = new; new->next = head; } return list; }
kingofcool Δημοσ. 17 Νοεμβρίου 2011 Μέλος Δημοσ. 17 Νοεμβρίου 2011 Το τρέχω με αυτή την main: >#include <stdio.h> #include <stdlib.h> struct b{ int data; struct b *next; }; void Insert(int, struct b *); void Delete(int, struct b *); int LookUp(int, struct b *); int main(){ struct b* v; int d, i; for(i=0;i<=2;i++){ printf("Dwse data."); scanf("%d", &d); Insert(d, v); } for(i=0;i<=2;i++){ printf("%d", v->data); v = v-> next; } } void Insert(int data, struct b *v){ struct b *List = v, *pList = NULL, *item; if(List == NULL){ List = (struct b *)malloc(sizeof(struct ); List->data = data; List->next = NULL; } else{ while(List != NULL){ if(List->data > data){ break; } pList = List; List = List->next; } item = (struct b *)malloc(sizeof(struct ); item->data = data; pList->next = item; item->next = List; } } void Delete(int data, struct b *v){ struct b *List = v, *temp; while(List != NULL){ if(List->data == data){ temp = (struct b *)malloc(sizeof(struct ); temp = List->next; List->data = List->next->data; List->next = temp->next; free(temp); } List = List->next; } } int LookUp(int data, struct b *v){ struct b *List = v; while(List != NULL){ if(List->data != data){ List = List->next; } else return 1; } return 0; } και βγαζει segmentation εδω: >while(List != NULL){ if(List->data > data){ break; }
migf1 Δημοσ. 17 Νοεμβρίου 2011 Δημοσ. 17 Νοεμβρίου 2011 Δεν έχω ευκαιρήσει ακόμα να ασχοληθώ, με 1η ματιά όμως βλέπω πως παρόλο που η Insert() δεν επιστρέφει τίποτα, της περνάς το v by value. Αυτό συνδυασμένο με το γεγονός πως όταν ορίζεις το v στη main() το αφήνεις χωρίς αρχικοποίηση, είναι σίγουρο πως θα βαρέσει seg-fault όταν πας να τυπώσεις το v->data μέσα στο for-loop της main(). Αυτά χωρίς να έχω δει καν τον κώδικα της Insert() ! Εφόσον το v το περνάς by value στη Insert() ή θα πρέπει στη main() να την καλέσεις με ανάθεση στο v... > ... v = Insert(d, v); ... ή θα πρέπει το v να το περνάς by reference στην Insert(), οπότε στη main() θα την καλείς ως εξής... > ... Insert(d, &v); ... Επαναλαμβάνω, τα παραπάνω χωρίς να έχω δει τον κώδικα της Insert(). Ποτέ μην αφήνει δείκτες χωρίς αρχικοποίηση! Κάνε το συνήθεια να τους αρχικοποιείς όταν τους ορίζεις! ΥΓ. Εδώ μπορείς να διαβάσεις σημειώσεις μου για Linked Lists (και για pointers και για strings). EDIT: Αν δεν ξέρεις τι είναι το by value και τι το by reference (πράγμα απίθανο αφού έχετε φτάσει σε λίστες), ίσως σου φανεί χρήσιμο να πας απευθείας εδώ
kingofcool Δημοσ. 17 Νοεμβρίου 2011 Μέλος Δημοσ. 17 Νοεμβρίου 2011 Aλλαξα την Insert ουτως ωστε να παιρνει σαν ορισμα το struct οπως πριν αλλα να επιστρεφει το struct γεμισμενο με στοιχεια καθε φορα.Δουλευει για ενα στοιχειο αλλα οταν παω να προσθεσω περισοτερα πεταει seg.Και συγκεκριμενα βγαζει αυτα: In function 'Insert': warning: control reaches end of non-void function και In function 'main': warning: control reaches end of non-void function
migf1 Δημοσ. 18 Νοεμβρίου 2011 Δημοσ. 18 Νοεμβρίου 2011 Πιστεύω σου έχω δώσει ήδη ότι πληρφορίες χρειάζεσαι, μέχρι και έτοιμο κώδικα.
kingofcool Δημοσ. 18 Νοεμβρίου 2011 Μέλος Δημοσ. 18 Νοεμβρίου 2011 Ευχαριστω για την βοηθεια.Αλλου ηταν το προβλημα τελικα αλλα λυθηκε!
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα