Я работаю над собственным классом связанных списков. Все работает нормально. Также выполняется удаление 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;
}
В методе 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--;
}
}
Кстати: может быть, у вас есть еще несколько ошибок, связанных с этим в вашем коде, которые не вызывают ошибок.
first
противnullptr
, но никогда не гарантировать что - то ему присваивается заранее! Конструктор по умолчанию не устанавливает элемент вnullptr
...