简体   繁体   中英

Segmentation Fault error when deleting an item of a Linked List

I'm trying to implement a Linked List following this example .

Here is a resume what's going on:

class Node {
    public:
        string name; 
        int number;
        Node *next;
        Node () {
            next = NULL;
        }
        Node (string _name, int _number) {
            name = _name;
            number = _number;
            next = NULL;
        }
};

class List {
    public:
        Node *head; 
        List () {
            head = NULL;
        }

        void push_back (string _name, int _number) {
            Node *neww = neww Node;
            neww->name = _name;
            neww->number = _number;
            if (head == NULL)
                head = neww;
            else {
                Node *whre = head;
                while (whre->next)
                    whre = whre->next;
                whre->next = neww;
            }
        }
        bool find (int _number) {
            Node *pointer = new Node;
            if (!head)
                return false;
            pointer = head;
            for (; pointer; pointer = pointer->next)
                if (pointer->number == _number)
                    return true;
            return false;
        }
        bool delete_item (int _number) {
            Node *pointer = new Node;
            if (!find(_number))
                return false;
            while (head->number == _number) //problem is here
                head = head->next;
            if (!head)
                return false;
            pointer = head;
            while (pointer) {
                if (pointer->next)
                    if (pointer->next->number == _number)
                        pointer->next = pointer->next->next;
                pointer = pointer->next;
            }
            return true;
        }
};

At main(), I created a List object, pushed a element and deleted it. Worked fine.

But when I use a switch-case menu to make things more dinamically, I got this error:

program received signal SIGSEGV, segmentation fault

I've no idea what this error means and didn't find help at google. I'm using the delete_item() in the same situation, except by the swtich-case menu.

Any hints what I can do? Or just an explanation of this error.

Here is the case where I try to delete:

int number, choice;
do {
    cin >> choice;
    switch(choice){

        [...]

        case 5:{
            cout << "Number: ";
            cin >> number;
            if(!list_obj.delete_item(number))
                cout << "Not found." << endl;
            else
                cout << "Deleted." << endl;
            system("PAUSE");
            system("cls");
            break;
        }

        [...]

Any hints to improve the question will be Welcome.

Full code

if(head->number == _number)

Should never be checked this way. You should dereference it when head is not null.

ie:

if(head && head->number == _number)

Also avoid use of keywords as function/var name

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM