Как устранить ошибку сегментации в односвязном списке?

#c #pointers #segmentation-fault #nodes #singly-linked-list

Вопрос:

Редактировать: Просто попытался сделать while (temp != NULL amp;amp; newNode->info > temp->info){ , и по какой-то причине это все еще не работает, я попытался ввести 5 и 4 и снова получил ошибку сегментации

Извините за плохой код, я вроде как новичок в этом, я пытаюсь составить отсортированный односвязный список. Я не уверен, что с этим не так, и был бы очень признателен, если бы кто-нибудь мог помочь мне с этой проблемой?

Возможно, мне удалось ввести пару значений, каждый раз по какой-то причине разное количество значений (не потому, что я ввел -1). А потом он просто говорит: «Произошло исключение. Ошибка сегментации». в этой конкретной строке, и я не уверен, почему, так как я был осторожен при сравнении значений вместо адреса памяти:

while (newNode->info > temp->info){

Полный код:

 #include <iostream>
using namespace std;

class node {
public:
    int info;
    node *next;

    node (int data, node *ptr = 0) {
        info = data;
        next = ptr;
    }
};

class osll{

    public:
    node *head, *tail;

    osll(){
        head = tail = 0;
    }

    bool isEmpty(){
        return head == 0;
    }

    void sort(int input){

        node *newNode = new node (input);

        if (isEmpty()){
            newNode ->next = head;
            head = newNode;
            if (tail == 0)
                tail = head;
        }
        if (newNode ->info > head ->info){

            node *temp = head;
            while (newNode->info > temp->info){
                temp = temp ->next;
            }
            
            // will figure out how to link newNode to 
            // whatever temp value that stops here
            // once this error goes away
        }
    }

    
};



int main () {
    osll l;
    int input = 0;

    while (input != -1) {
        cout << "Enter a value: ";
        cin >> input;
        l.sort(input);
    }

    return 0;

}
 

Комментарии:

1. Что произойдет в вашем цикле while, если temp он станет нулевым указателем?

2. Какие значения вы вводите? Я только что ввел большое количество случайных чисел и никогда не вызывал ошибки seg.

3. Вы пробовали сначала поискать в Интернете? Я думаю, что видел такое же название вопроса на прошлой неделе.

4. Проверьте temp != NULL также в цикле while

5. Похоже, что если я продолжу добавлять значения по мере уменьшения, это все равно будет работать, но только до тех пор, пока увеличение, похоже, не сработает, поэтому 5 4 3 2 1 работает, но 5 4 3 88 вернуло сообщение об ошибке сегментации

Ответ №1:

Если ваш новый номер самый большой в списке, это вызывает ошибку сегментации, потому что вы не проверяете, достигли ли вы конца списка в цикле while. После того, как последний элемент temp будет равен нулю, так что . temp->info приведет к ошибке сегментации.

Так что вам следует сделать, например (строка 40)

 while (temp != null amp;amp; newNode->info > temp->info)
 

Комментарии:

1. Просто попробовал это с вводом 3 и 5, и это все еще не работает, я не уверен, почему

2. Я исправил только ошибку seg. Я не закончил код, так что это не относится к ссылке, но вы больше не получаете ошибки seg. Если вы это сделаете, пожалуйста, убедитесь, что вы сохранили и повторно выполнили код (легко забыть) перед запуском.

3. @minhanhb никогда не думайте, что у вас есть только одна ошибка. код также, по-видимому, отбрасывает узлы, если newNode ->info > head ->info это не так.

4. Он все время отбрасывает. Это ни с чем не связано. Но в случае 3 5 newNode ->info > head ->info верно