удаление узла в единственно связанном списке - PullRequest
0 голосов
/ 12 марта 2020

моя функция удаления работала нормально, но после того, как я попробовал использовать ее с файлом, он перестал работать, Visual Studio сообщает: «Возникло исключение: нарушение прав чтения. _Pnext 0x5C7E04. Произошло» и выбрасывает меня в исходный файл. где строка говорит "для (auto _Pnext = & _Myproxy -> _ Myfirstiter; * _Pnext; _Pnext = ( _Pnext) -> _ Mynextiter) {(* _Pnext) -> _ Myproxy = nullptr;}" у меня нет изменил функцию, чтобы можно было удалить файл, только удаляя его из оперативной памяти, я просто проверяю, работает ли он до сих пор, но иногда это не так ...

class SLL {
private:
    long ID;
    string name;
    string sex;
    float average;
    SLL* next;
public:
    SLL(int ID = 0, string name = "no name", string sex = "NA", float average = 0.0, SLL* next = NULL) {
        this->ID = ID; this->name = name; this->sex = sex; this->average = average; this->next = next;
    }
    class function {
    public:
        SLL* readfile(SLL* plist);
        SLL* writefile(SLL* plist);
        SLL* delete_user(SLL* plist);
    };
};
SLL* SLL::function::delete_user(SLL* plist) {
    long ID;
    cout << "Enter user ID to delete user:";
    cin >> ID;
    SLL* ptr, * p = plist;
    ptr = p;
    if (p->ID == ID) {
        plist = p->next;
        delete p;
        cout << "User with ID:" << ID << " has been deleted!!";
        wait();
    }
    else {
        while (p != NULL) {
            if (p->ID != ID) {
                ptr = p;
                p = p->next;
            }
            else break;
        }
        if (p == NULL) {
            cout << "ID:" << ID << " cannot be found on the list" << endl; wait();
        }
        else {
            ptr->next = p->next;
            delete p;
            cout << "User with ID:" << ID << " has been deleted!!";
            wait();
        }
    }
    if (plist == NULL)alternative_user = 0;
    return plist;
}
SLL* SLL::function::writefile(SLL* plist) {
    SLL* p = plist;
    ofstream file;
    file.open("data.dat", ios::out);
    int i = 1;
    while (true) {
        if (p != NULL) {
            file.write((char*)p, sizeof(SLL));
            p = p->next;
            i++;
        }
        else break;
    }
    file.close();
    return plist;
}
SLL* SLL::function::readfile(SLL* plist) {
    SLL* p, * ptr;
    p = new SLL;
    ptr = plist = p;
    ifstream file;
    file.open("data.dat", ios::in);
    int i = 1;
    while (1) {
        file.read((char*)p, sizeof(SLL));
        if (!file.eof()) {
            ptr = p;
            if (!file.eof()) {
                p = new SLL;
                ptr->next = p;
                p->next = NULL;
                i++;
            }
        }
        else break;
    };
    ptr->next = NULL;
    file.close();
    return plist;
}
...