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

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

Δημοσ.

Το πρόγραμμα που εχω φτιάξει προσπαθεί να ορίσει μια απλη συνδεδεμένη λίστα και να προσθέσει ένα κόμβο με δεδομένα(στοιχεία αποδείξεων). Δεν εχω καταλάβει καλα τις λίστες με το εγχειρίδιο της σχολής που διαβαζω, αν μπορείτε προτείνετε μου κανενα βιβλίο καλο για λίστες 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);
          }

Δημοσ.

Με μια γρήγορη ματιά, στην μέθοδο δημιουργίας απόδειξης, βάζεις όλα τα στοιχεία του 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[])

Δημοσ.

...Δεν εχω καταλάβει καλα τις λίστες με το εγχειρίδιο της σχολής που διαβαζω, αν μπορείτε προτείνετε μου κανενα βιβλίο καλο για λίστες C....

Ρίξε μια ματιά στο link της υπογραφής μου, ίσως σε βοηθήσουν οι σημειώσεις μου και δεν χρειαστείς βιβλίο.

Δημοσ.

>
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;   // <<--------------------------
}

Δημοσ.

ευχαριστώ. Εχω 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 στο προσωρινό κόμβο τεμπ?

το πρόγραμμα κολλαει στην εισαγωγή της τιμής.

Δημοσ.

Δεν έχω προχειρο compiler να δοκιμάσω αλλα δοκίμασε να βαλεις σε παρενθεση το temp->day

>scanf("%d",&(temp->day));

 

εναλλακτικα

>
int tmpDay;
scanf("%d",&tmpDay);
temp->day = tmpDay;

Δημοσ.

ευχαριστώ. επισης προσπαθώ να κάνω αναζήτηση με τη συνάρτηση

 

>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?

Δημοσ.

πράγματι....

 

>
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);
}

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

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]

Επεξ/σία από alan2
Δημοσ.

εξασφαλίζουμε ομως ετσι οτι η αναζήτηση γίνεται απο την αρχή της λίστας?

αμα του δώσεις σαν όρισμα τον 1ο κόμβο..... προφανώς. Αμα του δώσεις τον μεσαίο θα ξεκινησει απο τη μέση....

Δημοσ.

κατάλαβα!

 

στη συνέχεια πρέπει να γράψω μία συνάρτηση που να βρίσκει τα ελάχιστα και μεγιστα 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;
}}

που δεν τρέχει.

Δημοσ.

κατάλαβα!

 

στη συνέχεια πρέπει να γράψω μία συνάρτηση που να βρίσκει τα ελάχιστα και μεγιστα 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;  //<------------ΕΔΩ
}}

που δεν τρέχει.

Δε το δοκίμασα, μπορει να έχει και άλλα προβλήματα....

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

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

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

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

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

Σύνδεση

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

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