2010-05-17 8 views
2

Je suis encore nouveau dans les listes en C et je suis un gros problème ... Tout d'abord je veux vous montrer mon code pour insérer élément à la liste:liste Linked in C

void input_books_info(int number_of_books, BOOK *current) 
{ 
    int i; 
    for(i = 0; i < number_of_books; i++) 
    { 
     while(current->next != NULL) 
      current = current->next; 


     current->next = (BOOK *)malloc(sizeof(BOOK)); 

     printf_s("%d book catalog number: ", i + 1); 
     scanf_s("%s", &current->next->catalog_number , 20); 
     printf_s("%d book title: ", i + 1); 
     scanf_s("%s", current->next->title ,80); 
     printf_s("%d book author: ", i + 1); 
     scanf_s("%s", current->next->author ,40); 
     printf_s("%d book publisher: ", i+1); 
     scanf_s("%s", current->next->publisher,80); 
     printf_s("%d book price: ", i + 1); 
     scanf_s("%f", &current->next->price, 5); 
     printf_s("%d book year published: ", i + 1); 
     scanf_s("%d", &current->next->year_published, 5); 

     current->next->next = NULL; 
     printf_s("\n\n"); 
    } 



} 

Et voici ma fonction principale:

void main (void) 
{ 
    int number_of_books, t = 1; 
    char book_catalog_number[STRMAX]; 
    char book_title[STRMAX]; 
    char book_author[STRMAX]; 
    char reading_file[STRMAX]; 
    char saving_file[STRMAX]; 


    first = malloc(sizeof(BOOK)); 
    first->next = NULL; 
    /* 
    printf_s("Enter file name: "); gets(saving_file); 
    first->next = book_open(first, saving_file); 
    */ 
    while(t) 
    { 
     char m; 
     printf_s("1. Input \n0. Exit \n\n"); 
     printf_s("Choose operation: "); 
     m = getch(); 





     switch(m) 
     { 
      case '1': 
       printf_s("\ninput number of books: "); 
       scanf_s("%d", &number_of_books); 
       input_books_info(number_of_books, first); 
       printf_s("\n"); 
      break; 


      default: 
       printf_s("\nNo entry found!\n\n\n\n\n"); 
       break; 
     } 

    } 

} 

et dernier est le problème peut-être ici la fonction d'impression:

void print_books_info(BOOK *current) 
{ 
    while(current->next != NULL && current != NULL) 
    { 

     printf_s("%s, ", current->next->catalog_number); 
     printf_s("%s, ", current->author); 
     printf_s("%s, ", current->next->title); 
     printf_s("%s, ", current->next->author); 
     printf_s("%s, ", current->next->publisher); 
     printf_s("%.2f, ", current->next->price); 
     printf_s("%d", current->next->year_published); 
     printf_s("\n\n"); 
     current = current->next; 
    } 

} 

et mon problème est Lorsque je lance l'application, le programme bouge bien. Mais quand je démarre l'application, le programme ne stocke que la première entrée de données deuxième et troisième sont perdues ... Pouvez-vous m'aider à comprendre ... ???

+1

En print_books_info, vous devriez vérifier '' current' avant current-> next' dans l'état while. – drawnonward

+1

Pouvez-vous publier la structure que vous utilisez pour BOOK? –

+1

Comment le problème se manifeste-t-il? En d'autres termes, comment savez-vous que les deuxième et troisième livres sont "manquants"? Et que signifie "manquant"? Pouvez-vous nous montrer comment vous appelez 'print_books_info'? –

Répondre

1

je soupçonne que ce sont les scanf_s qui est en train de lire plus de champs que prévu. Au lieu de cela, utilisez un seul scanf_s pour lire toute la ligne dans un tampon, puis utilisez sscanf_s pour analyser le tampon.

En outre, puisque vous ne présentez pas la déclaration du livre, nous sommes tous tirer un peu à l'aveuglette, mais sont les éléments dans le livre correctement dimensionné? Sinon, il y aurait un écrasement d'élément pendant la lecture. Livre devrait ressembler à ceci:

class BOOK { 
     BOOK *next; 
     char catalog_number [20]; // at least 20 chars 
     char title [80]; 
     char author [40]; 
     char publisher [80]; 
     double price; 
     int year_published; 
}; 
+1

Je peux confirmer que c'est le scanf. Votre code fonctionne bien si je supprime tous les scanf et les remplace par cin (C++ seulement). Je suggère également d'utiliser getchar() au lieu de getch(). –

+0

Presque juste le prix flottant; – ScReYm0