Debug che non riesco a comprendere.

di Anonimizzato13124 il
18 risposte
Sono alle prese con questa lista e in particolar modo c'è la funzione delete_to list che dovrebbe cancellare tutta la lista.
Il mio prof almeno l'ha fatta cosi.
Adesso vi chiedo , all'interno del main va dichiarata cosi , e quindi come la delete_to _record?
In questo modo , una volta inserito il nome e messo nella variabile trial , ciò che succede è una stampa di caratteri senza senso e dopo qualche secondo un DEBUG.
Mi potete aiutare per favore a capire cos'è che non va.


#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define DIM 50
#define FILENAME "test.dat"



struct stud{
       char nome[DIM];
       char cognome[DIM];
       char voto[DIM];
       struct stud *next;
       };
       
       typedef struct stud *stud_p;
       
       
       void print_list(stud_p p);
       int mygetline(char buffer_line[],int Max_l);
       stud_p Add_to_list(stud_p head,char nome[],char cognome[],char voto[]);
       stud_p delete_list(stud_p head, char key[]);
       stud_p delete_record(stud_p head, char key[]);
      
       main(){
               char buffer_nome[DIM];
               char buffer_cognome[DIM];
               char buffer_voto[DIM];
               int cont;
              
               char trial[DIM];
              
               
              
                stud_p head=NULL;
                
                          while(cont){
                                   
                                      
                          printf("Inserire nome alunno :");
                          mygetline(buffer_nome,DIM);
                          if(strcmp(buffer_nome,"exit")==0)
                          break;
                          
                          printf("Inserire cognome alunno :");
                          mygetline(buffer_cognome,DIM);
                          if(strcmp(buffer_cognome,"exit")==0)
                          break;
                          
                          printf("Inserire voto alunno :");
                          mygetline(buffer_voto,DIM);
                          
                          if(strcmp(buffer_voto,"exit")==0)
                          break;
                          
                          printf("\n\nPer terminare digitare exit. . .\n\n");
                          if(strcmp(buffer_nome,"")!=0&&strcmp(buffer_cognome,"")!=0&&strcmp(buffer_voto,"")!=0)
                           
                          head=Add_to_list(head,buffer_nome,buffer_cognome,buffer_voto);
                          
                          print_list(head);
                          
                         
                           }
                           
                           printf("\n\n cancellare lista: \n\n");
                           printf("inserire nome: ");
                           scanf("%s",&trial);
                           head = delete_list(head, trial);
                           //head = delete_record(head, trial);
                           printf("\n\n");
                           print_list(head);
                           system("pause");
                           }
                           
                                                       

 void print_list(stud_p p)      
{
 int i=1;
 while(p!=NULL)
 {
     printf("%d) nome: %s\ncognome: %s\nvoto: %s\n",i++,p->nome,p->cognome,p->voto);
     p=p->next;
 }
 }
 
          
    int mygetline(char buffer_line[],int Max_l)
{
    int c,i;
    i=0;
    while((c=getchar())!='\n'&&i<Max_l)
    buffer_line[i++]=c;
    buffer_line[i]='\0';
    return i;
} 

         
          stud_p Add_to_list(stud_p head,char nome[],char cognome[],char voto[])
{
      stud_p p;
      stud_p curr;
      
      p=(stud*)malloc(sizeof(stud));
      strcpy(p->nome,nome);
      strcpy(p->cognome,cognome);
      strcpy(p->voto,voto);
      
      p->next=NULL;
      
      if(head==NULL)
      return p;
      
      else
      {
          curr=head;
          while(curr->next!=NULL)
          curr=curr->next;
          curr->next=p;
          return head;
          }
          }  
          
          
   stud_p delete_record(stud_p head, char key[])
{
    stud*temp, *prev, *t;
    int found =0;
    if(head==NULL)
        return head;
    
    
    if(strcmp(head->nome,key)==0)
    {
        temp=head;
        head=head->next;
        free(temp);
        return(head);
    }
    
    temp=head->next;
    prev= head;
    
    while(temp!= NULL && found ==0)
    {
        if( strcmp(temp->nome,key)==0)
        {
            found =1;
        }
        else
        {
            prev= temp;
            temp=temp->next;
        }
    }
    
    if(found!=0)
    {
        //il record è presente
        prev->next = temp->next;
        free(temp);
        
    }
    
    return head;
    
}  
 
stud_p delete_list(stud_p head, char key[])
{
    stud*temp;
    if(head==NULL)
        return head;
    if(strcmp(head->nome,key)==0)
    {
        temp=head;
        temp=temp->next;
        free(temp);
    }
    temp=head;
    while(temp->next!=NULL)
    {
        temp=temp->next;
    }
    temp->next=head;
    free(temp);
}


18 Risposte

  • "Succede un DEBUG" ??

    Ma che dici?
  • "Si è verificato un errore...."
  • Che poi veramente forse sbaglio a impostare qualcosa nel main perche dovrebbe eliminare tutta lista ma ora che ci penso non ha senso inserire un nome e metterlo nella variabile trial.
    Al mio prof funzionava però questo programma..
  • Beh, cominci a ragionare ... se devi eliminare tutta la lista, non ha senso chiedere un nome e fornirlo ad una funzione ...

    E poi la funzione di cui hai parlato si chiama

    delete_to_list

    mentre quella che c'è nel codice (ed è comunque sbagliata) è

    delete_list
  • Ma è sbagliata la funzione in sè oppure il modo in cui viene richiamata all'interno del main?
  • Non è questa la domanda che devi fare.

    Tu vuoi una funzione che cancella tutta la lista? Quella funzione non cancella tutta la lista.

    Vuoi una funzione che cancella un solo elemento della lista? Quella funzione *dovrebbe* cancellare un elemento della lista ma non è scritta correttamente.
  • Ok!!!
  • #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #define DIM 50
    #define FILENAME "test.dat"
    
    
    
    struct stud{
           char nome[DIM];
           char cognome[DIM];
           char voto[DIM];
           struct stud *next;
          
           };
           
           typedef struct stud *stud_p;
           
           
           void print_list(stud_p p);
           int mygetline(char buffer_line[],int Max_l);
           stud_p Add_to_list(stud_p head,char nome[],char cognome[],char voto[]);
           //void destroy(stud* h);
          void delete_list(stud_p head) ;
          void delete_node(stud_p node);
           main(){
                   char buffer_nome[DIM];
                   char buffer_cognome[DIM];
                   char buffer_voto[DIM];
                   int cont;
                   int a;
                   char trial[DIM];
                  
                   
                  
                    stud_p head=NULL;
                    
                              while(cont){
                                       
                                          
                              printf("Inserire nome alunno :");
                              mygetline(buffer_nome,DIM);
                              if(strcmp(buffer_nome,"exit")==0)
                              break;
                              
                              printf("Inserire cognome alunno :");
                              mygetline(buffer_cognome,DIM);
                              if(strcmp(buffer_cognome,"exit")==0)
                              break;
                              
                              printf("Inserire voto alunno :");
                              mygetline(buffer_voto,DIM);
                              
                              if(strcmp(buffer_voto,"exit")==0)
                              break;
                              
                              printf("\n\nPer terminare digitare exit. . .\n\n");
                              if(strcmp(buffer_nome,"")!=0&&strcmp(buffer_cognome,"")!=0&&strcmp(buffer_voto,"")!=0)
                               
                              head=Add_to_list(head,buffer_nome,buffer_cognome,buffer_voto);
                               print_list(head);
                            
                              
                             }
                             printf("Vuoi eliminare lista: 1=si,0=no");
                             scanf("%d",&a);
                             if(a==1)
                             //destroy(head);
                            delete_list( head) ;
                             print_list(head);
                               
                               printf("\n\n");
                               print_list(head);
                               system("pause");
                               }
                               
                                                           
    
     void print_list(stud_p p)      
    {
     int i=1;
     while(p!=NULL)
     {
         printf("%d) nome: %s\ncognome: %s\nvoto: %s\n",i++,p->nome,p->cognome,p->voto);
         p=p->next;
     }
     }
     
              
        int mygetline(char buffer_line[],int Max_l)
    {
        int c,i;
        i=0;
        while((c=getchar())!='\n'&&i<Max_l)
        buffer_line[i++]=c;
        buffer_line[i]='\0';
        return i;
    } 
    
             
              stud_p Add_to_list(stud_p head,char nome[],char cognome[],char voto[])
    {
          stud_p p;
          stud_p curr;
          
          p=(stud*)malloc(sizeof(stud));
          strcpy(p->nome,nome);
          strcpy(p->cognome,cognome);
          strcpy(p->voto,voto);
          
          p->next=NULL;
          
          if(head==NULL)
          return p;
          
          else
          {
              curr=head;
              while(curr->next!=NULL)
              curr=curr->next;
              curr->next=p;
              return head;
              }
              }  
              
    /*void destroy(stud* h){
        if (h == NULL) return; //Fine
     
        stud *next = h->next;
        delete(h, h->nome);
       
        destroy(next);
    } */         
      
    
    void delete_list(stud_p head) {
        if(head->next){// testa della lista
            delete_list(head->next);
            delete_node(head);
            }
    }
    
    //
    // funzione ausiliaria di delete_list
    //
    void delete_node(stud_p node){
        node->next = NULL;
        node->value = -1;
        free(node);
    }
      
    Questa funzione di elimina lista non dovrebbe essere giusta?
    mi da errore nel''value''. Come mai?
  • Ma nella tua lista c'è un elemento che si chiama value?

    Non puoi prendere una funzione e la "incolli" al tuo codice ... devi capirla e adattarla ...
  • Avevo dimenticato a dichiarare il value alla mia lista..
    Comunque mi viene cancellato l'ultima struttura inserita, sai spiegarmi come mai?
  • Ma a che serve il value nella tua lista???
  • Serve alla funzione delete a quanto ho capito..
  • Serve al programma da cui hai preso quel codice, non serve al tuo.
  • E sai come posso correggerlo ??
    purtroppo gli appunti da cui l ho preso non erano miei e non riesco a capirlo..
Devi accedere o registrarti per scrivere nel forum
18 risposte