C, liste doppiamente collegate

di il
35 risposte

35 Risposte - Pagina 2

  • Re: C, liste doppiamente collegate

    Nel disegno non hai dato un nome alle strutture e ai campi di tali strutture; per questo motivo hai stai confondendo i puntatori di una struttura con i puntatori di un'altra (il compilatore dovrebbe averti segnalato questo problema).
    Se ci rifletti sopra (su un disegno con i nomi) capirai che questo
       while(lis->first->next != NULL)
    non ha alcun senso!
  • Re: C, liste doppiamente collegate

    Sono riuscito a caricare l'immagine della dispensa.. Eccola qua:



    Il campo next dell'ultima struttura, quella a cui punta last, è == \ ovvero NULL;

    while(lis -> first -> next != NULL) a me, scusa l'insistenza, sembra avere senso..

    Però non funziona, quindi effettivamente non va bene. In compilazione non mi da nessun warning\errore. Però, in esercuzione, mi da core dump..

    Qual è la condizione giusta?
  • Re: C, liste doppiamente collegate

    Secondo te lis->first->next dovrebbe cambiare?
    Non sarebbe più corretto caricare in un puntatore (chiamiamolo p) al tipo TipoNodoListaDoppia il valore di lis->first e poi scorrere la lista usando p?
    Riflettici.
  • Re: C, liste doppiamente collegate

    In questo modo dici?
    void stampa(TipoListaDoppia *lis)
    {	
    	TipoNodoListaDoppia *p = lis -> first;
    	while(p != NULL)
    	{
    		printf("%d -> ", p -> info);
    		p = p -> next;
    	}
    }
    Non da warning/errori in compilazione, ma da sempre lo stesso problema in esecuzione
  • Re: C, liste doppiamente collegate

    Se hai capito la modifica che è stata fatta puoi a questo punto andare a rivedere il resto del codice
  • Re: C, liste doppiamente collegate

    Ma ora è giusta stampa?
  • Re: C, liste doppiamente collegate

    Sì. rivedi il resto
  • Re: C, liste doppiamente collegate

    È mezz'ora che rivedo il codice, non ci trovo niente di sbagliato.. L'ho preso dalla dispensa del prof.. Suggerimento?
  • Re: C, liste doppiamente collegate

    Suggerimento?
    Te l'ho già detto: disegna su carta le strutture, con nomi e campi, quindi descrivi le singole operazioni che vuoi eseguire su questa struttura. Prima di scrivere codice devono esserti chiare, nei minimi dettagli, lo svolgimento delle varie operazioni.
    Disegna degli esempi, con struttura vuota, con 1 elemento solo, con più di 1 ... immagina di dover inserire 1 elemento, su una struttura vuota o su una struttura non vuota...
    Suggerimento aggiuntivo: non guardare la dispensa del prof, tieni buone solo le due struct; quando avrai chiaro, traduci in C e prova; alla fine confronta con le dispense del prof e vedrai che sarà tutto chiaro!
    E con questo per me è chiuso perchè non ho altro da suggerire
  • Re: C, liste doppiamente collegate

    Io continuo a non vederci niente di male, l'inserimento funziona. L'ho sempre fatto così, mi serviva solo la condizione del ciclo.. Comunque grazie
  • Re: C, liste doppiamente collegate

    l'inserimento funziona
    Scusa, ma alla fine, quale sarebbe il codice compilabile e funzionante dell'inserimento?
  • Re: C, liste doppiamente collegate

    #include <stdio.h>
    #include <stdlib.h>
    
    struct ElemListaDoppia{
       
        int info;
        struct ElemListaDoppia *next;
        struct ElemListaDoppia *prev;
    };
    
    typedef struct ElemListaDoppia TipoNodoListaDoppia;
     
    struct RecordListaDoppia{
       
        TipoNodoListaDoppia *first;
        TipoNodoListaDoppia *last;
       
    };
    
    typedef struct RecordListaDoppia TipoListaDoppia;
    
    void addTestaLista(TipoListaDoppia *lis, int e);
    
    int main()
    {
        TipoListaDoppia lista;
       
        int i;
       
        for(i = 0; i < 5; i++)
            addTestaLista(&lista, i);
    
        //Puntatore per stampare
        TipoNodoListaDoppia *p = lista.first;
    
        printf("%d -> ", p -> info);
        p = p -> next;
        printf("%d -> ", p -> info);
    
        //In questo modo mi stampa 4 -> 3 ->, il che è giusto.
        //Vorrei, però, utilizzare un ciclo per la stampa.
    
        //Io ho provato così
        // while(p -> next != NULL)
        //{
        //    printf("%d -> ", p -> info);
        //    p = p -> next;
        //}
    
       //Ma non va. Qual è la condizione giusta da inserire?
    }
    
    void addTestaLista(TipoListaDoppia *lis, int e)
    {
        TipoNodoListaDoppia *aux = (TipoNodoListaDoppia*) malloc (sizeof(TipoNodoListaDoppia));
        aux -> info = e;   
       
        if(lis == NULL)
        {
            aux -> prev = NULL;
            aux -> next = NULL;
            lis -> first = aux;
            lis -> last = aux;
           
            return;
        }
        aux -> prev = NULL;
        aux -> next = lis -> first;
        lis -> first -> prev = aux;
        lis -> first = aux;
       
    }
  • Re: C, liste doppiamente collegate

    Non devi aver provato questo codice perché dà subito un errore in esecuzione alla prima add
  • Re: C, liste doppiamente collegate

    L'ho appena compilato (con gcc) ed eseguito e non mi da nessun errore.. Non potreste semplicemente dirmi come stampare? Mi serve solo questo
  • Re: C, liste doppiamente collegate

    Guarda che ho compilato ed eseguito e ci sono errori gravi (access violation) e così via.
    Se non ci credi, me ne farò una ragione.

    Che senso ha parlare della stampa se il codice dell'inserimento non funziona proprio ...

    Comunque è quello classico, se p è il puntatore al primo nodo
    
        while(p)
        {
            printf("%d -> ", p -> info);
            p = p -> next;
        }
    
Devi accedere o registrarti per scrivere nel forum
35 risposte