Προς το περιεχόμενο

Απορια για C -ασκηση σχολης-


πc stratos

Προτεινόμενες αναρτήσεις

λοιπον καλυσπερα εχω τον εξης κωδικα

 

>
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εις φορες

τι μπορει να φταει?εχω δοκιμασει τα παντα και δεν μπορω να σκεφτω μια λυση παρακαλω βοηθηστε με γιατι πρεπει να κανω καποια εργασια στην σχολη ευχαριστω

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημοσ. (επεξεργασμένο)

Ο κώδικας που δίνεις ούτε είναι σωστός (περιέχει αδήλωτα 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!

Επεξ/σία από migf1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

καλημερα

1)που ειναι ο κωδικας που χρησιμοποιεις για να εκτυπωσεις;

2)γιατι επιστρεφεις την μεταβλητη head που την περνας ως ορισμα και δεν την αλλαζεις πουθενα;

3)καταλαβαινεις γιατι το παρακατω ειναι τρυπα στο καυστικο οξυ;

>
if(d==NULL){
  d->ID= id;
  d->data->dat;
  d=new_dat;
 }

 

4) και βλεπουμε.....

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

καλημερα

...

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

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

καλα ο κωδικσας σαν κωδικας ειναι αλλαγμενος ως προς μεταβλητες απλα το edit υο εκανα στην φορμα συνταξης γιαυτο μου βγηκε ετσι χαλια....

 

>
if(d==NULL){
d->ID= id;
d->data->dat;
d=new_dat;
}

 

 

 

Η αιτια?

d αποτετλει το head μιας λιστας και ελεγχο αν ειναι αδειο..αν ειναι τοτε περναω ορισματα ωστε να δημιουργηθει

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

...

Η αιτια?

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 της υπογραφής μου μπορείς να διαβάσεις Ελληνικές σημειώσεις τόσο για τους δείκτες όσο και για τις λίστες.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

το d ειναι head ενος stracture που θελω να εισαγω στον κομβο της λιστας δλδ

καθε κομβος θα παιρνει ενα stracture τυπου Data αλλα μονο ενα γιαυτο δεν εχει next

το link θα το δω τωρα

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Φίλε π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 του εκάστοτε κόμβου της λίστας.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...