2013-11-28 48 views
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; 
} 
+0

首先,不要使用单个字符变量名称,因为它们在混淆代码方面非常有效,因此很难理解并容易忽略错误。 –

+2

请创建一个构造函数,将您的成员初始化为某些东西......您正在''第一''对抗'nullptr',但不能保证事先分配给它!默认的构造函数不会将元素设置为'nullptr' ... – Johan

+0

如果Johan的初始化成员对您不起作用,我建议您使用谷歌的“调试器+ ”并尝试手动执行您的程序流程。它将帮助您发现一般错误。 – DarthB

回答

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--; 
    } 
} 

由方式:可能是,你的代码中有更多与此相关的错误,不会导致错误。