从链接列表中删除第一个元素

Remove first element from the linked list

本文关键字:第一个 元素 删除 链接 列表      更新时间:2023-10-16

我正在处理自己的链表类。一切都很好。remove操作也可以,但如果我试图删除第一个元素,那么应用程序就会停止响应。

我不知道,我做错了什么。

源代码:

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

顺便说一句:你的代码中可能还有一些与此相关的错误,这些错误不会导致错误。