Удалить первый элемент из связанного списка

0

Я работаю над собственным классом связанных списков. Все работает нормально. Также выполняется удаление fonction, но если я попытаюсь удалить первый элемент, приложение перестанет отвечать на запросы.

Я понятия не имею, что я не так.

Исходный код:

#include <iostream>

using namespace std;

template<class T>
class linkedList {

private:
    struct elem {
        elem* p;  // pointer
        T v;      // value

        elem* next() {
            return p;
        }
    };

    int elems = 0;
    elem* first;

    elem* last() {
        if(first == 0) return 0;

        elem* e = first;
        while(e->p != 0) {
            e = e->p;
        }

        return e;
    }

    elem* getP(int index) {
        int i=0;
        elem* e;

        e->p = first;
        while(i!=index) {
            e = e->p;
            i++;
        }

        return e->p;
    }

public:

    T& get(int index) {
        int i=0;
        elem* e;

        if(elems<index) throw 0x77;

        e->p = first;

        while(i!=index) {
            e = e->p;
            i++;
        }

        return (e->p)->v;
    }

    void add(T el) {
        elem* u = last();
        elem* e = new elem;

        e->p = 0;
        e->v = el;

        if(u == 0) {
            first = e;
        } else {
            u->p = e;
        }

        elems++;
    }

    int size() {
        return elems;
    }

    void remove(int index) {
        if(elems<index) throw 0x77;

        if(index == 0) {
            elem* e = first->p;
            first->p = e->p;
            delete e;
            elems--;
        } else {
            elem* p = getP(index-1);
            elem* e = p->p;
            elem* n = e->p;

            delete e;
            p->p = n;

            elems--;
        }
    }

};

int main()
{
    linkedList<int> myList;

    myList.add(10);
    myList.add(12);
    myList.add(4);
    myList.add(7);

    myList.remove(0);

    cout << myList.get(0) << endl;

    return 0;
}
  • 0
    Прежде всего, не используйте имена переменных из одного символа, потому что они очень эффективны в запутывании вашего кода, затрудняя понимание и упускание ошибок.
  • 2
    Пожалуйста, создать конструктор , который инициализирует члены ваши к чему - то ... Вы chekcing first против nullptr , но никогда не гарантировать что - то ему присваивается заранее! Конструктор по умолчанию не устанавливает элемент в nullptr ...
Показать ещё 1 комментарий
Теги:
pointers
linked-list

1 ответ

0
Лучший ответ

В методе remove(int), когда index равен 0, вы устанавливаете указатель первого элемента вместо установки указателя на первый элемент:

void remove(int index) {
    if(elems<index) throw 0x77;

    if(index == 0) {
        elem* e = first;
        first = first->p; // Set first instead of first->p
        delete e;
        elems--;
    } else {
        elem* p = getP(index-1);
        elem* e = p->p;
        elem* n = e->p;

        delete e;
        p->p = n;

        elems--;
    }
}

Кстати: может быть, у вас есть еще несколько ошибок, связанных с этим в вашем коде, которые не вызывают ошибок.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню