Я смотрел другие темы здесь, по этой теме, но не смог использовать их для решения моей проблемы.Удаление узла из дважды связанного списка
это основное определение класса узла в связанном списке:
class node {
public:
// default constructor
node() {name = ""; prev = NULL; next = NULL;};
// default overloaded
node(string s) {name = s; prev = NULL; next = NULL;};
// item in the list
string name;
// links to prev and next node in the list
node * next, * prev;
};
выше, является определение класса узла, который используется в другом классе, который генерирует связанный список , нам был добавлен код связанного списка, который мы должны были изменить, поэтому я знаю, что он работает. Я прошел проверку и проверял добавление новых узлов в дважды связанном списке, чтобы работать, и теперь я работаю над удалением узлов из этого же дважды связанного списка.
Функция для удаления узла: http://pastebin.com/HAbNRM5W
^это код, мне нужна помощь, есть слишком много, чтобы перепечатать
сказал мне мой инструктор, что код, который проблема заключается в линии 56, которая гласит:
tmp->prev = prev;
Я пытаюсь установить ссылку на предыдущий узел, чтобы быть правильным. случай, с которым я пытаюсь работать с аналогичными циклами if/else
, - это то, является ли текущий узел последним элементом в списке. если это последний элемент (aka curr->next = NULL
), то не устанавливайте связь с помощью curr->next
и прекратите итерацию цикла.
любая помощь/идеи/рекомендации/обратная связь будут очень благодарны!
void linkedList::remove(string s)
{
bool found = false;
node * curr = getTop(), * prev = NULL;
node * tmp = new node();
while(curr != NULL)
{
// match found, delete
if(curr->name == s)
{
found = true;
// found at top
if(prev == NULL)
{
node * temp = getTop();
setTop(curr->next);
getTop()->prev = NULL;
delete(temp);
} // end if
else
{
// determine if last item in the list
if (curr->next = NULL)
{
// prev node points to next node
prev->next = curr->next;
// delete the current node
delete(curr);
} // end if
// if not last item in list, proceed as normal
else
{
// prev node points to next node
prev->next = curr->next;
// set the next node to its own name
tmp = prev->next;
// set prev-link of next node to the previous node (aka node before deleted)
tmp->prev = prev;
// delete the current node
delete(curr);
} // end else
} // end else
} // end if
// not found, advance pointers
if(!found)
{
prev = curr;
curr = curr->next;
} // end if
// found, exit loop
else curr = NULL;
} // end while
if(found)
cout << "Deleted " << s << endl;
else
cout << s << " Not Found "<< endl;
} // end remove
В чем проблема, о которой вы спрашиваете? –
zac, мне нужен этот метод, чтобы удалить узел двусвязного списка в C++. Мой инструктор сказал, что «tmp-> prev = prev;» является NULL и что если я исправил эту строку, код/программа должна работать. Я не могу понять, что такое null/почему оно равно null, чтобы я мог его исправить. Благодарю. – user2766542
В том месте, где вы делаете удаление, может быть неплохо сделать распечатку имени для каждого из prev, curr и curr-> next (if! Null). Может быть удобен для сортировки смешивания указателя. – RichardPlunkett