πc stratos Δημοσ. 4 Νοεμβρίου 2012 Share Δημοσ. 4 Νοεμβρίου 2012 λοιπον καλυσπερα εχω τον εξης κωδικα > struct Data { int ID; int data; } ; struct DNode { struct Data* d; struct Dnode * prev; struct Dnode * next; } ; struct DNode *DInsert(struct DNode *head,int id,int dat){ struct Dinosaur *d,*new_data; struct DNode * curr,*new_node,*tmp; d=NULL; new_node=(struct DNode *)malloc(sizeof(struct DNode)); new_data=(struct Data *)malloc(sizeof(struct Data)); if(head==NULL){ new_node->next=NULL; head=new_node; if(d==NULL){ d->ID= id; d->data->dat; d=new_dat; } } else{ curr=head; while(curr->next!=NULL){ curr=curr->next; } curr->next = new_node; new_node->next = NULL; if(d==NULL){ d->ID=id; d->data=dat; d=new_dat; } } return(head); Το προβλημα μου ειναι οτι οταν εισαγω σε καθε κομβο για δεδομενα μια stracture τυπου Data ναι μεν θυμαται οταν τα εκτυπωνω μεμονομενα,αλλα οταν κανω εκτυπωση πχ 4 κομμβους της DNode λιστας εκτυπωνει τα περιεχομενα της τελευταιας 4εις φορες τι μπορει να φταει?εχω δοκιμασει τα παντα και δεν μπορω να σκεφτω μια λυση παρακαλω βοηθηστε με γιατι πρεπει να κανω καποια εργασια στην σχολη ευχαριστω Συνδέστε για να σχολιάσετε Κοινοποίηση σε άλλες σελίδες άλλες επιλογές
migf1 Δημοσ. 4 Νοεμβρίου 2012 Share Δημοσ. 4 Νοεμβρίου 2012 (επεξεργασμένο) Ο κώδικας που δίνεις ούτε είναι σωστός (περιέχει αδήλωτα structs και μεταβλητές και προφανώς δεν κάνει καν compile) ούτε μας βοηθάει γιατί δεν έχει καμία σχέση με εκτύπωση (επίσης είναι αχρείαστα δυσανάγνωστος, ασυνεπής ως προς την σύνταξή του και αχρείαστα συμπυκνωμένος σε αρκετά του σημεία)... δες λίγο το spoiler... > struct DNode *DInsert( struct DNode *head,int id, int dat ) { struct Dinosaur *d, *new_data; // από που ξεφύτρωσε το struct Dinosaur? struct DNode *curr, *new_node, *tmp; d = NULL; new_node = malloc( sizeof(struct DNode) ); // δεν χρειάζεται cast το malloc (χρειάζεται όμως έλεγχο αποτυχίας) new_data = malloc( sizeof(struct Data) ); // δεν χρειάζεται cast το malloc (χρειάζεται όμως έλεγχο αποτυχίας) if( head == NULL ){ new_node->next = NULL; head = new_node; if ( d == NULL ){ d->ID = id; d->data->dat; // μάλλον εννοείς: d->data = dat; d = new_dat; } } else { curr = head; while ( curr->next != NULL ) { curr = curr->next; } curr->next = new_node; new_node->next = NULL; if ( d == NULL ) { d->ID = id; d->data = dat; d = new_dat; } } return head; // το return δεν χρειάζεται παρενθέσεις } EDIT Δοκίμασε με αυτό τον κώδικα για insertions... > struct Data { int ID; int data; }; struct DNode { struct Data *d; struct Dnode *prev; struct Dnode *next; }; // --------------------------------------- struct DNode *DInsert( struct DNode *head, int id, int dat ) { struct DNode *newNode = NULL, *walk = NULL; // make & init new DNode node newNode = malloc( sizeof(struct DNode) ); if ( NULL == newNode ) return head; newNode->d = newNode->prev = newNode->next = NULL; // make newNode's data & init them to the specified values newNode->d = malloc( sizeof(struct Data) ); if ( NULL == newNode->d ) { free( newNode ); return head; } newNode->d->ID = id; newNode->d->data = dat; // insert newNode as the last node of the list which starts from head // special case: empty list if( NULL == head ) { head = newNode; return head; } // general case: non-empty list // go to the last node of the list walk = head; while ( NULL != walk->next) walk = walk->next; // insert newNode as the last node newNode->prev = walk; walk->next = newNode; return head; } ΥΓ. Δεν τον έχω τεστάρει, οπότε μπορεί να περιέχει bugs! Επεξ/σία 4 Νοεμβρίου 2012 από migf1 Συνδέστε για να σχολιάσετε Κοινοποίηση σε άλλες σελίδες άλλες επιλογές
georgemarios Δημοσ. 4 Νοεμβρίου 2012 Share Δημοσ. 4 Νοεμβρίου 2012 καλημερα 1)που ειναι ο κωδικας που χρησιμοποιεις για να εκτυπωσεις; 2)γιατι επιστρεφεις την μεταβλητη head που την περνας ως ορισμα και δεν την αλλαζεις πουθενα; 3)καταλαβαινεις γιατι το παρακατω ειναι τρυπα στο καυστικο οξυ; > if(d==NULL){ d->ID= id; d->data->dat; d=new_dat; } 4) και βλεπουμε..... Συνδέστε για να σχολιάσετε Κοινοποίηση σε άλλες σελίδες άλλες επιλογές
migf1 Δημοσ. 4 Νοεμβρίου 2012 Share Δημοσ. 4 Νοεμβρίου 2012 καλημερα ... 2)γιατι επιστρεφεις την μεταβλητη head που την περνας ως ορισμα και δεν την αλλαζεις πουθενα; .. Το συγκεκριμένο ως λογική είναι σωστό (αλλά προφανώς με λάθος υλοποίηση). Δηλαδή περνάς στην συνάρτηση την αρχή της λίστας σου ( στο όρισμα head ), προσθέτεις το νέο κόμβο στη λίστα και στο τέλος επιστρέφεις ξανά το όρισμα head. Οπότε αν ή λίστα σου είναι π.χ... > DNode *list = NULL; καλείς την DInsert ως εξής... > list = DInsert( list, 0, 0 ); if ( NULL == list ) // handle failure here Μια εναλλακτική είναι να περνάς by-ref τον δείκτη list (προφανώς με άλλον κώδικα) και π.χ. η συνάρτηση να επιστρέφει true/false... > if ( !DInsert(&list, 0, 0) ) // handle failure here Συνδέστε για να σχολιάσετε Κοινοποίηση σε άλλες σελίδες άλλες επιλογές
πc stratos Δημοσ. 4 Νοεμβρίου 2012 Μέλος Share Δημοσ. 4 Νοεμβρίου 2012 καλα ο κωδικσας σαν κωδικας ειναι αλλαγμενος ως προς μεταβλητες απλα το edit υο εκανα στην φορμα συνταξης γιαυτο μου βγηκε ετσι χαλια.... > if(d==NULL){ d->ID= id; d->data->dat; d=new_dat; } Η αιτια? d αποτετλει το head μιας λιστας και ελεγχο αν ειναι αδειο..αν ειναι τοτε περναω ορισματα ωστε να δημιουργηθει Συνδέστε για να σχολιάσετε Κοινοποίηση σε άλλες σελίδες άλλες επιλογές
georgemarios Δημοσ. 4 Νοεμβρίου 2012 Share Δημοσ. 4 Νοεμβρίου 2012 προσεξε αν η d ειναι NULL τοτε το d->ID τι ειναι; με το που θα κανεις το d->οτιδηποτε = οτιδηποτε, το προγραμμα θα κρασαρει Συνδέστε για να σχολιάσετε Κοινοποίηση σε άλλες σελίδες άλλες επιλογές
migf1 Δημοσ. 4 Νοεμβρίου 2012 Share Δημοσ. 4 Νοεμβρίου 2012 ... Η αιτια? d αποτετλει το head μιας λιστας και ελεγχο αν ειναι αδειο..αν ειναι τοτε περναω ορισματα ωστε να δημιουργηθει Δεν σε πιάνω. Καταρχήν αν τo d αποτελεί αρχή λίστας, τότε το struct Data θα έπρεπε να περιέχει τουλάχιστον έναν δείκτη next. Έπειτα, αν το d ισούται με NULL, τότε τόσο το... >d->ID= id όσο και το .... >d->data->dat; δίνουν seg-fault, μιας και ισοδυναμούν με NULL->id = id και NULL->data->dat, αντίστοιχα. Επίσης, τι ακριβώς νομίζεις πως κάνει η γραμμή: d->data->dat; ΥΓ. Στο link της υπογραφής μου μπορείς να διαβάσεις Ελληνικές σημειώσεις τόσο για τους δείκτες όσο και για τις λίστες. Συνδέστε για να σχολιάσετε Κοινοποίηση σε άλλες σελίδες άλλες επιλογές
πc stratos Δημοσ. 4 Νοεμβρίου 2012 Μέλος Share Δημοσ. 4 Νοεμβρίου 2012 το d ειναι head ενος stracture που θελω να εισαγω στον κομβο της λιστας δλδ καθε κομβος θα παιρνει ενα stracture τυπου Data αλλα μονο ενα γιαυτο δεν εχει next το link θα το δω τωρα Συνδέστε για να σχολιάσετε Κοινοποίηση σε άλλες σελίδες άλλες επιλογές
migf1 Δημοσ. 4 Νοεμβρίου 2012 Share Δημοσ. 4 Νοεμβρίου 2012 Φίλε πc stratos, αυτά που περιγράφεις με λόγια δεν προκύπτουν από τον κώδικα που έχεις ποστάρει. Επίσης υποπτεύομαι πως χρησιμοποιείς ορολογίες διαφορετικά από ότι τις ξέρουμε. Για παράδειγμα, όταν λέμε δείκτης head εννοείται αυτονόητα πως πρόκειται για έναν δείκτη που δείχνει στον 1ο κόμβο μιας λίστας (απλής, διπλής ή οτιδήποτε). Οπότε η φράση... το d ειναι head ενος stracture που θελω να εισαγω στον κομβο της λιστας δλδ καθε κομβος θα παιρνει ενα stracture τυπου Data αλλα μονο ενα γιαυτο δεν εχει next δεν βγάζει νόημα. Και κυρίως δεν προκύπτει από τον κώδικα που έχεις ποστάρει. Ο κώδικας που έχεις ποστάρει περιγράφει μια διπλά συνδεδεμένη λίστα, ο κάθε κόμβος της οποίας είναι τύπου struct DNode, και αποτελείται από έναν δείκτη d τύπου strutc Data, έναν δείκτη prev τύπου struct DNode κι έναν δείκτη next τύπου struct DNode. Ο ορισμός του struct Data δεν παραπέμεπει σε καμία λίστα, αλλά σε ένα απλό struct. To όρισμα head που περνάς στην συνάρτηση DInsert() είναι ορισμένο ως δείκτης σε struct DNode (όπως είναι αναμενόμενο) οπότε δεν προκύπτει από πουθενά, ούτε πως το DNode->d είναι λίστα, ούτε πως το DNode->d είναι head δείκτης κάποιας λίστας, και προφανώς ούτε πως το όρισμα head αφορά το πεδίο d του εκάστοτε κόμβου της λίστας. Συνδέστε για να σχολιάσετε Κοινοποίηση σε άλλες σελίδες άλλες επιλογές
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα