0
我正在處理我自己的鏈接列表類。一切正常。 刪除功能也適用,但如果我嘗試刪除第一個元素,則應用程序停止響應。從鏈接列表中刪除第一個元素
我不知道,我錯了什麼。
的源代碼:
#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;
}
首先,不要使用單個字符變量名稱,因爲它們在混淆代碼方面非常有效,因此很難理解並容易忽略錯誤。 –
請創建一個構造函數,將您的成員初始化爲某些東西......您正在''第一''對抗'nullptr',但不能保證事先分配給它!默認的構造函數不會將元素設置爲'nullptr' ... – Johan
如果Johan的初始化成員對您不起作用,我建議您使用谷歌的「調試器+」並嘗試手動執行您的程序流程。它將幫助您發現一般錯誤。 –
DarthB