Lista doppiamente linkata in C

mictrt
Sera a tutti,
ho un problema con questa lista....si compila e non da ne warning ne errori,ma quando la lancio si blocca il tutto e non so che fare consigli?


#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>



struct nodo{
       int inf;
       struct nodo *succ;
       struct nodo *prec;
       };
//typedef struct nodo nodo;
//nodo *lista;
 struct dlist
{
    // tiene traccia di quanti nodi sono presenti all'interno della lista
    int count;

    // puntatore al primo nodo della lista
    struct nodo *testa;

    // puntatore all'ultimo nodo della lista
    struct nodo *coda;
};
typedef struct nodo nodo;
typedef struct dlist dlist;
int main(){

int v[8]={12,14,14,15,3,3,6,8},prova=8,i;
dlist *lista;
nodo *pezzo;

    // la lista inizialmente non contiene elementi
   lista->count = 0;

    // sia la testa che la coda puntano inizialmente a NULL
    lista->testa = lista->coda = NULL;

pezzo = malloc(sizeof(nodo));
pezzo->inf=v[0];
pezzo->succ=NULL;

    pezzo->prec = NULL;
        lista->testa = lista->coda = pezzo;
// aumento il contatore dei nodi della lista   
 lista->count++;

    //  la lista contiene gia' almeno un elemento
    // aggancio il nuovo nodo alla fine della lista
    // dopo l'inserimento, il nuovo nodo sara' quindi il tailer della lista
    

   
    
for(i=1;i<prova;i++){
                     
pezzo->inf=v[i];
pezzo->succ=NULL;

        pezzo->prec= lista->coda;
        lista->coda->succ= pezzo;
        lista->coda = pezzo;
   
printf("\n%d",pezzo->inf);
lista->count++;
}
    system("PAUSE");
    }     


Risposte
ulven101
Ciao, con precisione, mi dici cosa vorresti fare?
Intanto ti do qualche consiglio per tenere pulito il codice e lavorare in modo ordinato.

    #include<stdio.h>
    #include<malloc.h>
    #include<stdlib.h>

    struct nodo{
           int inf;
           struct nodo *succ;
           struct nodo *prec;
           };

     struct dlist
    {
        // tiene traccia di quanti nodi sono presenti all'interno della lista
        int count;
        // puntatore al primo nodo della lista
        struct nodo *testa;
        // puntatore all'ultimo nodo della lista
        struct nodo *coda;
    };

    typedef struct nodo nodo;
    typedef struct dlist dlist;

    int main(){

    int v[8]={12,14,14,15,3,3,6,8},prova=8,i;


Le costanti, specie se stai facendo un tentativo per vedere se il codice funziona, ti conviene tenerle fuori dal main, dichiarandole globalmente ed usando un nome tutto in maiuscolo (come è convenzione).
Inoltre, le variabili andrebbero dichiarate nel momento in cui ti servono (in questo caso i potevi chiararlo benissimo poco prima del ciclo for).

    dlist *lista;
    nodo *pezzo;
    // la lista inizialmente non contiene elementi
    lista->count = 0;
    // sia la testa che la coda puntano inizialmente a NULL
    lista->testa = lista->coda = NULL;


Sarebbe buona norma effettuare un assegnamento alla volta, per una questione di leggibilità.


    pezzo = malloc(sizeof(nodo));
    pezzo->inf=v[0];
    pezzo->succ = NULL;
    pezzo->prec = NULL;
    lista->testa = lista->coda = pezzo;
    // aumento il contatore dei nodi della lista   
     lista->count++;

        //  la lista contiene gia' almeno un elemento
        // aggancio il nuovo nodo alla fine della lista
        // dopo l'inserimento, il nuovo nodo sara' quindi il tailer della lista

    for(i=1;i<prova;i++){
                         
    pezzo->inf=v[i];
    pezzo->succ=NULL;

            pezzo->prec= lista->coda;
            lista->coda->succ= pezzo;
            lista->coda = pezzo;
       
    printf("\n%d",pezzo->inf);
    lista->count++;
    }
        system("PAUSE");
        }     



Credo di aver capito, se non altro, perchè non funziona: giustamente ti sei creato una struttura per tenere il puntatore alla testa e alla coda della lista e il contatore degli elementi. Il problema è che tu questa lista non la crei. Allochi la memoria in "pezzo" una volta sola ed inizializzi i puntatori lista->testa e lista->coda a pezzo. Ma poi, non vai a memorizzare nuovi elementi: sovrascrivi continuamente la stessa area di memoria che avevi precedentemente allocato.

Possibile soluzione:
    for(i=1;i<prova;i++){
    pezzo = malloc(sizeof(nodo));
                         
    pezzo->inf=v[i];
    pezzo->succ=NULL;

            pezzo->prec= lista->coda;
            lista->coda->succ= pezzo;
            lista->coda = pezzo;
       
    printf("\n%d",pezzo->inf);
    lista->count++;
    }
        system("PAUSE");
        }     


Rispondi
Per rispondere a questa discussione devi prima effettuare il login.