我的数据结构有问题,双链表

时间:2018-10-18 13:17:08

标签: c++

这是节点的声明。

template <typename E> class Link {
private:
    static Link<E>* freelist;
public:
    E element;
    Link* prev;
    Link* next;

    Link(const E& it, Link* prevp, Link* nextp) {
        element = it;
        prev = prevp;
        next = nextp;
    }
    Link(Link* prevp = NULL, Link* nextp = NULL) {
        prev = prevp;
        nextp = nextp;
    }

    void* operator new(size_t) {
        if(freelist == NULL)
            return ::new Link;
        Link<E>* temp = freelist;
        freelist = freelist->next;
        return temp;
    }

    void operator delete(void* ptr) {
        ((Link<E>*) ptr)->next = freelist;
        freelist = (Link<E>*)ptr;
    }
};

    template <typename E>
        Link<E>* Link<E>::freelist = NULL;

ADT类列表继承了类TwoWayList。而且我敢肯定,该问题与ADT无关。

这是TwoWayList类的声明,我只是选择一些我认为可能导致该问题的段。

template <typename E> class TwoWayList :public List<E> {
private:
    Link <E>* head;
    Link <E>* tail;
    Link <E>* curr;
    int cnt;

    void init(){
        curr=tail=head=new Link<E>;
        cnt=0;
    }

    void removeall(){
        while(head!=NULL){
            curr=head;
            head=head->next;
            delete curr;
        }
    }
public:
   void append(const E& it) {
        tail->prev = tail->prev->next = new Link<E>(it, tail->prev, tail);
        cnt++;
    }

这是主要功能

int main(){
    TwoWayList<int> l;
    l.append(1);
    l.append(2);
    l.append(3);
    l.append(4);
    l.append(5);

}

每当我运行这句话tail->prev = tail->prev->next = new Link<E>(it, tail->prev, tail);时,就会弹出一个窗口,说Program received signal SIGSEGV, Segmentation fault

1 个答案:

答案 0 :(得分:1)

您的构造函数应与该类具有相同的名称,而不是与init()相同,后者将正确设置指针,从而不会发生sigfault。

同样,您将需要在解构函数中重新分配所有内容,以防止内存泄漏。