#c #linked-list
#c #связанный список
Вопрос:
Необходимо вставить новый узел, содержащий заданное значение данных, таким образом, чтобы новый узел занимал указанное смещение. Все узлы, которые уже были в списке с этим смещением и за его пределами, сдвигаются вниз на единицу.Это должно иметь тот же эффект, что и добавление, и никакого эффекта, если оно находится за пределами конца списка.
void LinkedList::InsertData(int offset, int data){
shared_ptr<node> curr(top_ptr_);
shared_ptr<node> temp(new node);
temp->data = data;
temp->next = shared_ptr<node>(NULL);
if(offset == 0) {
temp->next = top_ptr_;
top_ptr_ = temp;
}
offset--;
while(offset-- amp;amp; curr->next!=NULL) {
curr = curr->next;
}
temp->next = curr->next;
curr->next = temp;
}
Комментарии:
1. вы пробовали это:
while(--offset amp;amp; curr->next!=NULL)
и удалитьoffset--
перед циклом.2.
curr->next!=NULL
почти всегда плохая идея в связанном списке, потому что это требует дополнительного тестирования, чтобы убедиться, чтоcurr
это действительно, прежде чем вы сможете протестироватьcurr->next
. Вы должны переработать логику так, чтобы она проверялаcurr != NULL
вместо этого.
Ответ №1:
Вы близки. Поскольку вы обрабатываете offset==0
специально, вам нужно переместить свой while
цикл внутри else
блока, например:
void LinkedList::InsertData(int offset, int data) {
if (offset < 0)
return; // or throw...
shared_ptr<node> temp(new node);
temp->data = data;
if (offset == 0) {
temp->next = top_ptr_;
top_ptr_ = temp;
}
else {
shared_ptr<node> curr = top_ptr_;
while ((--offset > 0) amp;amp; curr->next) {
curr = curr->next;
}
temp->next = curr->next;
curr->next = temp;
}
}
Однако InsertData()
можно упростить, полностью исключив if (offset == 0)
блок, например:
void LinkedList::InsertData(int offset, int data) {
if (offset < 0)
return; // or throw...
shared_ptr<node> temp(new node);
temp->data = data;
shared_ptr<node> *curr = amp;top_ptr_;
while ((offset-- > 0) amp;amp; *curr)
curr = amp;((*curr)->next);
temp->next = *curr;
*curr = temp;
}