Pagina 2 di 2 primaprima 1 2
Visualizzazione dei risultati da 11 a 15 su 15

Hybrid View

  1. #1
    Grazie mille, ho risolto il mio problema, pero per sistemare un pochino (come hai detto tu, inserire uno ad uno gli elementi in coda), non riesco a concludere il programma...
    Praticamente:
    - Come faccio ad aggiungere elementi in coda?? Se al posto di NULL metto list_head funziona pero mi aggiunge gli elementi alla testa.
    - Ma per fare il controllo nella funzione ELIMINA?? Tipo "L'elemento non è presente".. Per ora, se non è presente mi chiude il programma...

    Grazie ancora.. Posto il codice aggiornato..

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <stdbool.h> 
    struct elemento{ 
    int valore; 
    struct elemento *next;
    };
    void menu();
    struct elemento *insElemento(struct elemento *, int n); 
    struct elemento *ordLista(struct elemento *);
    void printElemento(struct elemento *);
    struct elemento *searchlist(struct elemento *, int n);
    struct elemento *Delete (struct elemento *, int DaEliminare);
    int main(){
     struct elemento *Lista=NULL ; 
     int comando, val, x, test;
     do{
     menu(); 
     printf("\nComando:\t"); 
     scanf("%d", &comando); 
     
     switch(comando){  
     case 1:{   
     do{
     printf("\nInserisci un numero da aggiungere alla testa della lista\n");
     scanf("%d",&val);
     Lista=insElemento(Lista,val);
     printf("\n\nInserisci 'q' per concludere o un altro simbolo per continuare:\n\n");
     scanf("%s",&test);
     }while (test!='q');
     break;
     }      
     case 2:{   
     Lista=ordLista(Lista);   
     break;  
     } 
     case 3:{
     printElemento(Lista);
     break;
     }
     case 4:{
      printf("\n\nInserisci il valore da cercare:\n\n");
      scanf("%d",&x);
      if(searchlist(Lista,x)!=NULL)
      printf("\n\nIl valore e' nella lista.\n\n");
      else
      printf("\n\nIl valore non e' nella lista.\n\n");
     break;
     }
     case 5:{
      printf("\n\nInserisci il valore da eliminare:\n\n"); 
      scanf("%d",&x);
      if(Lista!=NULL)
      Lista=Delete(Lista,x);
      else printf("\n\nErrore. Lista vuota.\n\n");
      break;
     } 
    }
    }while(true);
    return 0; 
    }
    void menu(){ 
     printf("\n--------------------------"); 
     printf("\n1 - Inserisci Elemento\n"); 
     printf("2 - Ordinamento Lista\n"); 
     printf("3 - Visualizza Lista\n");
     printf("4 - Cerca elememto Lista\n");
     printf("5 - Elimina elemento Lista\n"); 
     printf("--------------------------\n");
    }
    //INSERIMENTO LISTA
    struct elemento *insElemento(struct elemento *list_head, int n){        
     
           struct elemento *newnode;
           newnode=malloc(sizeof(struct elemento));
           if(newnode==NULL)
           {
               printf("Error\n");
               exit(EXIT_FAILURE);
           }
           
           newnode->valore=n;
           newnode->next=NULL;
           return newnode; 
    }
    //ORDINAMENTO LISTA
    struct elemento *ordLista(struct elemento *list_head) {
    struct elemento *list_pointer;
    int flag, temp;  
    flag = 1;  
    while (flag == 1) {    
    list_pointer = list_head;    
    flag = 0;    
    while (list_pointer->next != NULL) {      
    if (list_pointer->valore > (list_pointer->next)->valore) {        
    temp = list_pointer->valore;        
    list_pointer->valore = (list_pointer->next)->valore;        
    (list_pointer->next)->valore = temp;        
    flag = 1;      
    }      
    list_pointer = list_pointer->next;    
    }     
    }      
    printElemento(list_head);
    return list_head;}
    //CERCA ELEMENTO
    struct elemento *searchlist(struct elemento *list_head,int n){       
    while(list_head!=NULL)           
    {     
    if(list_head->valore==n)           
    return list_head;       
    list_head=list_head->next;  
    }
    return NULL;
    }
    
    //ELIMINA ELEMENTO
    struct elemento *Delete(struct elemento *list_head, int DaEliminare){    
    struct elemento *list_pointer, *list_record;
    for(list_pointer=list_head, list_record=list_head; list_record!=NULL && list_record->valore!=DaEliminare; list_pointer=list_record, list_record=list_record->next); 
    if(list_record->valore==DaEliminare) {      
    if(list_record!=list_head)
    {          
    list_pointer->next=list_record->next;           
    free(list_record);
    return list_head;      
    }      
    else 
    {          
    list_pointer=list_record->next;            
    free(list_record);
    return list_pointer;            
    } 
    }   
    return list_head;       
    }
    //STAMPA LISTA
    void printElemento(struct elemento *Lista){ 
                                                
    struct elemento *list_pointer = Lista;    
    printf("\nlista -> ");         
    while(list_pointer != NULL){            
    printf("%d", list_pointer->valore);                
    printf(" -> ");               
    list_pointer = list_pointer->next;          
    }     
    printf(" NULL"); 
    }

  2. #2
    Utente di HTML.it L'avatar di torn24
    Registrato dal
    Aug 2008
    Messaggi
    551

    ciao

    A me la funzione cerca , funziona correttamente , ossia , mi da trovato o non trovato .

    io avevo pensato a un unica funzione inserimento() , che potesse creare una lista , o aggiungere elementi alla lista già presente , ti posto un esempio ma è fatta in fretta , comunque a prima vista sembra che non ci siano errori ...


    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <stdbool.h> 
    struct elemento{ 
    int valore; 
    struct elemento *next;
    };
    void menu();
    struct elemento *insElemento(struct elemento *, int n); 
    struct elemento *ordLista(struct elemento *);
    void printElemento(struct elemento *);
    struct elemento *searchlist(struct elemento *, int n);
    struct elemento *Delete (struct elemento *, int DaEliminare);
    int main(){
     struct elemento *Lista=NULL ; 
     int comando, val, x, test;
     do{
     menu(); 
     printf("\nComando:\t"); 
     scanf("%d", &comando); 
     
     switch(comando){  
     case 1:{   
     Lista=insElemento(Lista,val);
     break;
     }      
     case 2:{   
     Lista=ordLista(Lista);   
     break;  
     } 
     case 3:{
     printElemento(Lista);
     break;
     }
     case 4:{
      printf("\n\nInserisci il valore da cercare:\n\n");
      scanf("%d",&x);
      if(searchlist(Lista,x)!=NULL)
      printf("\n\nIl valore e' nella lista.\n\n");
      else
      printf("\n\nIl valore non e' nella lista.\n\n");
     break;
     }
     case 5:{
      printf("\n\nInserisci il valore da eliminare:\n\n"); 
      scanf("%d",&x);
      if(Lista!=NULL)
      Lista=Delete(Lista,x);
      else printf("\n\nErrore. Lista vuota.\n\n");
      break;
     } 
    }
    }while(true);
    return 0; 
    }
    void menu(){ 
     printf("\n--------------------------"); 
     printf("\n1 - Inserisci Elemento\n"); 
     printf("2 - Ordinamento Lista\n"); 
     printf("3 - Visualizza Lista\n");
     printf("4 - Cerca elememto Lista\n");
     printf("5 - Elimina elemento Lista\n"); 
     printf("--------------------------\n");
    }
    //INSERIMENTO LISTA
    struct elemento *insElemento(struct elemento *list_head, int n){        
     
           struct elemento *newnode,*temp;
           temp=list_head;
           int x=0;
           
           if(list_head!=NULL)
               while(temp->next!=NULL)
                    temp=temp->next;//se la lista non è NULL porto temp a puntare l'ulimo nodo , quello con next==NULL
           do
           {
              newnode=(struct elemento*)malloc(sizeof(struct elemento));
              if(newnode==NULL)
              {
                  printf("Error\n");
                  exit(EXIT_FAILURE);
              } 
              if(list_head==NULL)//se la lista è vuota
              {
                  printf("Inserisci il valore : ");
                  scanf("%d",&newnode->valore);
                  newnode->next=NULL;
                  list_head=newnode; 
                  temp=list_head;
              }    
              else
              {
                 printf("Inserisci il valore : ");
                 scanf("%d",&newnode->valore);
                 newnode->next=NULL;
                 temp->next=newnode;
                 temp=temp->next;
                   
              }   
              printf("Vuoi inserire un altro elemento 1 = si : ");
              scanf("%d",&x);  
           }while(x==1);    
           return list_head; 
    }
    //ORDINAMENTO LISTA
    struct elemento *ordLista(struct elemento *list_head) {
    struct elemento *list_pointer;
    int flag, temp;  
    flag = 1;  
    while (flag == 1) {    
    list_pointer = list_head;    
    flag = 0;    
    while (list_pointer->next != NULL) {      
    if (list_pointer->valore > (list_pointer->next)->valore) {        
    temp = list_pointer->valore;        
    list_pointer->valore = (list_pointer->next)->valore;        
    (list_pointer->next)->valore = temp;        
    flag = 1;      
    }      
    list_pointer = list_pointer->next;    
    }     
    }      
    printElemento(list_head);
    return list_head;}
    //CERCA ELEMENTO
    struct elemento *searchlist(struct elemento *list_head,int n){       
    while(list_head!=NULL)           
    {     
    if(list_head->valore==n)           
    return list_head;       
    list_head=list_head->next;  
    }
    return NULL;
    }
    
    
    //ELIMINA ELEMENTO
    struct elemento *Delete(struct elemento *list_head, int DaEliminare){    
    struct elemento *list_pointer, *list_record;
    for(list_pointer=list_head, list_record=list_head; list_record!=NULL && list_record->valore!=DaEliminare; list_pointer=list_record, list_record=list_record->next); 
    if(list_record->valore==DaEliminare) {      
    if(list_record!=list_head)
    {          
    list_pointer->next=list_record->next;           
    free(list_record);
    return list_head;      
    }      
    else 
    {          
    list_pointer=list_record->next;            
    free(list_record);
    return list_pointer;            
    } 
    }   
    return list_head;       
    }
    //STAMPA LISTA
    void printElemento(struct elemento *Lista){ 
                                                
    struct elemento *list_pointer = Lista;    
    printf("\nlista -> ");         
    while(list_pointer != NULL){            
    printf("%d", list_pointer->valore);                
    printf(" -> ");               
    list_pointer = list_pointer->next;          
    }     
    printf(" NULL"); 
    }
    Tecnologia

  3. #3
    Il cerca funziona anche se ho qualche dubbio:
    Perché metti return NULL alla fine della funzione? Se metto Return list_head funziona lo stesso..
    codice:
    struct elemento *searchlist(struct elemento *list_head,int n){       
    while(list_head!=NULL)           
    {     
    if(list_head->valore==n)           
    return list_head;       
    list_head=list_head->next;  
    }
    return NULL;  //SE METTO list_head FUNZIONA.. che serve il NULL?
    }
    Il problema è l'ELIMINAZIONE (Ci manca il controllo che non so dove inserirlo) che quando inserisco un valore che non è presente nella lista mi chiude il programma...

    Per l'inserimento funziona alla grande Grazie!

  4. #4
    Utente di HTML.it L'avatar di torn24
    Registrato dal
    Aug 2008
    Messaggi
    551

    Lunga discussione :)

    Mi pare di aver trovato l'errore nella funzione Delete() , il fatto che non ho scritto
    da zero le funzioni , ma sono partito dal tuo codice e le ho modificate , ma forse è una
    scusa , probabilmente avrei commesso errori di altro tipo

    codice:
    //ELIMINA ELEMENTO
    struct elemento *Delete(struct elemento *list_head,int DaEliminare){    
    struct elemento *list_pointer,*list_record;
    for(list_pointer=list_head, list_record=list_head; list_record!=NULL && list_record->valore!=DaEliminare; list_pointer=list_record, list_record=list_record->next); 
    if( list_record!=NULL && list_record->valore==DaEliminare ){      
    //PRIMA ESEGUIVA list_record->valore SU PUNTATORE NULL , SE NON TROVAVA VALORE CAUSA DELL'ERRORE
    
    if(list_record!=list_head)
    {          
    list_pointer->next=list_record->next;           
    free(list_record);
    return list_head;      
    }      
    else 
    {          
    list_pointer=list_record->next;            
    free(list_record);
    return list_pointer;            
    } 
    } 
    else
          printf(" Lista vuota o nodo non trovato \n");// se lanci la funzione e il nodo non esiste
    return list_head;       
    }



    codice:
    struct elemento *searchlist(struct elemento *list_head,int n){       
        while(list_head!=NULL)           
        {     
            if(list_head->valore==n)           
                return list_head;       
            list_head=list_head->next;  
        }
        return NULL;
    /* se nel while viene trovato valore==n  restituisce il puntatore al nodo 
       cioè list_head==NODO 
       se nel while NON viene trovato valore, list_head HA raggiunto la fine 
       della lista cioè NULL 
       quindi restituire NULL o list_head  è identico */
    }
    Ultima modifica di torn24; 30-07-2014 a 13:29
    Tecnologia

  5. #5
    Hahah bella chiacchierata...
    Sei stato chiarissimo, tutto funziona alla perfezione, grazie mille!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.