Liste

di il
17 risposte

17 Risposte - Pagina 2

  • Re: Liste

    Credo che ti sia perso un passaggio. Nel main hai:
    
    l = InserimentoInTesta(l, a);
    
    Cioè, quel temp che hai nella funzione, l'hai restituito nel return e assegnato a l, che quindi adesso punta al nuovo primo elemento.
    Essendo un inserimento in testa, ogni nuovo elemento si posiziona prima del primo, e come suo successivo punta all'ex primo elemento.
  • Re: Liste

    Hai un po di confusione sulle liste. Queste come puoi ben notare sono delle strutture dati, dove però i dati non vengono memorizzati in aree di memoria contigue, cioè per dirla più facile immagina un cassettiera con tanti cassetti se tu salvi il dato nel primo cassetto, il secondo dato non è detto che venga messo nel secondo cassetto, ma pensi nel terzo quarto o comunque nelle aree libere, questo perché nei moderni SO si usa un'allocazione non contigua della memoria.
    Ora ritornando al C/ C++ sostanzialmente tu hai una struttura tipo
    struct lista{
    int dato
    struct lista *pnext
    } Lista;
    Ora in testa tu avrai il primo dato e per accedere al secondo dovrai visualizzare il contenuto di pnext, tipo
    Lista prova;
    prova.dato = ottieni il dato in testa. Ora se tu vuoi accedere al 2 dato dovrai fare cosi
    Lista tmp;
    tmp=prova->pnext e cosi avra accesso al secondo dato. metti questo in un ciclo e potrai scorrere la lista finche il pnext è != NULL
    per capirci
    tmp=prova->pnext;
    While (tmp != NULL){
    Stampa dato;
    tmp=tmp->pnext;
    }
    Per inserire un elemento in testa o in coda o al centro devi prima di tutto
    SALVARE i pnxet perché altrimenti spezzeresti la lista.
    In sostanza cerca di seguirmi
    Hai 2 nodi A e C e vuoi inserire B tra i due siccome hai in A il puntatore a C tu dovrai
    fare prima di tutto
    B.pnext=A.pnext // quindi ho preso il nodo B e l'ho collegato al successivo di A cioè C
    A.pnext= B; // ora ho preso il successivo di A e l'ho impostato a B (precedentemente era C) ora avrai
    A B C . Ovviamente queste sono liste a singolo puntatore qualora avresti bisogno di doppio puntatore l'operazione a cui devi dare priorità è sempre il collegamento tra i pnext perché qualora tu avessi scritto prima A.pnext=B e poi B.pnext=A.pnext sostanzialmente B punta a se stesso... Loop infinito
    Non so che domanda hai fatto precisamente però mi pare che hai un po di confusione sulle liste. In ogni caso oltre allo studio delle liste ti consiglio di capire anche un po la situazione allocazione memoria.
  • Re: Liste

    Spark ha scritto:


    Quello che non capisco è il perchè non vada in loop questa funzione:
    
    void StampaLista(Lista l){
    	Nodo *puntcorrente = l;
    	while (puntcorrente != NULL){
    		printf("elemento corrente> %d\n",puntcorrente->dato);
    		puntcorrente = puntcorrente->prox;
    	}
    }
    
    Questa assegnazione va ad assegnare a puntcorrente il valore di prox che dovrebbe corrispondere sempre all'indirizzo del primo nodo.
    In sostanza non va in loop per questi motivi:
    1) Il nodo puntocorrente viene inizializzato con il primo elemento della lista, quindi al termine di questa operazione sia il puntatore della lista che il puntatore del nodo puntocorrente , punteranno lo stesso elemento in memoria , ciò significa (in parole molto povere) che il puntatore del nodo conosce la locazione di memoria in cui è contenuto il primo elemento della lista.
    2)All'interno del while la scrittura "puntcorrente->prox sta a significare che ora il puntatore del nodo puntocorrente non sta puntando più il primo elemento della lista, ma il secondo (domanda lecita sarebbe, come fa a sapere quale è l'indirizzo del prossimo elemento?) La risposta è semplice se hai studiato la struttura della lista, saprai sicuramente che esse sono strutture dinamiche che hanno ordine e linearità, ciò significa che da un elemento è possibile passare al successivo attraverso l'uso dei puntatori che a seconda di quante volte usiamo il ->prox andranno a puntare gli elementi successivi presenti in essa. Quindi loop continuerà finchè il puntatore del nodo avrà valore != da NULL.

    Spero che questa spiegazione abbia chiarito qualche tuo dubbio.
Devi accedere o registrarti per scrivere nel forum
17 risposte