Lista doppiamente linkata in C
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?
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
Ciao, con precisione, mi dici cosa vorresti fare?
Intanto ti do qualche consiglio per tenere pulito il codice e lavorare in modo ordinato.
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).
Sarebbe buona norma effettuare un assegnamento alla volta, per una questione di leggibilità.
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:
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"); }