Sempre dubbio sulle liste. :)

di il
26 risposte

Sempre dubbio sulle liste. :)

Ho un esercizio che mi chiede di creare una struttira ( es. studente , matricola, voto) il primo punto mi dice di creare una lista di studenti seguendo l'ordine di uno dei campi all interno della struttura ( risolto).
un altro punto invece di creare una lista secondo l'ordine di immissione degli studenti .
Io come soluzione avevo pensato di modificare la funzione
ibro_p Add_in_order(libro_p head,char autore[],char ce[],char ap[])
{
      libro_p p;
      libro_p temp;
      libro_p temp_pre;
      
      p=(libro_p)malloc(sizeof(libro));
      strcpy(p->autore,autore);
      strcpy(p->ce,ce);
      strcpy(p->ap,ap);
      
      p->next=NULL;
      
      if(head==NULL)
      return p;
      
      else
      {
          if(strcmp(autore,head->autore)<0)
          {
          p->next=head;
          return p;
          }
          
          temp=head;
          temp_pre=head;
          
          while(temp!=NULL)
          {
                           if(strcmp(autore,temp->autore)<0)
                           {
                           insert(temp_pre,temp_pre->next,p);
                           return head;
                           }
                           temp_pre=temp;
                           temp=temp->next;
                           }
                           insert(temp_pre,temp_pre->next,p);
                           return head;
                           }
                           }
Pero non riesco proprio a capire come modificarla, qualcuno potrebbe darmi qualche input??? grazie

26 Risposte

  • Re: Sempre dubbio sulle liste. :)

    Quella funzione l'hai scritta tu?
    Perché quello che devi scrivere è più semplice di quella funzione ...

    Non devi tenere conto di alcun ordinamento ma accodare i nuovi elementi nella lista.
  • Re: Sempre dubbio sulle liste. :)

    Si l'ho scritta io, ma quella mi permette di ordinare in ordine alfabetico del nome dell autore!!!

    Non riesco prorpio a capire come posso fare contemporaneamente a creare 2 liste differenti..
  • Re: Sempre dubbio sulle liste. :)

    Ci sono diversi metodi,il piu elegante é quello di separare la lista dalla struttura che contiene i reali valori.
    In questo modo puoi creare tante liste quante vuoi e ogni lista puntera alla stessa struttura dati.
    Sono riuscito a spiegarmi?
    
    Pseudocode
    Struct lista
        miastruttura* S
        struct listz *next
    End
    
  • Re: Sempre dubbio sulle liste. :)

    Vbextreme , veramente no
  • Re: Sempre dubbio sulle liste. :)

    
    typedef struct _Libro
    {
        char autore[256];
        ....
    }Libro;
    
    typedef struct _Lista
    {
        Libro* l;
        struct _Lista* next
    }Lista;
    
    void lista_add(Lista* lst,Libro*l) ///first non gestito
    {
        for (; lst->next != NULL ; lst = lst->next);
        lst->next = malloc(sizeof(Lista))
        lst->next->l = l;
    }
    
    
    spiegato meglio? sono al cellulare,quando passo ad un pc spiego meglio ciao
  • Re: Sempre dubbio sulle liste. :)

    Ok, aspetto tue indicazioni allora , perchè ancora non ho capito del tutto... grazie
  • Re: Sempre dubbio sulle liste. :)

    Allora eccoti un esempio di una doppia lista,una contiene i dati in ordine di inserimento mentre l'altra li contiene in ordine alfabetico:
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    typedef struct _PERSONA
    {
        char nome[256];
        char cognome[256];
    }PERSONA;
    
    typedef struct _LISTA
    {
        PERSONA* p;
        struct _LISTA* next;
    }LISTA;
    
    typedef struct _UTENTI
    {
        LISTA* first;
        LISTA* order;
    }UTENTI;
    
    PERSONA* prs_new(const char* nome,const char* cognome)
    {
        PERSONA* p = malloc(sizeof(PERSONA));
        strcpy(p->nome,nome);
        strcpy(p->cognome,cognome);
        return p;
    }
    
    void ute_add(UTENTI* u,PERSONA* p)
    {
        //primo caso speciale
        if (u->first == NULL)
        {
            u->first = malloc(sizeof(LISTA));
            u->first->p = p;
            u->first->next = NULL;
            u->order = malloc(sizeof(LISTA));
            u->order->p = p;
            u->order->next = NULL;
            return;
        }
    
        //accodo alla lista
        LISTA* f;
        for (f = u->first; f->next != NULL; f= f->next);
        f->next = malloc(sizeof(LISTA));
        f->next->p = p;
        f->next->next = NULL;
    
        //metto nella lista ordinata by name
        LISTA* n = malloc(sizeof(LISTA));
        LISTA* prev = NULL;
        n->p = p;
    
        for (f = u->order; f != NULL && (strcmp(n->p->nome,f->p->nome) > 0)  ;prev = f, f = f->next);
    
        if (f != NULL && prev == NULL)
        {
            n->next = u->order;
            u->order = n;
        }
        else
        {
            prev->next = n;
            n->next = f;
        }
    }
    
    void ute_free(UTENTI* u)
    {
        LISTA* f = u->first;
        LISTA* o = u->order;
        LISTA* g;
    
        do
        {
            g=o->next;
            free(o);
            o->next = g;
            g = f->next;
            free(f->p);
            free(f);
            f = g;
        }while(f != NULL);
    
        u->first = NULL;
        u->order = NULL;
    
    }
    
    int main()
    {
        UTENTI u;
            u.first = NULL;
            u.order = NULL;
    
        ute_add(&u,prs_new("z","extreme"));
        ute_add(&u,prs_new("c","rossi"));
        ute_add(&u,prs_new("b","cool"));
        ute_add(&u,prs_new("f","carino"));
        ute_add(&u,prs_new("d","carino"));
    
    
        LISTA* l;
        //view all utenti
        printf("Tutti gli utenti:\n");
        for (l = u.first; l != NULL; l = l->next )
            printf("\t%s,%s\n",l->p->nome,l->p->cognome);
    
        printf("\nTutti gli utenti ordinati:\n");
        for (l = u.order; l != NULL; l = l->next )
            printf("\t%s,%s\n",l->p->nome,l->p->cognome);
    
        ute_free(&u);
        printf("END..\n");
    
        return 0;
    }
    
    
    a parte lo svolgimento del codice dovresti soffermarti sulla dichiarazione delle strutture.
    Creo una prima struttura che contiene i reali valori,in questo caso "Persona" poi creo una struttura che definisca la lista.
    E una terza giusto per leggibiltà di codice(e semplicità) che contenga le due liste che voglio.
    A questo punto metterò lo stesso puntatore a persona dentro ad entrambe le liste.
    Punto importante è la deallocazione della memoria,in solo una lista va deallocata la memoria persona mentre nell'altra no,perchè tutte e due puntano alla stessa struttura,quindi quando la liberi in una è come liberarla anche nell'altra.

    So tanto di non essere mai chiaro,percio rimango qui per eventuali chiarimenti.
  • Re: Sempre dubbio sulle liste. :)

    Mi devi scusare ma non ho capito moltissimo, se possibile ti chiederei di apportare le modifiche necessarie a tale lista affinchè poi faccia ciò che dice la consegna...( spero mi aiuterai..):
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #define MAX_STR 32
    #define FILENAME "test.dat"
    struct libro{
           char autore[MAX_STR];
           char ce[MAX_STR];
           char ap[MAX_STR];
           
           struct libro *next;
           };
           
           typedef struct libro libro;
           typedef struct libro *libro_p;
           
           libro_p Add_to_list(libro_p begin,char autore[],char ce[],char ap[]);
           libro_p Add_in_order(libro_p head,char autore[],char ce[],char ap[]);
           void print_list(libro_p p);
           int Save_to_file(libro_p begin,char file_name[]);
           int getline(char buffer_line[],int);
           //int Search_in_list(libro_p head,char trial[]);
           libro_p Read_from_file(libro_p begin,char file_name[]);
           
           main()
           {
                 char buffer_autore[MAX_STR];
                 char buffer_ce[MAX_STR];
                 char buffer_ap[MAX_STR];
                 char line[MAX_STR];
                 int cont;
                 char trial[MAX_STR];
                 
                 
                 libro_p head=NULL;
                 
                 printf("Inserimento dati. . .\n\n");
                 head=Read_from_file(head,FILENAME);
                 
                 
                 if(head!=NULL)
                 {
                               printf("\nEcco i dati dal file %s:\n\n",FILENAME);
                               print_list(head);
                               }
                 
                               
                 while(cont)
                 {
                            printf("\nInserire l'autore del libro:\n");
                            getline(buffer_autore,MAX_STR);
                            if(strcmp(buffer_autore,"exit")==0)
                            break;
                            printf("Inserire la casa editrice:\n");
                            getline(buffer_ce,MAX_STR);
                            if(strcmp(buffer_ce,"exit")==0)
                            break;
                            printf("Inserire l'anno di publicazione:\n");
                            getline(buffer_ap,MAX_STR);
                            if(strcmp(buffer_ap,"exit")==0)
                            break;
                            
                            printf("\n\nPer terminare digitare exit. . .\n\n");
                            if(strcmp(buffer_autore,"")!=0&&strcmp(buffer_ce,"")!=0&&strcmp(buffer_ap,"")!=0)
                            libro_p Add_to_list(libro_p begin,char autore[],char ce[],char ap[]);
                            head=Add_in_order(head,buffer_autore,buffer_ce,buffer_ap);
                            }
                            //printf("\n\nInserire dati per la ricerca: ");
                            //scanf("%s",trial);
                              
                            //Search_in_list(head,trial);
                            Save_to_file(head,FILENAME);
                            printf("Indice: \n\n");
                            print_list(head);
                            system("pause");
                            return 0;
                            }
                            
    libro_p Add_to_list(libro_p begin,char autore[],char ce[],char ap[])
    {
          libro_p p;
          libro_p curr;
          
          p=(libro*)malloc(sizeof(libro));
          strcpy(p->autore,autore);
          strcpy(p->ce,ce);
          strcpy(p->ap,ap);
          
          p->next=NULL;
          
          if(begin==NULL)
          return p;
          
          else
          {
              begin=curr;
              while(curr->next!=NULL)
              curr=curr->next;
              curr->next=p;
              return begin;
              }
              }
              
    int Save_to_file(libro_p begin,char file_name[])
    {
        libro_p p;
        FILE *fp;
        
        printf("Salvataggio. . .\n\n");
        
        fp=fopen(file_name,"w");
        if(fp==NULL)
        {
                    printf("Impossibile aprire in scrittura il file %s. . .\n\n",file_name);
                    return -1;
                    }
                    
                    p=begin;
                    while(p!=NULL)
                    {
                                  fwrite(p,sizeof(libro),1,fp);
                                  p=p->next;
                                  }
                                  return 0;
                                  }
                                  
    libro_p Read_from_file(libro_p begin,char file_name[])
    {
          
          libro_p start;
          libro libro_item;
          FILE *fp;
         int n;
          
          start=begin;
          
          fp=fopen(file_name,"r");
          
          if(fp==NULL)
          {
                      printf("Impossibile aprire il file %s in lettura. . .\n\n",file_name);
                      printf("Nessun archivio importato!!\n\n");
                      return begin;
                      }
                      
                      start=begin;
                      
                      while(n>0)
                      {
                                n=fread(&libro_item,sizeof(libro),1,fp);
                                printf("%d  %4s  %4s  %4s  \n",n,libro_item.autore,libro_item.ce,libro_item.ap);
                                if(n>0)
                                start=Add_in_order(start,libro_item.autore,libro_item.ce,libro_item.ap);
                                }
                                return start;
                                }
                                
    void print_list(libro_p p)
    {
         if(p!=NULL)
         {
                    printf("\n%4s  %4s  %4s  \n\n",p->autore,p->ce,p->ap);
                    p=p->next;
                    print_list(p);
                    }
                    }
                    
    /*int Search_in_list(libro_p head,char trial[])
    {
        printf("\n\nRicerca elementi in lista...\n");
        if(head==NULL)
        {
                      printf("\nImpossibile individuare il percorso specificato\n");
                      return -1;
                      }
                      
        while(head!=NULL)
        {
                         if(strcmp(head->autore,trial)==0||strcmp(head->ce,trial)==0||strcmp(head->ap,trial)==0)
                         {
                                                                                                                     printf("\n\nElemento trovato!!\n");
                                                                                                                     return 1;
                                                                                                                     }
                         else
                         printf("Elemento non trovato!!\n\n");
                         
                         head=head->next;
                         
                         }
                         
                         
                         return 0;
                         }*/
                                                                                                                                                   
                    
    void insert(libro_p a,libro_p b,libro_p q)
    {
         if(a->next!=b)
         {
                       printf("Errore nella lista\n\n");
                       return;
                       }
                       a->next=q;
                       q->next=b;
                       }
                       
    libro_p Add_in_order(libro_p head,char autore[],char ce[],char ap[])
    {
          libro_p p;
          libro_p temp;
          libro_p temp_pre;
          
          p=(libro_p)malloc(sizeof(libro));
          strcpy(p->autore,autore);
          strcpy(p->ce,ce);
          strcpy(p->ap,ap);
          
          p->next=NULL;
          
          if(head==NULL)
          return p;
          
          else
          {
              if(strcmp(autore,head->autore)<0)
              {
              p->next=head;
              return p;
              }
              
              temp=head;
              temp_pre=head;
              
              while(temp!=NULL)
              {
                               if(strcmp(autore,temp->autore)<0)
                               {
                               insert(temp_pre,temp_pre->next,p);
                               return head;
                               }
                               temp_pre=temp;
                               temp=temp->next;
                               }
                               insert(temp_pre,temp_pre->next,p);
                               return head;
                               }
                               }
                               
    int getline(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;
    }
    Ti riporto pjure il testo per completezza:Creare un programma che attraverso la dichiarazione di una struttura opportuna permetta di
    gestire i dati di un insieme rilevazioni meteorologiche (si considerino almeno tre campi per
    la struttura). Il programma deve permettere di :
    • creare una lista ordinata in relazione all’ordine di immissione
    • creare una lista ordinata in relazione ad un campo della struttura
    • stampare della lista
    • salvare su file i dati
    • leggere da file i dati salvati(ovviamente qui si parla di altra lista , sono io che l'ho modificata )
  • Re: Sempre dubbio sulle liste. :)

    E il voto dopo lo dai a me?
    allora,prenditi il tempo che ti serve e inizia ad analizzare il codice che ho scritto.
    poi dimmi cosa ti torna difficile.

    Cerca di identare meglio il codice in modo che risulti piu semplice alla lettura.
    esempio difficile da leggere:
    
    ....
    while(cont)
                 {
                            printf("\nInserire l'autore del libro:\n");
                            getline(buffer_autore,MAX_STR);
                            if(strcmp(buffer_autore,"exit")==0)
                            break;
                            printf("Inserire la casa editrice:\n");
                            getline(buffer_ce,MAX_STR);
                            if(strcmp(buffer_ce,"exit")==0)
                            break;
                            printf("Inserire l'anno di publicazione:\n");
                            getline(buffer_ap,MAX_STR);
                            if(strcmp(buffer_ap,"exit")==0)
                            break;
    ....
    
    molto meglio:
    
    ....
    while(cont)
     {
         printf("\nInserire l'autore del libro:\n");
             getline(buffer_autore,MAX_STR);
    
         if(strcmp(buffer_autore,"exit")==0)
             break;
    
         printf("Inserire la casa editrice:\n");
             getline(buffer_ce,MAX_STR);
    
         if(strcmp(buffer_ce,"exit")==0)
             break;
    
         printf("Inserire l'anno di publicazione:\n");
             getline(buffer_ap,MAX_STR);
        
         if(strcmp(buffer_ap,"exit")==0)
             break;
    ....
    
  • Re: Sempre dubbio sulle liste. :)

    @vbextreme ho pensato di utilizzare la funzione add to list , al posto dell add_ in order , ma cio che ottengo è esattamente l'ordinamento per ordine alfabetico dell autore del libro.!!!!!! Come te lo spieghi??
  • Re: Sempre dubbio sulle liste. :)

    Se i dati che passi all'Add_to_list sono in ordine di autore, l'ordine viene ovviamente conservato.
  • Re: Sempre dubbio sulle liste. :)

    Oregon ovviamente io faccio la prova ad inserire dati non in ordine alfabetico , ma lui me li ordina proprio in ordine alfabetico.
  • Re: Sempre dubbio sulle liste. :)

    Ma la Add_to_list non inserisce in ordine alfabetico quindi o la lista è già ordinata prima o la ordini dopo.

    Per fare una prova, posta il codice *completo* (compreso il main) che hai usato per provare la Add_to_list.
  • Re: Sempre dubbio sulle liste. :)

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #define MAX_STR 32
    #define FILENAME "test.dat"
    struct bib{
           char title[MAX_STR];
           char author[MAX_STR];
           char coll[MAX_STR];
           
           struct bib *next;
           };
           typedef struct bib bib;
           typedef struct bib *bib_p;
           
           bib_p Add_to_list(bib_p begin,char title[],char auth[],char coll[]);
           //bib_p Add_in_order(bib_p head,char title[],char auth[],char coll[]);
           void print_list(bib_p p);
           int Save_to_file(bib_p begin,char file_name[]);
           int getline(char buffer_line[],int);
           int Search_in_list(bib_p head,char trial[]);
           bib_p Read_from_file(bib_p begin,char file_name[]);
           
           main()
           {
                 char buffer_title[MAX_STR];
                 char buffer_name[MAX_STR];
                 char buffer_coll[MAX_STR];
                 char line[MAX_STR];
                 int cont;
                 char trial[MAX_STR];
                 
                 
                 bib_p head=NULL;
                 
                 printf("Inserimento dati. . .\n\n");
                 head=Read_from_file(head,FILENAME);
                 
                 
                 if(head!=NULL)
                 {
                               printf("\nEcco i dati dal file %s:\n\n",FILENAME);
                               print_list(head);
                               }
                 
                               
                 while(cont)
                 {
                            printf("\nInserire il titolo dell'opera:\n");
                            getline(buffer_title,MAX_STR);
                            if(strcmp(buffer_title,"exit")==0)
                            break;
                            printf("Inserire l'autore:\n");
                            getline(buffer_name,MAX_STR);
                            if(strcmp(buffer_name,"exit")==0)
                            break;
                            printf("Inserire la collocazione dell'opera:\n");
                            getline(buffer_coll,MAX_STR);
                            if(strcmp(buffer_coll,"exit")==0)
                            break;
                            
                            printf("\n\nPer terminare digitare exit. . .\n\n");
                            if(strcmp(buffer_title,"")!=0&&strcmp(buffer_name,"")!=0&&strcmp(buffer_coll,"")!=0)
                            head=Add_to_list(head,buffer_title,buffer_name,buffer_coll);
                            }
                            printf("\n\nInserire dati per la ricerca: ");
                            scanf("%s",trial);
                              
                            Search_in_list(head,trial);
                            Save_to_file(head,FILENAME);
                            printf("Indice: \n\n");
                            print_list(head);
                            system("pause");
                            return 0;
                            }
                            
    bib_p Add_to_list(bib_p begin,char title[],char auth[],char coll[])
    {
          bib_p p;
          bib_p curr;
          
          p=(bib*)malloc(sizeof(bib));
          strcpy(p->title,title);
          strcpy(p->author,auth);
          strcpy(p->coll,coll);
          
          p->next=NULL;
          
          if(begin==NULL)
          return p;
          
          else
          {
              begin=curr;
              while(curr->next!=NULL)
              curr=curr->next;
              curr->next=p;
              return begin;
              }
              }
              
    int Save_to_file(bib_p begin,char file_name[])
    {
        bib_p p;
        FILE *fp;
        
        printf("Salvataggio. . .\n\n");
        
        fp=fopen(file_name,"w");
        if(fp==NULL)
        {
                    printf("Impossibile aprire in scrittura il file %s. . .\n\n",file_name);
                    return -1;
                    }
                    
                    p=begin;
                    while(p!=NULL)
                    {
                                  fwrite(p,sizeof(bib),1,fp);
                                  p=p->next;
                                  }
                                  return 0;
                                  }
                                  
    bib_p Read_from_file(bib_p begin,char file_name[])
    {
          
          bib_p start;
          bib bib_item;
          FILE *fp;
          int n;
          
          start=begin;
          
          fp=fopen(file_name,"r");
          
          if(fp==NULL)
          {
                      printf("Impossibile aprire il file %s in lettura. . .\n\n",file_name);
                      printf("Nessun archivio importato!!\n\n");
                      return begin;
                      }
                      
                      start=begin;
                      n=1;
                      while(n>0)
                      {
                                n=fread(&bib_item,sizeof(bib),1,fp);
                                printf("%d)  %4s  %4s  %4s  \n",n,bib_item.title,bib_item.author,bib_item.coll);
                                if(n>0)
                                start=Add_to_list(start,bib_item.title,bib_item.author,bib_item.coll);
                                }
                                return start;
                                }
                                
    void print_list(bib_p p)
    {
         if(p!=NULL)
         {
                    printf("\n%4s  %4s  %4s  \n\n",p->title,p->author,p->coll);
                    p=p->next;
                    print_list(p);
                    }
                    }
                    
    int Search_in_list(bib_p head,char trial[])
    {
        printf("\n\nRicerca elementi in lista...\n");
        if(head==NULL)
        {
                      printf("\nImpossibile individuare il percorso specificato\n");
                      return -1;
                      }
                      
        while(head!=NULL)
        {
                         if(strcmp(head->title,trial)==0||strcmp(head->author,trial)==0||strcmp(head->coll,trial)==0)
                         {
                                                                                                                     printf("\n\nElemento trovato!!\n");
                                                                                                                     return 1;
                                                                                                                     }
                         else
                         printf("Elemento non trovato!!\n\n");
                         
                         head=head->next;
                         
                         }
                         
                         
                         return 0;
                         }
                                                                                                                                                   
                    
    void insert(bib_p a,bib_p b,bib_p q)
    {
         if(a->next!=b)
         {
                       printf("Errore nella lista\n\n");
                       return;
                       }
                       a->next=q;
                       q->next=b;
                       }
                       
    bib_p Add_in_order(bib_p head,char title[],char auth[],char coll[])
    {
          bib_p p;
          bib_p temp;
          bib_p temp_pre;
          
          p=(bib_p)malloc(sizeof(bib));
          strcpy(p->title,title);
          strcpy(p->author,auth);
          strcpy(p->coll,coll);
          
          p->next=NULL;
          
          if(head==NULL)
          return p;
          
          else
          {
              if(strcmp(title,head->title)<0)
              {
              p->next=head;
              return p;
              }
              
              temp=head;
              temp_pre=head;
              
              while(temp!=NULL)
              {
                               if(strcmp(title,temp->title)<0)
                               {
                               insert(temp_pre,temp_pre->next,p);
                               return head;
                               }
                               temp_pre=temp;
                               temp=temp->next;
                               }
                               insert(temp_pre,temp_pre->next,p);
                               return head;
                               }
                               }
                               
    int getline(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;
    }
Devi accedere o registrarti per scrivere nel forum
26 risposte