Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    [C] Problema inserimento in lista

    Ciao a tutti
    Devo realizzare una coda che ha due metodi, uno (leggi) che riceve una sequenza di numeri interi (finché l'utente non ne inserisce uno negativo) e costruisce una lista, restituendo il puntatore alla testa.
    L'altro metodo (inserisci ) inserisce nella lista un nuovo elemento x, mantenendo l'ordinamento e ritorna il puntatore al nodo inserito (da fare ricorsivamente).

    Questa è la lista:
    codice:
    typedef struct nodo *lista;
    struct nodo {
    int x; /* Informazione. */
    lista next; /* Puntatore al nodo successivo */
    };
    L'inserisci, che inserisce un nuovo elemento in ordine:
    codice:
    lista inserisci(lista *punt_lista, int x) {
          lista temp;
          if(*punt_lista == NULL || (*punt_lista)->x >=x){
                         
             temp = (lista)malloc(sizeof(struct nodo));
             temp->x = x;
             temp->next= *punt_lista; 
             
          }
          else 
             inserisci(&temp->next, x);
          return temp;
    
          
          }
    Del codice qui sopra mi sembra manchi l'istruzione che dice all'elemento precedente a quello inserito di puntare a temp, cioé inserisco temp ma non viene "agganciato alla coda"..ma non capisco come fare!

    codice:
    lista leggi(void) {
          lista punt_lista;
          lista temp;
          
          int n;
          printf("Immetti una sequenza di interi terminata da un numero negativo: ");
          do{
            
             scanf("%d",&n);
             
             if(n>=0){
                                  
                    temp=(lista)malloc(sizeof(struct nodo));
                    if(!temp)
                    {
                       printf("Allocazione memoria non riuscita");
                       return NULL;
                    }
                    else{
                         
                     inserisci(&(temp->next),n);
                    
                     punt_lista=temp;
                     free(temp);
                     }
            }
    
             
          }while(n>=0);
            return punt_lista;
    Io passerei per argomento a di inserisci(&punt_lista,n); ,ovvero la lista che sto creando.. ma mi dà errore!!

    edit: metto anche il main:
    codice:
    #include <stdio.h>
    lista leggi(void);
    int main(void)
    {
    lista L[5];
    L[0]=leggi();
    L[1]=leggi();
    printf("\nL1=");
    stampa(L[0]);
    printf("\nL2=");
    stampa(L[1]);
    system("PAUSE");
    return 0;
    }
    Anche se non scrivete il codice da modificare vi prego di spiegarmi cosa sbaglio! Grazie!
    Ho cercato nel forum ma non ho trovato nulla di simile

  2. #2

    Re: [C] Problema inserimento in lista

    Originariamente inviato da Lasentinella
    Ciao a tutti
    Devo realizzare una coda che ha due metodi, uno (leggi) che riceve una sequenza di numeri interi (finché l'utente non ne inserisce uno negativo) e costruisce una lista, restituendo il puntatore alla testa.
    L'altro metodo (inserisci ) inserisce nella lista un nuovo elemento x, mantenendo l'ordinamento e ritorna il puntatore al nodo inserito (da fare ricorsivamente).

    Questa è la lista:
    codice:
    typedef struct nodo *lista;
    struct nodo {
    int x; /* Informazione. */
    lista next; /* Puntatore al nodo successivo */
    };
    L'inserisci, che inserisce un nuovo elemento in ordine:
    codice:
    lista inserisci(lista *punt_lista, int x) {
          lista temp;
          if(*punt_lista == NULL || (*punt_lista)->x >=x){
                         
             temp = (lista)malloc(sizeof(struct nodo));
             temp->x = x;
             temp->next= *punt_lista; 
             
          }
          else 
             inserisci(&temp->next, x);
          return temp;
    
          
          }
    Del codice qui sopra mi sembra manchi l'istruzione che dice all'elemento precedente a quello inserito di puntare a temp, cioé inserisco temp ma non viene "agganciato alla coda"..ma non capisco come fare!

    codice:
    lista leggi(void) {
          lista punt_lista;
          lista temp;
          
          int n;
          printf("Immetti una sequenza di interi terminata da un numero negativo: ");
          do{
            
             scanf("%d",&n);
             
             if(n>=0){
                                  
                    temp=(lista)malloc(sizeof(struct nodo));
                    if(!temp)
                    {
                       printf("Allocazione memoria non riuscita");
                       return NULL;
                    }
                    else{
                         
                     inserisci(&(temp->next),n);
                    
                     punt_lista=temp;
                     free(temp);
                     }
            }
    
             
          }while(n>=0);
            return punt_lista;
    Io passerei per argomento a di inserisci(&punt_lista,n); ,ovvero la lista che sto creando.. ma mi dà errore!!

    edit: metto anche il main:
    codice:
    #include <stdio.h>
    lista leggi(void);
    int main(void)
    {
    lista L[5];
    L[0]=leggi();
    L[1]=leggi();
    printf("\nL1=");
    stampa(L[0]);
    printf("\nL2=");
    stampa(L[1]);
    system("PAUSE");
    return 0;
    }
    Anche se non scrivete il codice da modificare vi prego di spiegarmi cosa sbaglio! Grazie!
    Ho cercato nel forum ma non ho trovato nulla di simile
    Uhm dando una rapida occhiata mi sembra che non metti mai a NULL l elemento next quando chiudi la lista....

  3. #3
    Ho provato ad aggiungere (punt_lista)->next=NULL;
    dopo free(temp);
    codice:
    free(temp); 
    (punt_lista)->next=NULL;
    ma non funziona comunque
    Comunque è vero, mancava anche questo

  4. #4
    Originariamente inviato da Lasentinella
    Ho provato ad aggiungere (punt_lista)->next=NULL;
    dopo free(temp);
    codice:
    free(temp); 
    (punt_lista)->next=NULL;
    ma non funziona comunque
    Comunque è vero, mancava anche questo
    Ciao Sentinella,

    prova questo codice, dovrebbe funzionare. Nei commenti ho messo un po di spiegazioni, spero ti siano utili

    Codice PHP:
    #include <stdio.h>
    #include <stdlib.h>
    #include <signal.h>
    #include <math.h>

    typedef struct nodo *lista;
    struct nodo {
    int x/* Informazione. */
    lista next/* Puntatore al nodo successivo */
    };

    /* ======Funzione inserisci=========== */

    lista inserisci(lista *punt_listaint x
    {
         
          
    lista temp,prov;
          
          
    // Sono alla fine oppure l elemento corrente e maggiore del numero inserito
          
    if((*punt_lista) == NULL || (*punt_lista)->>=x)   
          {
                           
             
    temp = (lista)malloc(sizeof(struct nodo));
             
             if(*
    punt_lista == NULL)  // inserimento elemento al fondo
              
    {
               (*
    punt_lista)=temp;         
               (*
    punt_lista)->x=x;
               (*
    punt_lista)->next=NULL;   // siccome inserisco al fondo il prossimo campo sara NULL!
               
    return *punt_lista;  
              }
              else  
    // inserimendo del nodo in mezzo alla coda
              
    {
                
    prov=(*punt_lista);
                (*
    punt_lista)=temp;
                (*
    punt_lista)->x=x;
                (*
    punt_lista)->next=prov;
                return *
    punt_lista;
                
              }
          }
          
          
    // altrimenti la coda e ordinata e vado avanti
          
    else 
             
    inserisci(&(*punt_lista)->nextx);
          
          
    }
          
    /* ===============================Funzione leggi================================*/
    /* Restituisce la testa della coda come valore
    /* mentre come riferimento restituisce l indirizzo dell ultimo elemento inserito*/
    /*==============================================================================*/

    lista leggi(lista lastpunt
    {
      
    lista punt_lista;
      
      
    int n,flag=1;
      
      
      
    printf("Immetti una sequenza di interi terminata da un numero negativo: ");
      do
      {
       
    scanf("%d",&n);
          
       if(
    n>=0)
       {
        if(
    flag// Prima iterazione, creo la testa della coda!!!!
         
    {
         
    punt_lista=(lista)malloc(sizeof(struct nodo));
         if(!
    punt_lista)
          {
            
    printf("Allocazione memoria non riuscita");
            return 
    NULL;
          }
          
    punt_lista->x=n;
          
    punt_lista->next=NULL;
          
    flag =0// flag=0, in questo modo non creo sempre delle teste!
         
    }
         else
           *
    lastpunt=inserisci(&punt_lista,n);  // creazione altri nodi della coda
       
    }
      }while(
    n>=0);
    return 
    punt_lista;   // restituisco la testa della coda
    }

    int main()
    {
    lista L[5],lastpunt,temppunt;
    L[0]=leggi(&lastpunt);

    temppunt=L[0];

    /* Ciclo di stampa, utile per il debug*/
    while(temppunt!=NULL)
    {
     
    printf("%d\n",temppunt->x);
     
    temppunt=temppunt->next;  
    }


    system("pause");


    Saluti e buona settimana!!!

  5. #5
    Perfetto! Non so come avrei fatto senza il tuo aiuto, grazie infinite!!!!
    Il programma è chiarissimo e i commenti che hai messo sono utilissimi

    Grazie ancora!
    Ciao e buona settimana

  6. #6
    Originariamente inviato da Lasentinella
    Perfetto! Non so come avrei fatto senza il tuo aiuto, grazie infinite!!!!
    Il programma è chiarissimo e i commenti che hai messo sono utilissimi

    Grazie ancora!
    Ciao e buona settimana
    Figurati!!

    Cmq dimenticavo...bisogna deallocare la memoria occupata dalla coda a fine programma con una free!!

    Buon lavoro!! Saluti!

  7. #7
    Stavo riguardando il metodo elimina che deallochi lo spazio occupato dalla lista...secondo voi libera lo spazio oppure cancella solo temp questo codice?

    codice:
    void elimina(lista *p_L){
         while(*p_L!=NULL){
                if(*p_L!=NULL){
                   lista tmp = (lista)malloc(sizeof(struct nodo));
                   tmp = *p_L;
                   *p_L = (*p_L)->next;
                   free(tmp);      
                }
         }
    }
    Perché, provando a stampare la lista dopo elimina(), non ottengo nessun elemento, ma non so se succede perché è stata disallocata oppure se è SOLO il risultato di *p_L = (*p_L)->next;

    Grazie

  8. #8
    Originariamente inviato da Lasentinella
    Stavo riguardando il metodo elimina che deallochi lo spazio occupato dalla lista...secondo voi libera lo spazio oppure cancella solo temp questo codice?

    codice:
    void elimina(lista *p_L){
         while(*p_L!=NULL){
                if(*p_L!=NULL){
                   lista tmp = (lista)malloc(sizeof(struct nodo));
                   tmp = *p_L;
                   *p_L = (*p_L)->next;
                   free(tmp);      
                }
         }
    }
    Perché, provando a stampare la lista dopo elimina(), non ottengo nessun elemento, ma non so se succede perché è stata disallocata oppure se è SOLO il risultato di *p_L = (*p_L)->next;

    Grazie
    Credo che sia giusto quello che tu abbia fatto


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