Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2014
    residenza
    Sardegna
    Messaggi
    18

    [C] Lista doppiamente concatenata: problema con l'aggiunta di nuovo nodo

    Salve a tutti.

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

    codice:
    //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
    codice:
    head->prev = newElement;
    e mi dice che è un errore di segmentation fault. Tra l'altro, il debugger mi segnala anche la linea
    codice:
    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
    Ultima modifica di alemutasa; 27-03-2015 a 17:42

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    All'inizio il puntatore

    struct node *elemento;

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

    head->prev

    head è un puntatore non valido.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2014
    residenza
    Sardegna
    Messaggi
    18
    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?

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Attenzione ai puntatori ...

    Il puntatore elemento non ha valore nel main.

    Nella funzione corrisponde a head.

    La memoria che hai allocato è assegnata a newelement.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it
    Registrato dal
    Jun 2014
    residenza
    Sardegna
    Messaggi
    18
    Ah, diamine, non me ne ero accorto... Il problema sta dunque nell'uso della funzione o è la funzione stessa che ha una cattiva progettazione?

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    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:"
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Utente di HTML.it
    Registrato dal
    Jun 2014
    residenza
    Sardegna
    Messaggi
    18
    Ok, tutto chiaro. Grazie mille!

Tag per questa discussione

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.