Удалить из однонаправленного списка нули
Не рабоает функция удаления нулей почему? #include
using namespace std;
struct Node
{
int data;
Node* Next;
};
struct List
{
int size;
Node* Head;
};
void Make_List(int n, Node** Head)
{
if (n > 0)
{
(*Head) = new Node;
cout << "Напишите число: ";
cin >> (*Head)->data;
(*Head)->Next = NULL;
Make_List(n - 1, &((*Head)->Next));
}
}
void Show_List(Node* Head)
{
if (Head != NULL)
{
cout << Head->data << "\t";
Show_List(Head->Next);
}
else cout << "\n";
}
void Delete_Item(Node* Head,int z)
{
Node* curr = Head; // Текущий элемент списка
while (curr != nullptr) // Проходим по списку
{
if (curr->data == 0) // Если элемент
{
Node* tmp = curr->Next; // удаляемый элемент
curr->Next = tmp->Next;
delete tmp;
}
curr = curr->Next;
}
}
int main()
{
setlocale(0, ".1251");
Node* Head;
int n;
cout << "Введите размер списка: ";
cin >> n;
Make_List(n, &Head);
Show_List(Head);
Delete_Item(Head, n);
Show_List(Head);
system("pause");
return 0;
}
Ответы (1 шт):
Автор решения: AlexGlebe
→ Ссылка
Аргумент как указатель на ноду - неправильно. Если вы удалите первый то не сможете изменить начало списка и отнять его длину.
void Delete_Item(Node* Head,int z)
{
Node* curr = Head; // Текущий элемент списка
while (curr != nullptr) // Проходим по списку
{
if (curr->data == 0) // Если элемент
{
Node* tmp = curr->Next; // удаляемый элемент
Здесь вы удаляете следующую ноду, а не ту, что надо.
curr->Next = tmp->Next;
delete tmp;
}
curr = curr->Next;
}
}
Исправляем :
void Delete_Zeros ( List & list )
{
Node * prev = nullptr ; // предыдущий
Node* curr = list . Head; // Текущий элемент списка
while (curr != nullptr) // Проходим по списку
{
if (curr->data == 0) // Если элемент
{
-- list . size ;
if ( prev ) {
// у предыдущего меняем следующего
prev -> Next = curr -> Next ;
delete curr ;
curr = prev -> Next ; }
else {
// изменяем заголовок списка
list . Head = curr -> Next ;
delete curr ;
curr = list . Head ; }
}
else {
prev = curr ;
curr = curr->Next; }
}
}
main
List list ;
cout << "Введите размер списка: ";
cin >> list . size;
Make_List(list.size, &list.Head);
Show_List(list.Head);
Delete_Zeros ( list ) ;
//Delete_Item(Head, n);
Show_List(list.Head);