#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:
В своей функции добавления() вы используете элемент «хвост» до того, как присвоили ему значение.