Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219

    [C]Lista dinamica,cancellare elementi

    Ho finalmente scritto la mia prima lista dinamica in C senza usare l' array che veniva riallocato.
    Ho capito che ci sono alcuni vantaggi effettivi,come ad esempio la semplicità nell' allocarne uno nuovo,ma adesso per esempio ho fatto una lista usando una static int,la funzione semplice è di contare da 0 fino a 100,eccola qua:
    codice:
    typedef struct node
    {
        int value;
        struct node *next;
    }item;
    
    item *create(item *pointer);
    
    
    int main (int argc,char **agrv)
    {
        item stack;
        item *pointer;
        int i;
        pointer=&stack;
        (*pointer).value=0;
        (*pointer).next=NULL;
        for(i=0;i<100;i++)
        {
            (*pointer).next=create((*pointer).next);
            pointer=(*pointer).next;
        }
        pointer=&stack;
        for(i=0;i<101;i++)
        {
            printf("%d,",(*pointer).value);
            pointer=(*pointer).next;
        }
        return 0;
    }
    
    
    item *create (item *pointer)
    {
        static int s_value=0;
        s_value++;
        pointer=(item*)malloc(sizeof(item));
        (*pointer).value=s_value;
        (*pointer).next=NULL;
        return pointer;
    }
    Adesso come faccio se voglio fare ad esempio un ordinamento per avere tutti i valori al contrario?
    Con l' array fisso potevo farlo semplicemente,ma qua proprio non riesco

  2. #2
    la soluzione banale prevede che usi un secondo puntatore a testa d'aiuto
    quindi scorri la prima lista e inserisci nel secondo puntatore in modo ordinato

    nella pratica per ogni valore della lista principale, prendi quello in testa, scorri la seconda lista per trovarne la posizione adatta (basta un semplice while-if) e inserisci, quindi passi all'elemento successivo della prima lista e così via

  3. #3
    Nel mio modulo list.c/list.h ci sono due funzioni al caso tuo:

    codice:
    list append (list l1, list l2);  
    list reverse (list l);
    list è un item*....

    La append serve per creare una nuova lista avente l2 concatenata a l1; la reverse sfrutta l'append per ottenere una lista al contrario.

    Come?

    Puoi fare un qualcosa di ricorsivo (pseudocodice):



    codice:
    list reverse (list l)
    {
           
             se l è vuota: ritorna lista vuota;
    
             altrimenti ritorna append di (reverse di l privata del primo elemento, primo elemento di l attaccato a una lista vuota);
    
    }
    Per fare tutto ciò ti conviene fare una funzione che ritorni una lista vuota e una funzione a cui passato un elemento e una lista ritorni la lista con in testa l'elemento (questa ti serve nell'ultima parte della reverse).

    Magari prova a fare qualche tentativo, al massimo poi ti passo il codice
    Salute a voi, da Laikius!

    --> Faber est suae quisque fortunae <--

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.