Ninjinx
Ninjinx

Reputation: 645

Segmentation Fault in deleting a node

I have a C++ Code that just manipulates basic linked list - add a new node, delete a node and view the list

//UNIX Environment
#include <iostream>
#include <malloc.h>
#include <stdlib.h>
#include <stdio.h>
#define clear() printf("\033[H\033[J")
using namespace std;

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

struct node* head = NULL;

void add_node(struct node *hea)
{
    char f;
    int val;
    cout<<"Enter value : ";
    cin>>val;
    if(head==NULL)
    {
        head = new(struct node);
        head->val = val;
        head->next = NULL;
    }
    else
    {
        node *traverser = hea;
        node *traverser_prev = NULL;
        while(traverser!=NULL)
        {
            traverser_prev = traverser;
            traverser=traverser->next;
        }
        traverser = new(struct node);
        traverser->val = val;
        traverser->next = NULL;
        traverser_prev->next=traverser;
    }
    cout<<"\nEnter Y to return : ";
    cin>>f;
    while(f!='Y')
    {
        cout<<"Wrong entry.Enter again : ";
        cin>>f;
    }
    return;
}

void view_list(struct node *hea)
{
    char f;
    node *traverser = hea;
    while(traverser!=NULL)
    {
        cout<<traverser->val<<" ";
        traverser=traverser->next;
    }
    cout<<"\nEnter Y to return : ";
    cin>>f;
    while(f!='Y')
    {
        cout<<"Wrong entry.Enter again : ";
        cin>>f;
    }
    return;
}

void delete_node(node *hea)
{
    char f;
    int del_value;
    cout<<"Enter value to be deleted :";
    cin>>del_value;

    node *traverser = hea;
    cout<<"OK1\n";
    node* traverser_prev = NULL;
    cout<<"OK2\n";

    while(traverser!=NULL)
    {
        if(traverser->val==del_value)
        {
            if(traverser==hea)
            {
                hea=traverser->next;
                cout<<"Here cond1\n";
                delete traverser;
            }
            else
            {
                traverser_prev->next = traverser->next;
                cout<<"Here cond2\n";
            }
        }
        else
        {
            traverser_prev = traverser;
            traverser = traverser->next;
            cout<<"Here cond3\n";
        }
    }
    cout<<"\nEnter Y to return : ";
    cin>>f;
    while(f!='Y')
    {
        cout<<"Wrong entry.Enter again : ";
        cin>>f;
    }
    return;
}
int main(int argc, char* argv[])
{
    while(1)
    {
        clear();
        int choice;
        cout<<"POINTER BASICS\n";
        cout<<"1. Add new element\n";
        cout<<"2. View elements\n";
        cout<<"3. Delete element\n";
        cout<<"4. Exit\n";
        cout<<"Enter choice: ";
        cin>>choice;
        switch(choice)
        {
            case 1: add_node(head);
                    break;
            case 2: view_list(head);
                    break;
            case 3: delete_node(head);
                    break;
            default:break;
        }
        if(choice==4)
            break;
    }
}

However, whenever I try to delete node, it throws me a segmentation fault error with core dumped. What is the reason for the error?

Upvotes: 0

Views: 657

Answers (2)

Some programmer dude
Some programmer dude

Reputation: 409176

One problem is that in the delete_node function you pass the list head by value, which means that the pointer is copied and inside the function you only modify the copy.

There are two solutions: Either don't use the argument at all and only use the global variable, or pass the argument by reference:

void delete_node(node*& hea)

Upvotes: 2

matanso
matanso

Reputation: 1292

Is it possible that when you are executing the line

traverser_prev->next = traverser->next;

traverser_prev == NULL?

Upvotes: -1

Related Questions