Моя программа должна сделать 3 операции:
Моя проблема в функции удаления. вот код:
void c_list::del()
{
int num;
if(isempty())
cout<<"List is Empty!"<<endl;
else
{
node *temp1=first;
node *temp2=NULL;
cout<<"Enter the number that u want to DELETE:"<<endl;
cin>>num;
while(temp1->next!=first && temp1->info != num)
{
temp2=temp1;
temp1=temp1->next;
}
if(num != temp1->info )
cout<<"your number was not found in the list"<<endl;
else
{
if(temp2!=NULL)
{
temp2->next=temp1->next;
cout<<temp1->info<<" was deleted"<<endl;
}
else
{
first=temp1->next;
cout<<temp1->info<<"was deleted"<<endl;
}
}
}
system("pause");
}
Функция удаления работает следующим образом: пользователь вводит номер, программа ищет этот номер & когда он находит число, удаляет его из списка.
Теперь проблема в том, что, когда пользователь вводит число, которое не существует в списке, появляется «окно сбоя приложения» (я имею в виду это окно: программа не отвечает), в то время как у меня есть сообщение об ошибке для этого случая («Ваш номер не был найден в списке») !!
Можете ли вы сказать мне, в чем проблема?
Ваша процедура вставки не создает циклический список. Когда список пуст и первый элемент вставлен первым == NULL. В этом случае ваш код покидает список в некруглом состоянии. Так как:
newitem->next=first;
if(first==NULL)
first=newitem;
На этом этапе first-> next == NULL, что никогда не должно иметь место в циклическом списке. Ваш поисковый код не срабатывает, если найденный элемент не существует в списке. Это потому, что он никогда не возвращается к первому узлу, поскольку список не является циклическим.
Я думаю, что в вашем цикле пока вы достигаете конца списка и
после строки ниже temp1 получает значение NULL.
TEMP1 = temp1-> следующая;
Затем вы пытаетесь прочитать информационный атрибут из нулевого указателя, и это вызывает ошибку.
if (num! = temp1-> info)
Я знаю, что вы сказали, что это круговой список, но я не уверен, что он реализован правильно или нет. Мое предложение просто попробуйте напечатать temp1-> Информация после цикла while, чтобы убедиться в правильности списка и вашей реализации.
Бывает, что если вы вставите номер, которого нет в списке, у вас будет цикл в первый раз.
Так:
node* temp1 = first;
node* temp2 = 0;
while(temp1->next!=first && !temp2) {
if(temp1->info == num) {
/* save pointer and exit from while */
temp2 = temp1;
} else {
temp1 = temp1->next;
}
}
Тогда ваш код создает мусор, потому что вы никогда не вызываете delete.
Скорее всего, проблема в методе вставки, где, возможно, вы не назначаете правильно указатели.
А потом, почему система («пауза»); ? Взглянуть Вот.