(C ++) Процесс вернул -1073741819 (0xC0000005) при работе со связанным списком, но алгоритм работает - PullRequest
0 голосов
/ 08 мая 2020

Цель этой программы - удалить из списка все элементы, которые больше следующего элемента. Мне удалось заставить эту программу выполнить эту задачу, однако она вылетает сразу после этого и не распечатывает список впоследствии, выводя код ошибки 0xC0000005.

#include <iostream>
using namespace std;
class List{
    struct node{
        int data;
        node* next;
    };
    typedef struct node* nodePtr;
    nodePtr head;
    nodePtr curr;
    nodePtr temp;

public:
    List()
    {
        head=NULL;
        curr=NULL;
        temp=NULL;
    }
    void AddNode(int addData)
    {
        nodePtr n = new node;
        n->next = NULL;
        n->data = addData;
        if(head != NULL) {
            curr = head;
            while(curr->next != NULL) {
                curr = curr->next;
            }
            curr->next = n;
        }
        else
        {
            head = n;
        }
    };
    void DeleteNode(int delData)
    {
        nodePtr delPtr = NULL;
        temp = head;
        curr = head;
        while(curr != NULL && curr->data != delData) {
            temp = curr;
            curr = curr->next;
        }
        if(curr == NULL) {
            cout << delData << " is not in the list" << endl;
            delete delPtr;
        }
        else {
            delPtr = curr;
            curr = curr->next;
            temp->next = curr;
            if(delPtr == head) {
                head = head->next;
                temp = NULL;
            }
            delete delPtr;
            cout << delData << " was removed from the list" << endl;
        }
    };
    void PrintList()
    {   cout << "List: " << endl;
        curr = head;
        while (curr != NULL) {
            cout << curr->data << endl;
            curr = curr->next;
        }
    }
    void toss()
    {
        curr = head;
        while (curr != NULL) {

            if(curr->data>curr->next->data){
                    DeleteNode(curr->data);
                    curr = head;
            }
            else curr = curr->next;
            if(curr == NULL) break;
        }

    }
};
int main() {
    List list;
    int i;
    cout << "Input list values, stop input by inputting 0: " << endl;
    cin >> i;
    while(i != 0){
        list.AddNode(i);
        cin >> i; // 18 9 3 4 0 
}
    list.PrintList(); // 18 9 3 4
    list.toss(); // tosses 18 and 9
    list.PrintList(); // should output 3 4 
};

Это тестовый пример из комментариев внизу кода, он показывает, что правильные элементы удалены, но не распечатывает список во второй раз.

Input list values, stop input by inputting 0:
18
9
3
4
0
List:
18
9
3
4
18 was removed from the list
9 was removed from the list

Process returned -1073741819 (0xC0000005)   execution time : 6.699 s
Press any key to continue.

Любой вклад или помощь по этой проблеме были бы очень признательны, спасибо!

1 Ответ

1 голос
/ 09 мая 2020

Когда он достигает последнего узла в списке, он же curr->next равен нулю, вы пытаетесь получить доступ к curr->next->data, но следующий равен нулю. Измените оператор if на это:

    while (curr != NULL) {

        if(curr->next != NULL && curr->data > curr->next->data){
                DeleteNode(curr->data);
                curr = head;
        }
        else curr = curr->next;
        if(curr == NULL) break;
    }

или что-то подобное. Вы также можете проверить это в условии while l oop.

Таким образом, вы должны убедиться, что curr->next не равно NULL, прежде чем вы получите доступ curr->next->data

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...