[RISOLTO] Inserimento in lista ordinata alfabeticamente [C]

di il
41 risposte

41 Risposte - Pagina 3

  • Re: [RISOLTO] Inserimento in lista ordinata alfabeticamente [C]

    Posta il codice completo in modo da poter testare la funzione.
  • Re: [RISOLTO] Inserimento in lista ordinata alfabeticamente [C]

    Nippolo ha scritto:


    Posta il codice completo in modo da poter testare la funzione.
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <assert.h>
    #define MAX 31
    
    //-------------------------------------------------------------------------------------------
    //------------------------------------------------STRUTTURE DATI-----------------------------
    //-------------------------------------------------------------------------------------------
    typedef struct s_persona
    {
      char cognome[MAX];
      char nome[MAX];
      struct s_persona *next;
    }persona;
    
    //--------------------------------------------------------------------------------------------------
    //-------------------------------------------PROTOTIPI FUNZIONI-------------------------------------
    //--------------------------------------------------------------------------------------------------
    void nuova_persona(persona **head);
    void inserisci_persona(persona **head, persona *nuova_persona);
    void stampa_lista(persona *head);
    persona *cerca_persona(persona *head, char *cognome, char *nome);
    persona *cancella_persona(persona *head, persona *persona_cercata);
    persona *cancella_lista(persona *head);
    //--------------------------------------------------------------------------------------------------
    //------------------------------------------------MAIN----------------------------------------------
    //--------------------------------------------------------------------------------------------------
    
    int main()
    {
      //INIZIALIZZO LA LISTA
      persona *head=NULL;
      char cognome[MAX],nome[MAX];
      int i,dim,scelta;
      persona *persona_cercata;
      do
      {
        system("CLS");
        printf("\n**MENU ESERCIZIO LISTE**\n");
        printf("1. Inserisci Persona nella Lista\n");
        printf("2. Stampa Lista\n");
        printf("3. Cerca Persona nella Lista\n");
        printf("4. Cencella Persona dalla Lista\n");
        printf("5. Cancella Lista\n");
        printf("6. Esci\n\n");
        printf("Scegli un'opzione del menù: ");
        scanf("%d",&scelta);
        switch(scelta)
        {
          case 1: system("CLS");
                  printf("\n***INSERIMENTO PERSONA IN LISTA***\n");
                  printf("\nNumero di persona da inserire in lista:");
                  scanf("%d",&dim);
                  for(i=0;i<dim;i++)
                  {
                    nuova_persona(&head);
                  }
                  scelta=7;
                  printf("\n");
                  system("PAUSE");
                  break;
          case 2: system("CLS");
                  printf("\n*** STAMPA PERSONE IN LISTA***\n");
                  printf("\n\nCognome\t\tNome\n");
                  stampa_lista(head);
                  if(head==NULL)
                  printf("\nLa lista è vuota.\n");
                  scelta=7;
                  printf("\n");
                  system("PAUSE");
                  break;
          case 3: printf("\n***CERCA PERSONA NELLA LISTA***");
                  printf("\nInserire i dati della persona da cercare in lista:\n");
                  printf("\nCognome: ");
                  fflush(stdin);
                  gets(cognome);
                  printf("\nNome: ");
                  gets(nome);
                  fflush(stdin);
                  persona_cercata=cerca_persona(head,cognome,nome);
                  if(persona_cercata!=NULL)
                  printf("\nPersona cercata presente nella lista.\n");
                  else
                  printf("\nPersona cercata NON presente nella lista.\n");
                  scelta=7;
                  system("PAUSE");
                  break;
          case 4: printf("\n***CANCELLA PERSONA DALLA LISTA***\n");
                  printf("\nInserisci i dati della persona da cancella dalla lista:\n");
                  fflush(stdin);
                  printf("\nCognome: ");
                  gets(cognome);
                  printf("\nNome: ");
                  gets(nome);
                  fflush(stdin);
                  persona_cercata=cerca_persona(head,cognome,nome);
                  if(persona_cercata!=NULL)
                  head=cancella_persona(head,persona_cercata);
                  else
                  printf("\nPersona NON presente nella lista.\n");
                  scelta=7;
                  system("PAUSE");
                  break;
            case 5: printf("***ELIMINA LISTA***");
                    head=cancella_lista(head);
                    assert(head==NULL);
                    printf("\nLista eliminata con successo..\n");
                    scelta=7;
                    system("PAUSE");
                    break;
            default: printf("\nOpzione non presente nel menù...\n");
                     system("PAUSE");
                     break;
       }
      }while(scelta<1 || scelta>6);
    }
    
    //--------------------------------------------------------------------------------------------------
    //----------------------------------------------DEFINIZIONE FUNZIONI--------------------------------
    //--------------------------------------------------------------------------------------------------
    void nuova_persona(persona **head)
    {
      persona *nuova_persona=NULL;
      //Allocazione Dinamica della memoria per la variabile "nuova_persona"
      nuova_persona=(persona *)malloc(sizeof(persona));
      assert(nuova_persona!=NULL);
      printf("\n\nInserire i dati dati della nuova persona:\n");
      fflush(stdin);
      printf("\nCognome: ");
      gets(nuova_persona->cognome);
      printf("\nNome: ");
      gets(nuova_persona->nome);
      fflush(stdin);
      inserisci_persona(head,nuova_persona);
      return;
    }
    
    void inserisci_persona(persona **head, persona *nuova_persona)
    {
      persona *prec=*head, *corr=*head;
      while(corr!=NULL && ((strcmp(nuova_persona->cognome, corr->cognome)>0)||
      (strcmp(nuova_persona->cognome,corr->cognome)==0) && strcmp(nuova_persona->nome,corr->nome)>0))
      {
        prec=corr;
        corr=corr->next;
      }
      //Se l'elemento corrente è il primo elemento della lista
      if(prec==*head)
      {
        *head=nuova_persona;
        nuova_persona->next=corr;
        return;
      }
      //Se l'elemento corrente è l'ultimo elemento della lista
      else if(corr==NULL)
      {
        prec->next=nuova_persona;
        nuova_persona->next=NULL;
        return;
      }
      else
      {
    
        prec->next=nuova_persona;
        nuova_persona->next=corr;
        return;
      }
      prec->next=nuova_persona;
      nuova_persona->next=corr;
      return;
    }
    
    void stampa_lista(persona *head)
    {
      //NOTA: Posso tranquillamente utilizzare la variabe head, viene modificata solo localmente
      while(head!=NULL)
      {
        printf("%s\t\t%s\n",head->cognome,head->nome);
        head=head->next;
      }
      return;
    }
    
    persona *cerca_persona(persona *head, char *cognome, char *nome)
    {
      int ctrl_1=1,ctrl_2=1;
      while(head!=NULL && ((ctrl_1=strcmp(cognome, head->cognome)>0)||
      (ctrl_1=strcmp(cognome,head->cognome)==0) && (ctrl_2=strcmp(nome,head->nome)>0)))
      {
        head=head->next;
      }
      if(ctrl_1==0 && ctrl_2==0)
        return head;
      else
        return NULL;
    }
    
    persona *cancella_persona(persona *head, persona *persona_cercata)
    {
      if(persona_cercata!=NULL)
      {
        free(persona_cercata);
        
      }
    }
    
    persona *cancella_lista(persona *head)
    {
      char ctrl;
      persona *corr=head, *succ;
      printf("\nSicuro di voler eliminare la lista? (S/N) ");
      scanf("%c",ctrl);
      if(ctrl=='S'||ctrl=='s')
      {
        printf("\nEliminazione lista in corso...\n");
        while(corr!=NULL)
        {
          succ=corr->next;
          free(corr);
          corr=corr->next;
          corr=succ;
        }
        return NULL;
      }
      else
        return corr;
    }
  • Re: [RISOLTO] Inserimento in lista ordinata alfabeticamente [C]

    Il problema è nella condizione del while della funzione cerca_persona() ed è dovuto al fatto che gli operatori relazionali (tra cui > e ==) hanno la precedenza sull'operatore di assegnazione (=).

    Per esempio che output ti aspetti dal seguente codice?
    #include <stdio.h>
    
    int main()
    {
        int a = 5;
        if(a = 7 > 0)
        {
            printf("%d", a);
        }
    }
  • Re: [RISOLTO] Inserimento in lista ordinata alfabeticamente [C]

    L'operatore ">" ha precedenza su "=" quindi viene verificata prima la disuguaglianza (vera) e poi viene posta la variabile "a" uguale a 7. Quindi mi dovrei aspettare 7? Ma eseguendo il codice mi da 1..non ho idea del perchè.
  • Re: [RISOLTO] Inserimento in lista ordinata alfabeticamente [C]

    Se io scrivo

    a = 7 + 2

    sarà a=9 e non a=7.
    Quindi perché se scrivo

    a = 3 > 1

    dovrei aspettarmi a=3?
  • Re: [RISOLTO] Inserimento in lista ordinata alfabeticamente [C]

    No, perchè ">" ha priorità maggiore di "=", quindi il risultato è 1 in quanto è vera l'affermazione 3>1?
    EDIT: infatti se scrivo:
    a=1>3 -> a=0
  • Re: [RISOLTO] Inserimento in lista ordinata alfabeticamente [C]

    Esatto, quindi tornando al tuo codice basta correggere la condizione del while giocando un po' con le parentesi tonde.

    P.S.
    La funzione inserisci_persona(), come già detto più volte, può essere notevolmente semplificata. Per esempio io farei qualcosa del genere:
    void inserisci_persona(persona **head, persona *nuova_persona)
    {
        persona *prec = NULL;
        persona *corr = *head;
        int a;
        while(corr && ((a = strcmp(nuova_persona->cognome, corr->cognome)) > 0 || (!a && strcmp(nuova_persona->nome, corr->nome) > 0)))
        {
            prec = corr;
            corr = corr->next;
        }
        if(prec)
        {
            prec->next = nuova_persona;
        }
        else
        {
            *head = nuova_persona;
        }
        nuova_persona->next = corr;
    }
  • Re: [RISOLTO] Inserimento in lista ordinata alfabeticamente [C]

    Si è decisamente più semplice ed intuitiva questa versione di inserisci_persona.
    Per quanto riguarda il while sto combattendo ma non trovo la giusta combinazione di parentesi, cioè ho messo parentesi ad ogni possibile blocco della funzione
     while(head!=NULL && ((ctrl_1=(strcmp(cognome,head->cognome)>0)) || ((ctrl_1=(strcmp(cognome,head->cognome)==0)) && (ctrl_2=(strcmp(nome,head->nome)>0)))))
  • Re: [RISOLTO] Inserimento in lista ordinata alfabeticamente [C]

    Sperimenta (sempre con criterio) sul più semplice codice:
    #include <stdio.h>
    
    int main()
    {
        int a = 5;
        if(a = 7 > 0)
        {
            printf("%d", a);
        }
    }
    Lo scopo è far stampare 7.
  • Re: [RISOLTO] Inserimento in lista ordinata alfabeticamente [C]

    Hai ragione è sempre meglio cominciare dalle cose semplici..funziona! In realtà sarebbe anche bastato guardare il codice che hai fatto per la funzione inserisci_persona per avere un aiutino
  • Re: [RISOLTO] Inserimento in lista ordinata alfabeticamente [C]

    Già!
  • Re: [RISOLTO] Inserimento in lista ordinata alfabeticamente [C]

    Comunque grazie ancora Nippolo per la pazienza e per avermi dato tutte queste dritte.


    Per chi volesse, allego il codice completo e funzionante per lavorare con le liste(con tutte le funzioni base) , semmai servisse a qualcuno.
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <assert.h>
    #define MAX 31
    
    //-------------------------------------------------------------------------------------------
    //------------------------------------------------STRUTTURE DATI-----------------------------
    //-------------------------------------------------------------------------------------------
    typedef struct s_persona
    {
      char cognome[MAX];
      char nome[MAX];
      struct s_persona *next;
    }persona;
    
    //--------------------------------------------------------------------------------------------------
    //-------------------------------------------PROTOTIPI FUNZIONI-------------------------------------
    //--------------------------------------------------------------------------------------------------
    void nuova_persona(persona **head);
    void inserisci_persona(persona **head, persona *nuova_persona);
    void stampa_lista(persona *head);
    persona *cerca_persona(persona *head, char *cognome, char *nome);
    persona *cancella_persona(persona *head, persona *persona_cercata);
    persona *cancella_lista(persona *head);
    
    //--------------------------------------------------------------------------------------------------
    //------------------------------------------------MAIN----------------------------------------------
    //--------------------------------------------------------------------------------------------------
    int main()
    {
      //INIZIALIZZO LA LISTA
      persona *head=NULL;
      char cognome[MAX],nome[MAX];
      int i,dim,scelta;
      persona *persona_cercata;
      do
      {
        system("CLS");
        printf("\n**MENU ESERCIZIO LISTE**\n");
        printf("1. Inserisci Persona nella Lista\n");
        printf("2. Stampa Lista\n");
        printf("3. Cerca Persona nella Lista\n");
        printf("4. Cencella Persona dalla Lista\n");
        printf("5. Cancella Lista\n");
        printf("6. Esci\n\n");
        printf("Scegli un'opzione del menù: ");
        scanf("%d",&scelta);
        switch(scelta)
        {
          case 1: system("CLS");
                  printf("\n***INSERIMENTO PERSONA IN LISTA***\n");
                  printf("\nNumero di persona da inserire in lista:");
                  scanf("%d",&dim);
                  for(i=0;i<dim;i++)
                  {
                    nuova_persona(&head);
                  }
                  scelta=7;
                  printf("\n");
                  system("PAUSE");
                  break;
          case 2: system("CLS");
                  printf("\n*** STAMPA PERSONE IN LISTA***\n");
                  printf("\n\nCognome\t\tNome\n");
                  stampa_lista(head);
                  if(head==NULL)
                  printf("\nLa lista è vuota.\n");
                  scelta=7;
                  printf("\n");
                  system("PAUSE");
                  break;
          case 3: printf("\n***CERCA PERSONA NELLA LISTA***");
                  printf("\nInserire i dati della persona da cercare in lista:\n");
                  printf("\nCognome: ");
                  fflush(stdin);
                  gets(cognome);
                  printf("\nNome: ");
                  gets(nome);
                  fflush(stdin);
                  persona_cercata=cerca_persona(head,cognome,nome);
                  if(persona_cercata!=NULL)
                  printf("\nPersona cercata presente nella lista.\n");
                  else
                  printf("\nPersona cercata NON presente nella lista.\n");
                  scelta=7;
                  system("PAUSE");
                  break;
          case 4: printf("\n***CANCELLA PERSONA DALLA LISTA***\n");
                  printf("\nInserisci i dati della persona da cancella dalla lista:\n");
                  fflush(stdin);
                  printf("\nCognome: ");
                  gets(cognome);
                  printf("\nNome: ");
                  gets(nome);
                  fflush(stdin);
                  persona_cercata=cerca_persona(head,cognome,nome);
                  if(persona_cercata!=NULL)
                  head=cancella_persona(head,persona_cercata);
                  else
                  printf("\nPersona NON presente nella lista.\n");
                  scelta=7;
                  system("PAUSE");
                  break;
            case 5: printf("***ELIMINA LISTA***");
                    head=cancella_lista(head);
                    assert(head==NULL);
                    printf("\nLista eliminata con successo..\n");
                    scelta=7;
                    system("PAUSE");
                    break;
            default: printf("\nOpzione non presente nel menù...\n");
                     system("PAUSE");
                     break;
       }
      }while(scelta<1 || scelta>6);
    }
    
    //--------------------------------------------------------------------------------------------------
    //----------------------------------------------DEFINIZIONE FUNZIONI--------------------------------
    //--------------------------------------------------------------------------------------------------
    void nuova_persona(persona **head)
    {
      persona *nuova_persona=NULL;
      //Allocazione Dinamica della memoria per la variabile "nuova_persona"
      nuova_persona=(persona *)malloc(sizeof(persona));
      assert(nuova_persona!=NULL);
      printf("\n\nInserire i dati dati della nuova persona:\n");
      fflush(stdin);
      printf("\nCognome: ");
      gets(nuova_persona->cognome);
      printf("\nNome: ");
      gets(nuova_persona->nome);
      fflush(stdin);
      inserisci_persona(head,nuova_persona);
      return;
    }
    
    void inserisci_persona(persona **head, persona *nuova_persona)
    {
      persona *prec = NULL;
      persona *corr = *head;
      int a;
      while(corr && ((a = strcmp(nuova_persona->cognome, corr->cognome)) > 0 ||
      (!a && strcmp(nuova_persona->nome, corr->nome) > 0)))
      {
        prec = corr;
        corr = corr->next;
      }
      if(prec)
      {
        prec->next = nuova_persona;
      }
      else
      {
        *head = nuova_persona;
      }
      nuova_persona->next = corr;
    }
    
    void stampa_lista(persona *head)
    {
      //NOTA: Posso tranquillamente utilizzare la variabe head, viene modificata solo localmente
      while(head!=NULL)
      {
        printf("%s\t\t%s\n",head->cognome,head->nome);
        head=head->next;
      }
      return;
    }
    
    persona *cerca_persona(persona *head, char *cognome, char *nome)
    {
      int ctrl_1=1,ctrl_2=1;
      while(head!=NULL && ((ctrl_1=(strcmp(cognome,head->cognome))>0 || (ctrl_1=(strcmp(cognome,head->cognome))==0 && (ctrl_2=(strcmp(nome,head->nome))>0)))))
      {
        head=head->next;
      }
      if(ctrl_1==0 && ctrl_2==0)
        return head;
      else
        return NULL;
    }
    
    persona *cancella_persona(persona *head, persona *persona_cercata)
    {
      persona *corr=persona_cercata;
      corr=corr->next;
      if(persona_cercata!=NULL)
      {
        free(persona_cercata);
      }
      return corr;
    }
    
    persona *cancella_lista(persona *head)
    {
      char ctrl;
      persona *corr=head, *succ;
      printf("\nSicuro di voler eliminare la lista? (S/N) ");
      scanf("\n%c",&ctrl);
      if(ctrl=='S'||ctrl=='s')
      {
        printf("\nEliminazione lista in corso...\n");
        while(corr!=NULL)
        {
          succ=corr->next;
          free(corr);
          corr=corr->next;
          corr=succ;
        }
        return NULL;
      }
      else
        return corr;
    }
Devi accedere o registrarti per scrivere nel forum
41 risposte