удаление элемента в конкретном связанном списке

Моя программа должна сделать 3 операции:

  1. Вставить
  2. удалять
  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");
}

Функция удаления работает следующим образом: пользователь вводит номер, программа ищет этот номер & когда он находит число, удаляет его из списка.

Теперь проблема в том, что, когда пользователь вводит число, которое не существует в списке, появляется «окно сбоя приложения» (я имею в виду это окно: программа не отвечает), в то время как у меня есть сообщение об ошибке для этого случая («Ваш номер не был найден в списке») !!

Можете ли вы сказать мне, в чем проблема?

0

Решение

Ваша процедура вставки не создает циклический список. Когда список пуст и первый элемент вставлен первым == NULL. В этом случае ваш код покидает список в некруглом состоянии. Так как:

    newitem->next=first;
if(first==NULL)
first=newitem;

На этом этапе first-> next == NULL, что никогда не должно иметь место в циклическом списке. Ваш поисковый код не срабатывает, если найденный элемент не существует в списке. Это потому, что он никогда не возвращается к первому узлу, поскольку список не является циклическим.

0

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

Я думаю, что в вашем цикле пока вы достигаете конца списка и
после строки ниже temp1 получает значение NULL.

TEMP1 = temp1-> следующая;

Затем вы пытаетесь прочитать информационный атрибут из нулевого указателя, и это вызывает ошибку.

if (num! = temp1-> info)

Я знаю, что вы сказали, что это круговой список, но я не уверен, что он реализован правильно или нет. Мое предложение просто попробуйте напечатать temp1-> Информация после цикла while, чтобы убедиться в правильности списка и вашей реализации.

0

Бывает, что если вы вставите номер, которого нет в списке, у вас будет цикл в первый раз.

Так:

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.

Скорее всего, проблема в методе вставки, где, возможно, вы не назначаете правильно указатели.

А потом, почему система («пауза»); ? Взглянуть Вот.

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