alan2 Δημοσ. 29 Μαρτίου 2012 Δημοσ. 29 Μαρτίου 2012 Το πρόγραμμα που εχω φτιάξει προσπαθεί να ορίσει μια απλη συνδεδεμένη λίστα και να προσθέσει ένα κόμβο με δεδομένα(στοιχεία αποδείξεων). Δεν εχω καταλάβει καλα τις λίστες με το εγχειρίδιο της σχολής που διαβαζω, αν μπορείτε προτείνετε μου κανενα βιβλίο καλο για λίστες C.Σίγουρα έχω λάθη, γιατι το πρόγραμμα τρεχει δεχεται καποια δεδομένα και κρασαρει. Tι λαθος γίνεται? >#include <stdio.h> #include <stdlib.h> #include <string.h> struct list_node { char afm[10]; int day; int month; float amount; char receipt_number[17]; struct list_node *next; }; list_node *dhmiourgia_apod(char a[],int d,int m,float am,char rm[]) { list_node *p; p=(list_node *)malloc(sizeof(list_node)); strcpy(p->afm,a); p->day=d; p->month=m; p->amount=am; strcpy(p->receipt_number,rm); return p; } struct list_node *eisagwgi_apod(list_node *thiki,char a[],int d,int m,float am,char rm[]) { list_node *g; list_node *l; g=dhmiourgia_apod( a, d, m, am, rm); l=thiki; while(l->next!=NULL) l=l->next; l->next=g; g->next=NULL; } main(){ char a[10];int d;int m;float am; char rm[17]; struct list_node *start= NULL ; scanf("%s", &a[10]) ; scanf("%s", &rm[17]) ; scanf("%d", &d) ; scanf("%f", &am) ; scanf("%d", &m) ; start = eisagwgi_apod(start,a,d,m,am,rm); }
we_will_rise Δημοσ. 29 Μαρτίου 2012 Δημοσ. 29 Μαρτίου 2012 Με μια γρήγορη ματιά, στην μέθοδο δημιουργίας απόδειξης, βάζεις όλα τα στοιχεία του struct, εκτός από το *next (που είναι τύπου list_node).. Για να αποφύγεις τα errors, κατά την δημιουργία της λίστας μπορείς να ορίζεις ως *next = this, και μετά όταν την τοποθετήσεις, αλλάζεις το next για να πάει στην θέση που θέλεις επίσης, αν η εισαγωγή απόδειξης επιστρέφει αντικείμενου τύπου list_node, τότε κακώς έγραψες το struct στην αρχή του struct list_node *eisagwgi_apod(list_node *thiki,char a[],int d,int m,float am,char rm[])
migf1 Δημοσ. 29 Μαρτίου 2012 Δημοσ. 29 Μαρτίου 2012 ...Δεν εχω καταλάβει καλα τις λίστες με το εγχειρίδιο της σχολής που διαβαζω, αν μπορείτε προτείνετε μου κανενα βιβλίο καλο για λίστες C.... Ρίξε μια ματιά στο link της υπογραφής μου, ίσως σε βοηθήσουν οι σημειώσεις μου και δεν χρειαστείς βιβλίο.
georgemarios Δημοσ. 30 Μαρτίου 2012 Δημοσ. 30 Μαρτίου 2012 > main(){ char a[10];int d;int m;float am; char rm[17]; struct list_node *start= NULL ; scanf("%s", a) ; // <<-------------------------- scanf("%s", rm) ; // <<-------------------------- scanf("%d", &d) ; scanf("%f", &am) ; scanf("%d", &m) ; start = eisagwgi_apod(start,a,d,m,am,rm); } και > struct list_node *eisagwgi_apod(list_node *thiki, char a[], int d, int m, float am, char rm[]) { list_node *g; list_node *l; g = dhmiourgia_apod(a, d, m, am, rm); if (thiki != NULL) { // <<-------------------------- l = thiki; while (l->next != NULL) l = l->next; l->next = g; } g->next = NULL; return g; // <<-------------------------- }
alan2 Δημοσ. 1 Απριλίου 2012 Μέλος Δημοσ. 1 Απριλίου 2012 ευχαριστώ. Εχω template για την ασκηση, αλλα εχει ελληνικά που δεν φαινοντα καλα στο φορουμ.Στο template πρέπει να γεμίσω κενα, οπως η εισαγωγή της ημερομηνίας. Δεν μπορώ να γράψω > temp = (struct list_node *) malloc(sizeof(struct list_node)); .. printf("Hmera (1-31): "); do{ scanf("%d",&temp->day); }while(temp->day<1 || temp->day>31); για να βαλω τιμή day στο προσωρινό κόμβο τεμπ? το πρόγραμμα κολλαει στην εισαγωγή της τιμής.
georgemarios Δημοσ. 1 Απριλίου 2012 Δημοσ. 1 Απριλίου 2012 Δεν έχω προχειρο compiler να δοκιμάσω αλλα δοκίμασε να βαλεις σε παρενθεση το temp->day >scanf("%d",&(temp->day)); εναλλακτικα > int tmpDay; scanf("%d",&tmpDay); temp->day = tmpDay;
alan2 Δημοσ. 1 Απριλίου 2012 Μέλος Δημοσ. 1 Απριλίου 2012 ευχαριστώ. επισης προσπαθώ να κάνω αναζήτηση με τη συνάρτηση >void search_by_afm(struct list_node *node, char afm[]) { while(node->next!=NULL){ if (node->afm[10]==afm[10])break; else printf("%s",&node->afm[10]); node=node->next; } } που καλείται απο το main() με > search_by_afm(receipts, afm) ; δεν θα επρεπε να τυπώνει το afm?
georgemarios Δημοσ. 3 Απριλίου 2012 Δημοσ. 3 Απριλίου 2012 πράγματι.... > void search_by_afm(struct list_node *node, char afm[]) { do { if (strcmp(node->afm, afm) == 0) // ο σωστός τρόπος να συγκρίνεις strings { printf("%s node found", node->afm); // βρεθηκε ο κόμβος, κανε πραγματα με αυτον και επεστρεψε break; } else { printf("%s", node->afm); // απλα τυπωσε αφμ ή μη κανεις τιποτε..... } node = node->next; } while (node->next != NULL); }
alan2 Δημοσ. 4 Απριλίου 2012 Μέλος Δημοσ. 4 Απριλίου 2012 (επεξεργασμένο) 1000 ευχαριστω edit ηθελα να τυπωνω το κωδικό της απόδειξης της οποίας δινεται το αφμ και εγραψα >void search_by_afm(struct list_node *node, char afm[]) { do { if (strcmp(node->afm, afm) == 0) // ο σωστός τρόπος να συγκρίνεις strings { printf("%s node found", node->receipt_number[17]); // βρεθηκε ο κόμβος, τυπωσε το κωδικό αποδειξης(?) break; } else { printf("%s", node->afm); // απλα τυπωσε αφμ ή μη κανεις τιποτε..... } node = node->next; } while (node->next != NULL); αλλα κολάει αντι να γραψει το receipt_number edit Για καποιο λόγο επρεπε να σβήσω το [17] Επεξ/σία 6 Απριλίου 2012 από alan2
alan2 Δημοσ. 11 Απριλίου 2012 Μέλος Δημοσ. 11 Απριλίου 2012 εξασφαλίζουμε ομως ετσι οτι η αναζήτηση γίνεται απο την αρχή της λίστας?
georgemarios Δημοσ. 11 Απριλίου 2012 Δημοσ. 11 Απριλίου 2012 εξασφαλίζουμε ομως ετσι οτι η αναζήτηση γίνεται απο την αρχή της λίστας? αμα του δώσεις σαν όρισμα τον 1ο κόμβο..... προφανώς. Αμα του δώσεις τον μεσαίο θα ξεκινησει απο τη μέση....
alan2 Δημοσ. 14 Απριλίου 2012 Μέλος Δημοσ. 14 Απριλίου 2012 κατάλαβα! στη συνέχεια πρέπει να γράψω μία συνάρτηση που να βρίσκει τα ελάχιστα και μεγιστα node->amount. πρεπει να οριζεται >void min_max(struct list_node *node, float *min, float *max) και καλείται με >min_max(receipts, &min, &max); εγραψα >void min_max(struct list_node *node, float *min, float *max) { int i,x; *min=node->amount; *max=node->amount; while(node!=NULL){ if (node->amount > *max)*max=node->amount; else if (node->amount < *min)*min=node->amount; node->next; }} που δεν τρέχει.
georgemarios Δημοσ. 14 Απριλίου 2012 Δημοσ. 14 Απριλίου 2012 κατάλαβα! στη συνέχεια πρέπει να γράψω μία συνάρτηση που να βρίσκει τα ελάχιστα και μεγιστα node->amount. πρεπει να οριζεται >void min_max(struct list_node *node, float *min, float *max) και καλείται με >min_max(receipts, &min, &max); εγραψα >void min_max(struct list_node *node, float *min, float *max) { int i,x; *min=node->amount; *max=node->amount; while(node!=NULL){ if (node->amount > *max)*max=node->amount; else if (node->amount < *min)*min=node->amount; node = node->next; //<------------ΕΔΩ }} που δεν τρέχει. Δε το δοκίμασα, μπορει να έχει και άλλα προβλήματα....
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα