поэтому я просто пытался реализовать простой связанный список на C , но, похоже, я не преодолел ошибку сегментации

#c

Вопрос:

Я исправил некоторые проблемы, но все еще не могу преодолеть ошибку сегментации в цикле добавления функции while, где обновляется следующая временная.я видел ошибку сегментации в отладчике, когда я вошел в конкретную строку. также примечание во время публикации здесь это дает много ошибок, которые я могу исправить любым способом

  #include <iostream>
using namespace std;

class node{
public:
    int data;
    node* next;
    node()
    {
        data=0;
        next=nullptr;
    }
    node(int value)
    {
        data=value;

    }

    void setnext(node* obj)
    {
        next=obj;
    }
};
class linkedlist{
public:
    node* head;
    node* tail;
    linkedlist()
    {
        head=nullptr;
        tail=nullptr;
    }
    void prepend(int data)
    {
        node* temp=new node(data);
        temp->setnext(head); //updates the new next pointer
        head=temp; //updates the head with new address
    }

    void append(int data)
    {
        node* temp=new node(data);
        if(head==nullptr)
        {
            cout<<"the linked list is empty";
            head=temp;
            tail=temp;
            temp=nullptr;
        }
        else {

            while (temp!= nullptr)
            {
                temp = temp->next; //segmentation fault here
            }
            tail->setnext(temp);
            tail = temp; //updates the tail with new address
            }
        }
    void display()
    {
        node* temp=head;

        while(temp!=nullptr)
        {
            cout<<temp->data<<"->";
            temp=temp->next;
        }
        cout<<"NULL";
    }
};
int main()
{
    linkedlist obj;
    obj.prepend(1);
    obj.append(2);
    obj.append(3);
    obj.display();
}
 

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

1. void* setnext(node* obj) ничего не возвращает, это неопределенное поведение. Вы должны включить предупреждения компилятора и исправить их

2. Вам не следует это комментировать: //next=nullptr;

3. node(int value) конструктор не инициализируется next , поэтому его последующее чтение также является неопределенным поведением

4. на самом деле в вашем коде много неинициализированных указателей. Всегда инициализируйте элементы в конструкторе. Когда указатель не инициализирован, проверка на NULL не помогает (кстати, скорее используйте nullptr )

5. В этом коде очень много проблем. Неинициализированные члены, отсутствие необходимой функциональности (например, вы никогда не устанавливаете заголовок, если его нет) или странные инициализированные члены, например data='' , с data типом int (так почему бы не использовать data=0 ?).

Ответ №1:

После создания нового linkedlist конструктор по умолчанию linkedlist должен был инициализироваться node* head и node* tail до nullptr .

Таким образом, вызов obj.prepend(1); после linkedlist obj; не добавляется 1 в obj . В результате node* head и node* tail остаются и nullptr то, и другое .

После этого, если вы позвоните obj.append(2); , это tail->setnext(temp); приведет к ошибке сегментации как tail есть nullptr .

Вы должны были проверить , пуст ли список ссылок в linkedlist::prepend и linkedlist::append , если да, node* head и node* tail необходимо ли его правильно инициализировать.

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

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

2. 1. в предварительном предложении void(данные int) вы забыли установить node* tail, если он равен nullptr. 2. в приложении void(данные int) какова цель цикла while (temp!= nullptr)?

3. 1.я не устанавливал его в этом случае, так как я просто установил головку на новый узел. 2.цель этого цикла while-пройти через узлы, пока он не достигнет хвоста. я внес еще одно изменение: while(temp->далее!=nullptr)

Ответ №2:

В своей функции добавления() вы используете элемент «хвост» до того, как присвоили ему значение.