Harsh Yadav
Harsh Yadav

Reputation: 13

getting segmentation error (core dumped) in linked list

I have looked at my code several times but couldn't find the problem. please tell me what I need to replace to get my code working.

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

struct node
{
    int data;
    struct node *next;
};

struct node *head;

void insert(int x)
{
    struct node *temp=(struct node *)malloc(sizeof(struct node));

    temp->data = x;

    temp->next = NULL;

    if (head == NULL)
    {
        temp->next = head;
        head = temp;
        return;
    }

    struct node *temp1 = head;

    while(temp1 != NULL)
    {
        temp1 = temp1->next;
    }
    temp1->next = temp;
}

void display()
{ 
struct node *temp = head;

    if (head == NULL)
    {
        printf("list is empty");
        return;
    }
    else{

        while(temp!=NULL)
        {
            printf("%d ", temp->data);
            temp = temp->next;
       }
    }
}

int main()
{
    head = NULL;

    insert(3);
    insert(5);
    insert(6);
    display();
}

Upvotes: 0

Views: 55

Answers (3)

Enno
Enno

Reputation: 1862

Pro tip for linked lists like this, they are a lot easier to modify with double pointers. Example code:

void append(struct node **list, int a) {
  // skip to the end of the list:
  while (*list != NULL) {
    list = &(*list)->next;
  }
  *list = malloc(sizeof(struct node));
  (*list)->data = a;
  (*list)->next = NULL;
}

void display(struct node *list) {
  while (list) {
    printf("%d\n", list->data);
    list = list->next;
  }
}

void remove(struct node **list, int index) {
  while (*list) {
    if (--index == 0) {
      struct node *temp = *list;
      *list = temp->next;
      free(temp);
      break;
    }
  }
}  

int main() {
  struct list *mylist;
  append(&mylist, 3);
  append(&mylist, 4);
  append(&mylist, 5);
  display(mylist); // prints 3 4 5
  remove(&mylist, 1);
  display(mylist); // prints 3 5
  remove(&mylist, 0);
  remove(&mylist, 0);
  // mylist is NULL again, all memory free'd
}

Note that this code needs no special cases for "is the list empty?", which makes it less complex than yours.

Upvotes: 0

foreverska
foreverska

Reputation: 585

    while(temp1!=NULL)
    {
        temp1=temp1->next;
    }
    temp1->next=temp;

The only way out of this loop is for temp1 to be NULL. Then the next line attempts to used temp1 as a pointer. This is likely causing your issue. You need to instead check if the next is NULL and break leaving temp1 as the last in the list not it's next.

Upvotes: 2

Jeremy Friesner
Jeremy Friesner

Reputation: 73041

The problem is in this code:

struct node *temp1=head;
while(temp1!=NULL)
{
    temp1=temp1->next;
}
temp1->next=temp;

... the while loop won't end until temp1 is NULL, so after the loop ends, it is guaranteed that temp1 is a NULL pointer ... and then you dereference that NULL pointer (via temp1->next), which causes a crash. Probably what you want to do instead is while(temp1->next != NULL) {...}

Upvotes: 4

Related Questions