Debug che non riesco a comprendere.

di il
18 risposte

Debug che non riesco a comprendere.

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

  • Re: Debug che non riesco a comprendere.

    "Succede un DEBUG" ??

    Ma che dici?
  • Re: Debug che non riesco a comprendere.

    "Si è verificato un errore...."
  • Re: Debug che non riesco a comprendere.

    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..
  • Re: Debug che non riesco a comprendere.

    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
  • Re: Debug che non riesco a comprendere.

    Ma è sbagliata la funzione in sè oppure il modo in cui viene richiamata all'interno del main?
  • Re: Debug che non riesco a comprendere.

    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.
  • Re: Debug che non riesco a comprendere.

    Ok!!!
  • Re: Debug che non riesco a comprendere.

    #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?
  • Re: Debug che non riesco a comprendere.

    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 ...
  • Re: Debug che non riesco a comprendere.

    Avevo dimenticato a dichiarare il value alla mia lista..
    Comunque mi viene cancellato l'ultima struttura inserita, sai spiegarmi come mai?
  • Re: Debug che non riesco a comprendere.

    Ma a che serve il value nella tua lista???
  • Re: Debug che non riesco a comprendere.

    Serve alla funzione delete a quanto ho capito..
  • Re: Debug che non riesco a comprendere.

    Serve al programma da cui hai preso quel codice, non serve al tuo.
  • Re: Debug che non riesco a comprendere.

    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