Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15
  1. #1

    [C] Ricerca ed Elimina elemento di una Lista

    Saaalve. Vi scrivo per chiedervi una mano riguardo per risolvere il problema del mio codice..
    Praticamente ho provato di tutto.. ma non riesco proprio a far funzionare la RICERCA e l'ELIMINAZIONE degli elementi.. Qualche consiglio?

    Ecco il mio codice:

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    struct elemento{ 
    int valore; 
    struct elemento *next;
    };
    void menu();
    struct elemento *insElemento(struct elemento *); 
    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, x, i; 
     do{
     menu(); 
     printf("\nComando:\t"); 
     scanf("%d", &comando); 
     
     switch(comando){  
     case 1:{   
     Lista=insElemento(Lista);   
     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(i,x)!=NULL)
      printf("\n\nIl valore e' nella lista.\n\n");
     break;
     }
     case 5:{
      printf("\n\nInserisci il valore da eliminare:\n\n"); 
      scanf("%d",&x);
      if(i!=NULL)
      i=Delete(i,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){    
    struct elemento *list_pointer, *list_record;    
    int i=2, n=0, val, newval; 
       
    list_record = (struct elemento *)malloc(sizeof(struct elemento));    
    printf("\nInserisci il 1 elemento: ");    
    scanf("%d", &val); 
    list_record->valore = val; 
    list_head=list_record; 
    list_pointer = list_head; 
    do{          
     list_record->next = (struct elemento *)malloc(sizeof(struct elemento));          
     list_record = list_record->next;          
     printf("\nInserisci il %d elemento: ", i++);          
     scanf("%d", &newval);          
     list_record->valore = newval;
     printf("Inserire nuovo valore?");
     scanf("%d",&n);                 
    }while(n==1);        
    list_record->next = NULL;       
    list_pointer = list_head;
    printElemento(list_head);
    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 && list_head->valore!=n)
               list_head=list_head->next;
           return list_head;
    }
    //ELIMINA ELEMENTO
    struct entry *Delete (struct entry *list_head, int DaEliminare)
    {
     struct entry *list_record,*list_pointer;
     for(list_pointer=NULL, list_record=list_head; list_record!=NULL && list_record->valore!=DaEliminare; list_pointer=list_record, list_record=list_record->next)
     
         if(list_record==NULL)
               return list_head;
               
           if(list_pointer==NULL)
               list_head=list_head->next;
           else
               list_pointer->next=list_record->next;
               
           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

    Ciao , visto che nella funzione delete , non usi la funzione free() , mi pare che non si possa considerare corretta , ti metto un esempio di come implementerei io la funzione , POSSONO esserci errori


    codice:
    struct entry *Delete (struct entry *list_head, int DaEliminare)
    {
     struct entry *list_record,*list_pointer;
     
    /*
         list_pointer e list_record , partono puntando entrambi alla testa della lista
    	 quando il ciclo for incrementa , troviamo che  list_record punta al nodo sucessivo , e 
    	 list_pointer al nodo che precede
         il ciclo termina quando list_record è NULL o quando ha trovato valore
    	 con un if , non dipendente dal for controllo se ha trovato valore 
    
    
    
    
    */ 
     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)//se il nodo da eliminare non è la testa
    	  {
              list_pointer->next=list_record->next //List pointer next ,puntava a record, adesso punta al nodo sucessivo  
    		  free(list_record);//elimino il nodo in memoria
    		  return list_head;
          }
    	  else //il nodo da eliminare è il primo 
    	  {
    	      list_pointer=list_record->next  
    		  free(list_record);//elimino il nodo in memoria
    		  return list_pointer;
    	  
    	  }
     }
     
      return list_head;
           
    }
    Tecnologia

  3. #3
    Mhh, penso di aver capito.. Appena posso provo il codice e ti faccio sapere!
    Invece per quanto riguarda la RICERCA.. (forse anche l'eliminazione) perché nel case mi segna come errore la x?
    if(searchlist(i,x)!=NULL)

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

    Ciao

    Ricerca , restituisce sempre head in qualunque caso ..
    alla funzione searchlist() non devi passare int i ,come primo parametro , ma la testa della lista .
    VEDO CHE HAI FATTO LO STESSO ERRORE CON DELETE ! non i come parametro , ma lista ....


    codice:
    struct elemento *searchlist(struct elemento *list_head,int n)
    {
           while(list_head!=NULL && list_head->valore!=n)
               list_head=list_head->next;
           if(list_head->valore==n)//il ciclo while termina o head==NULL  o valore==n 
               return list_head;
           else 
               return NULL;//se ritorna NULL n non è presente nella lista 
          
         
    }
    Ultima modifica di torn24; 30-07-2014 a 08:30
    Tecnologia

  5. #5
    Si ma i problema me lo da nel case del main()
    Mi dice "invalid conversion from 'int' to 'elemento' [-fpermessive]
    io x l'ho dichiarata int.. o.O

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

    ciao

    codice:
    int main(){
     struct elemento *Lista=NULL ; 
     int comando, x, i; 
     do{
     menu(); 
     printf("\nComando:\t"); 
     scanf("%d",&comando); 
     
     switch(comando){  
     case1:{   
     Lista=insElemento(Lista);   
     break;  
     }   
     case2:{   
     Lista=ordLista(Lista);   
     break;  
     } 
     case3:{
     printElemento(Lista);
     break;
     }
     case4:{
      printf("\n\nInserisci il valore da cercare:\n\n");
      scanf("%d",&x);
      if(searchlist(Lista,x)!=NULL)// se lista è NULL la funzione restituirà NULL
      printf("\n\nIl valore e' nella lista.\n\n");
     break;
     }
     case5:{
      printf("\n\nInserisci il valore da eliminare:\n\n"); 
      scanf("%d",&x);
      if(i!=NULL)
      i=Delete(Lista,x);// se lista è NULL la funzione restituirà NULL
    else printf("\n\nErrore. Lista vuota.\n\n");
      break;
     } 
    }while(true);
    return0; 
    }
    Tecnologia

  7. #7
    Eh be torn ci siamo quasi..

    RICERCA: Mi trova i valori presenti, ma quando digito un valore non presente mi chiude il programma..
    Ho inserito un else printf("Valore non presente"); ma lo stesso...

    ELIMINAZIONE: Praticamente qualsiasi valore io digiti mi manda il printf dell'else.. "Errore. Lista vuota."

  8. #8
    Utente di HTML.it L'avatar di torn24
    Registrato dal
    Aug 2008
    Messaggi
    551
    Ciao , non è che potresti postare il programma come è ora , tra tag code, cosi lo compilo e lo provo , altrimenti mi resta di immaginare il codice che hai modificato ...

    Prima di eliminare un nodo , hai pensato di creare la lista con l'apposita funzione , immagino di si ma non si sa mai ....
    Tecnologia

  9. #9

    Ecco a te!

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <stdbool.h> //Ho messo la libreria percè il true nel while mi da problemi.. Strano, perchè anche senza libreria funzionava..
    struct elemento{ 
    int valore; 
    struct elemento *next;
    };
    void menu();
    struct elemento *insElemento(struct elemento *); 
    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, x, i;
     do{
     menu(); 
     printf("\nComando:\t"); 
     scanf("%d", &comando); 
     
     switch(comando){  
     case 1:{   
     Lista=insElemento(Lista);   
     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(i!=NULL)
      i=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){    
    struct elemento *list_pointer, *list_record;    
    int i=2, n=0, val, newval; 
       
    list_record = (struct elemento *)malloc(sizeof(struct elemento));    
    printf("\nInserisci il 1 elemento: ");    
    scanf("%d", &val); 
    list_record->valore = val; 
    list_head=list_record; 
    list_pointer = list_head; 
    do{          
     list_record->next = (struct elemento *)malloc(sizeof(struct elemento));          
     list_record = list_record->next;          
     printf("\nInserisci il %d elemento: ", i++);          
     scanf("%d", &newval);          
     list_record->valore = newval;
     printf("Inserire nuovo valore?");
     scanf("%d",&n);                 
    }while(n==1);        
    list_record->next = NULL;       
    list_pointer = list_head;
    printElemento(list_head);
    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 && list_head->valore!=n)           
    list_head=list_head->next;       
    if(list_head->valore==n)           
    return list_head;       
    else            
    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"); 
    }
    Sisi, ho anche utilizzato la funzione stampa.. e poi le altre..

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

    Ciao

    Ciao , la funzione delete() funzionava bene , eri tu che usavi la variabile intera i al posto di Lista
    mentre per la funzione cerca , effettivamente era sbagliata , perchè se non trovava il valore , eseguiva
    if(list_head->valore==n) su NULL
    ecco le correzioni , se vuoi modifica la funzione inserisci , in modo che non solo puoi creare la lista , ma ne puoi aggiungere elementi .

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <stdbool.h> //Ho messo la libreria percè il true nel while mi da problemi.. Strano, perchè anche senza libreria funzionava..
    struct elemento{ 
    int valore; 
    struct elemento *next;
    };
    void menu();
    struct elemento *insElemento(struct elemento *); 
    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, x, i;
     do{
     menu(); 
     printf("\nComando:\t"); 
     scanf("%d", &comando); 
     
     switch(comando){  
     case 1:{   
     Lista=insElemento(Lista);   
     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)//mancava lista al posto della variabile i 
        Lista=Delete(Lista,x);//i è un intero non devi assegnarli un puntatore e non serve
      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){    
        
        /*QUESTA FUNZIONE VA BENE NEL CASO LA LISTA SIA NULL
          MA SE LA LISTA è GIA' STATA CREATA , BISOGNEREBBE MODIFICARE
          LA FUNZIONE IN MODO CHE AGGIUNGA ELEMENTI , CIOE SCORRERE LA
          LISTA FINO A NULL , E DA LI AGGIUNGERE I NUOVI NODI*/
    struct elemento *list_pointer, *list_record;    
    int i=2, n=0, val, newval; 
       
    list_record = (struct elemento *)malloc(sizeof(struct elemento));    
    printf("\nInserisci il 1 elemento: ");    
    scanf("%d", &val); 
    list_record->valore = val; 
    list_head=list_record; 
    list_pointer = list_head; 
    do{          
     list_record->next = (struct elemento *)malloc(sizeof(struct elemento));          
     list_record = list_record->next;          
     printf("\nInserisci il %d elemento: ", i++);          
     scanf("%d", &newval);          
     list_record->valore = newval;
     printf("Inserire nuovo valore?");
     scanf("%d",&n);                 
    }while(n==1);        
    list_record->next = NULL;       
    list_pointer = list_head;
    printElemento(list_head);
    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;//modifica alla funzione 
    }
    //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"); 
    }
    Ultima modifica di torn24; 30-07-2014 a 10:40
    Tecnologia

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 © 2025 vBulletin Solutions, Inc. All rights reserved.