1 Востаннє редагувалося Betterthanyou (10.10.2014 10:38:42)

Тема: Лінійний список, видалення шуканого елементу

Допоможіть із функцією видалення елемента із лінійного списку
Begin - покажчик на початок лінійного списку
num - число що шукається

struct String
{
    int d;
    String *next;
};
//..............................................................................................
void DELETE(String **Begin,int num)
{
    String *tmp = (*Begin);
    String *tmp1;
    while(tmp != NULL)
    {
        if (tmp->next->d == num)
        {
            tmp1 = tmp;
            tmp->next = tmp->next->next;
            delete tmp1->next;
            return;
        }
        tmp = tmp->next;
    }
}

2 Востаннє редагувалося koala (10.10.2014 08:38:31)

Re: Лінійний список, видалення шуканого елементу

  1. А в чому проблема?

  2. Краще повертати true/false (знайшов - не знайшов).

  3. Нащо там if? Робіть цикл while.

  4. Де перевірка, що tmp->next існує?

Подякували: leofun011

3 Востаннє редагувалося Betterthanyou (10.10.2014 10:40:51)

Re: Лінійний список, видалення шуканого елементу

koala написав:
  1. А в чому проблема?

  2. Краще повертати true/false (знайшов - не знайшов).

  3. Нащо там if? Робіть цикл while.

  4. Де перевірка, що tmp->next існує?

1. Видалення не працює, доходить до шуканого елементу і видаляє весь список що знаходиться далі
2. 4. За це відповідають інші функції, якщо вони вам цікаві

String *pozition(String *element, int pochuk)
{
    String *tmp = element;
    for (int i = 0; tmp != NULL; i++)
    {
        if (tmp->d == pochuk)
            return tmp;
        tmp = tmp->next;
    }
    return NULL;
}
//....................................
String *p = pozition(Begin, num);
    if (p == NULL)
        cout << "Pomylka shukanoho elementu nemaye\n";
//....................................

3. Так це помилка там непотрібний лічильник я змінив на while();

4

Re: Лінійний список, видалення шуканого елементу

Деструктор можете ще показати?

5

Re: Лінійний список, видалення шуканого елементу

koala написав:

Деструктор можете ще показати?

Деструктора немає

6 Востаннє редагувалося koala (10.10.2014 11:30:11)

Re: Лінійний список, видалення шуканого елементу

Поки що додайте в початок функції

if( (*Begin) == NULL )
{
  return;
}

і замініть

while(tmp != NULL)

на

while(tmp->next != NULL)

Так, як у вас - ви можете, в разі, якщо tmp->next == NULL, запитати NULL->d.

А, ось проблема:

tmp1 = tmp;
tmp->next = tmp->next->next;
delete tmp1->next;

замініть на

tmp1 = tmp->next;
tmp->next = tmp1->next;
delete tmp1;

а то ви видаляли "tmp->next->next" - вони (tmp і tmp1) ж на одне місце вказують. Загальна порада: уникайте вкладених -> - якщо працюєте з двома елементами, обізвіть їх current і candidate, наприклад (поточний елемент і кандидат на видалення).

Подякували: Betterthanyou, leofun012

7 Востаннє редагувалося koala (10.10.2014 20:58:35)

Re: Лінійний список, видалення шуканого елементу

Ось вам весь код:

void erase(String **begin, int needle)//назва - не ключове слово
{
  if( *begin == NULL )
    return;
  if( (*begin)->d == needle )//ага, забули, що робити, якщо одразу зустріли d
  {
    String *candidate = *begin;
    *begin = (*begin)->next;
    delete candidate;
    return;
  }
  String *current = begin;
  while( current->next != NULL)
  {
    String *candidate = current->next;
    if ( candidate->d == needle )
    {
        current->next = candidate->next;
        delete candidate;
        return;
    }
    current = candidate;
  }
}
Подякували: Betterthanyou1