C, liste doppiamente collegate

di Anonimizzato14377 il
35 risposte

35 Risposte - Pagina 2

  • 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!
  • 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?
  • 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.
  • 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
  • Se hai capito la modifica che è stata fatta puoi a questo punto andare a rivedere il resto del codice
  • Ma ora è giusta stampa?
  • Sì. rivedi il resto
  • È mezz'ora che rivedo il codice, non ci trovo niente di sbagliato.. L'ho preso dalla dispensa del prof.. Suggerimento?
  • 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
  • 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
  • l'inserimento funziona
    Scusa, ma alla fine, quale sarebbe il codice compilabile e funzionante dell'inserimento?
  • #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;
       
    }
  • Non devi aver provato questo codice perché dà subito un errore in esecuzione alla prima add
  • L'ho appena compilato (con gcc) ed eseguito e non mi da nessun errore.. Non potreste semplicemente dirmi come stampare? Mi serve solo questo
  • 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