В следующем коде, когда я пытаюсь отобразить список после удаления первого элемента, это приводит к бесконечному циклу следующих элементов. Эта проблема не возникает, когда удаляется не первый элемент. Понятия не имею, почему это происходит? Может кто-нибудь сказать, пожалуйста, где ошибка?
#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();
}
Спасибо вам всем. Проблема была решена
Посмотрите на ваше удаление:
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
(это все еще голова).
Что вы теперь будете делать:
previous->link
к некоторой ценности. Обратите внимание, что это неопределенное поведение, так как вы понятия не имеете, что previous
является.temp2
— который является элементом головы, но никогда не меняет голову. Это приведет к тому, что первый элемент в списке не определен, и при доступе к нему может произойти все что угодно (опять же, неопределенное поведение).Таким образом, в основном — после удаления первого элемента — когда вы пытаетесь отобразить список, может произойти все что угодно — включая бесконечный цикл, с которым вы столкнулись.
Вы не настраивали указатель на голову. Думаю, именно поэтому это не удается.
Когда вы удаляете первый элемент, вы должны указать начало списка на следующий элемент. Вы не делали этого здесь.
В disp()
, вы получаете доступ temp1->link
, будь то temp1
NULL или нет
if(temp1==NULL)
{cout<<"Empty"<<endl;
}
if(temp1->link==NULL)
{
cout<<temp1->data<<endl;
}
То же самое для temp2
в remove()
,
node *previous;
используется неинициализированным, когда первый узел удаляется.