Search code examples
clistdynamicdynamic-allocation

Accessing fields of a struct for a double linked list


I want to make a double linked list and I have a problem with accessing fields in the struct. This is my code:

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

typedef struct node{
    int val;
    struct node * next;
    struct node * prev;
}node;

void insert(int val, node **head)
{
    node * temp= *head;
    node * temp2=(node *)malloc(sizeof(node));
    node * temp3=(node *)malloc(sizeof(node));
    temp2->val=val;
    temp2->prev=NULL;
    temp2->next=*head;
    *head=temp2;
    temp2->next->prev=temp2;
}

void print(node* head)
{
    node* temp=head;
    while(temp!=NULL)
    {
        printf("%d ", temp->val);
        temp=temp->next;
    }
}

int main()
{   node * head=NULL;
    insert(1, &head);
    insert(2, &head);
    print(head);
    return 0;
}

I get a crash at temp2->next->prev, and I don't understand why. Am I not allowed to access the prev field of the temp2->next node? I tried writing (temp2->next)->prev but also doesn't work. Is there any way that I cant make that work?


Solution

  • When you insert the first node, *head, and therefore temp->next, is NULL. Check that case:

    void insert(int val, node **head)
    {
        node *temp= malloc(sizeof(*temp));
    
        temp->val = val;
        temp->prev = NULL;
        temp->next = *head;
        *head = temp;
    
        if (temp->next) temp->next->prev = temp;
    }
    

    (I've removed the unused variables and lost the cast on malloc.)

    A doubly linked list should probably have a tail, too. In that case, update the tail when you append an item at the head of an empty list.