#c #linked-list
#c #связанный список
Вопрос:
Я пытаюсь реализовать простой список ссылок. Начальное значение вставлено успешно, но следующие элементы введены неправильно. Пожалуйста, помогите мне решить, в чем заключается ошибка. Большое спасибо.
#include<iostream>
using std::cout;
class node
{
public:
node():next(0){}
void setNext(node *next){ next = next; }
node* getNext(){ return next; }
void setValue(int val){ value = val; }
int getValue(){ return value; }
private:
int value;
node *next;
};
class list
{
public:
list():head(new node()),len(0){}
bool insert(int value);
//bool remove(int value);
int valueAt(int index);
int length();
private:
node *head;
int len;
};
bool list::insert(int value)
{
node *current = 0;
node *previous = 0;
node *temp = 0;
temp = new node();
temp->setValue(value);
current = head;
previous = head;
while((temp->getValue())>(current->getValue()))
{
previous = current;
current = current->getNext();
if(!current)
{
break;
}
}
if(current == head)
{
temp->setNext(current);
head = temp;
len ;
}
else
{
temp->setNext(current);
previous->setNext(temp);
len ;
}
}
int list::valueAt(int index)
{
if((index < len) amp;amp; (index >= 0))
{
node *current = 0;
current = head;
int count = 0;
while(count < index)
{
current = current->getNext();
count ;
}
return (current->getValue());
}
else
{
return -1;
}
}
int main()
{
list myList;
myList.insert(5);
myList.insert(20);
myList.insert(10);
cout<<"Value at index 1 : "<<myList.valueAt(1);
return 0;
}
Ответ №1:
После беглого взгляда, возможно, проблема заключается в
void setNext(node *next){ next = next; }
Вы присваиваете переменную самой себе, потому что локальные переменные затмевают переменные экземпляра. Попробуйте изменить это на
void setNext(node *next){ this->next = next; }
В других примечаниях:
-
В
list::list
вам, вероятно, не следует инициализироватьсяhead
с помощьюnew node
. Это будет означать, что ваш связанный список будет иметь один произвольный узел при создании, но иметь длину 0. Вместо этого вам следует подумать о том, чтобы установитьhead
значениеNULL
. -
При создании у
node
них есть случайноеvalue
значение. Подумайте о том, чтобы потребовать для этого параметр в конструкторе или соответствующее значение по умолчанию. -
-1
является плохим «недопустимым значением» дляlist::valueAt
, потому что это также допустимое значение для хранения узлом. -
Вероятно, вам следует переименовать
list
класс вslist
, чтобы указать, что он хранит значения в отсортированном порядке.