#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
также в цикле while5. Похоже, что если я продолжу добавлять значения по мере уменьшения, это все равно будет работать, но только до тех пор, пока увеличение, похоже, не сработает, поэтому 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
верно