PDA

Visualizza la versione completa : [C] Lista doppiamente concatenata: problema con l'aggiunta di nuovo nodo


alemutasa
27-03-2015, 16:07
Salve a tutti.

Ho un problema con una funzione che serve per creare un nuovo nodo di una lista doppiamente concatenata. La funzione questa:



//dichiaro la struttura
struct node{
int data;
struct node *prev;
struct node *next;
};

//la funzione prende il input un puntatore a struttura e restituisce un altro puntatore a struttura
struct node* add(struct node *head){
//dichiaro la variabile di ritorno
struct node *newElement;
//dichiaro la variabile num
int num;

//prendo in input il dato da inserire nel campo data della struttura
printf("insert data: ");
scanf("%d", &num);

//alloco memoria per il nuovo elemento della lista
newElement = (struct node*)malloc(sizeof(struct node));

//carico i risultati presi in input da tastiera
newElement->data = num;

//linko il nuovo elemento in modo da fare un inserimento in testa
head->prev = newElement;
newElement->next = head;
head = newElement;
newElement->prev = NULL;

return newElement;
};

int main(){
struct node *elemento;

elemento = add(elemento);
return 0;
}


Il programma, se lanciato, crasha all'invocazione della funzione add e, a quanto dice il debugger, il problema sta nella linea


head->prev = newElement;


e mi dice che un errore di segmentation fault. Tra l'altro, il debugger mi segnala anche la linea


elemento = add(elemento);


ma suppongo lo faccia solamente perch fa riferimento a una funzione che causa segmentation fault.

La domanda : dove diamine sto sbagliando nel "linkaggio"? Grazie in anticipo :)

EDIT: Ho modificato il codice, nella fretta ho ricopiato male

oregon
27-03-2015, 16:26
All'inizio il puntatore

struct node *elemento;

indefinito ... Quindi, quando passato a head, se esegue

head->prev

head un puntatore non valido.

alemutasa
27-03-2015, 16:39
Grazie per la risposta!
Mmmh, indefinito significa che non associato a nessun indirizzo di memoria? Perch se questo ho allocato memoria per il puntatore nella funzione add, e quindi un indirizzo di memoria dovrebbe averlo... O sbaglio? Cosa intendi tu per indefinito?

oregon
27-03-2015, 16:40
Attenzione ai puntatori ...

Il puntatore elemento non ha valore nel main.

Nella funzione corrisponde a head.

La memoria che hai allocato assegnata a newelement.

alemutasa
27-03-2015, 16:45
Ah, diamine, non me ne ero accorto... Il problema sta dunque nell'uso della funzione o la funzione stessa che ha una cattiva progettazione?

oregon
27-03-2015, 16:59
All'inizio il puntatore deve essere NULL per indicare che non esiste la lista.

E la funzione ne deve tenere conto ... devi prevedere che stai assegnando il primo elemento della lista un successivo elemento.

Vedi

http://en.wikipedia.org/wiki/Doubly_linked_list

dove dice

"...to insert a node at the beginning of a possibly empty list:"

alemutasa
28-03-2015, 13:34
Ok, tutto chiaro. Grazie mille!

Loading