односвязный список — бесконечный цикл при отображении LinkedList в переполнении стека

В следующем коде, когда я пытаюсь отобразить список после удаления первого элемента, это приводит к бесконечному циклу следующих элементов. Эта проблема не возникает, когда удаляется не первый элемент. Понятия не имею, почему это происходит? Может кто-нибудь сказать, пожалуйста, где ошибка?

#include<iostream>

using namespace std;

class node
{
public:
int data;
node *link;

};

class linkedlist
{  node *head;
public:
linkedlist()
{
head=NULL;
}
int add(int data1)
{ node *insertnode=new node;
insertnode->data=data1;
insertnode->link=NULL;

node *temp=head;

if(temp!=NULL)
{
while(temp->link!=NULL)
{
temp=temp->link;
}
temp->link=insertnode;

}
else{head=insertnode;}

}
void disp()
{ node *temp1=head;
cout<<endl;
if(temp1==NULL)
{cout<<"Empty"<<endl;
}
if(temp1->link==NULL)
{
cout<<temp1->data<<endl;

}
else{
do{cout<<temp1->data<<endl;
temp1=temp1->link;
}
while(temp1!=NULL);
}

}

int remove(int removedata)
{
node *temp2=head;
if(temp2==NULL)
{}

if(temp2->link==NULL)
{
delete temp2;
head=NULL;
}

else
{
node *previous;
do
{
if(temp2->data==removedata) break;
previous=temp2;
temp2=temp2->link;
}while(temp2!=NULL);

previous->link=temp2->link;
delete temp2;
}}};

int main()
{
linkedlist list;
list.add(10);
list.add(100);
list.add(200);
list.remove(10);
list.disp();
}

Спасибо вам всем. Проблема была решена

0

Решение

Посмотрите на ваше удаление:

    node *previous;
do
{
if(temp2->data==removedata) break;
previous=temp2;
temp2=temp2->link;
}while(temp2!=NULL);

previous->link=temp2->link;
delete temp2;

Если первый элемент совпадает, цикл будет немедленно завершен, что приведет к uninitializing previous, и не меняется temp2 (это все еще голова).

Что вы теперь будете делать:

  1. задавать previous->link к некоторой ценности. Обратите внимание, что это неопределенное поведение, так как вы понятия не имеете, что previous является.
  2. удалять temp2 — который является элементом головы, но никогда не меняет голову. Это приведет к тому, что первый элемент в списке не определен, и при доступе к нему может произойти все что угодно (опять же, неопределенное поведение).

Таким образом, в основном — после удаления первого элемента — когда вы пытаетесь отобразить список, может произойти все что угодно — включая бесконечный цикл, с которым вы столкнулись.

4

Другие решения

Вы не настраивали указатель на голову. Думаю, именно поэтому это не удается.

1

Когда вы удаляете первый элемент, вы должны указать начало списка на следующий элемент. Вы не делали этого здесь.

0

В disp(), вы получаете доступ temp1->link, будь то temp1 NULL или нет

if(temp1==NULL)
{cout<<"Empty"<<endl;
}
if(temp1->link==NULL)
{
cout<<temp1->data<<endl;

}

То же самое для temp2 в remove(),

node *previous; используется неинициализированным, когда первый узел удаляется.

0
По вопросам рекламы [email protected]