Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Однонаправленный список, Однонаправленный список  
:(
    Опции темы
Toyamatokanava
  Дата 25.9.2015, 10:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 63
Регистрация: 29.10.2012
Где: Ростов-на-Дону

Репутация: нет
Всего: нет



Сори за глупые вопросы,  я сейчас посидел и хорошенько подумал, и до меня дошло, что есть же указатель на последний введенный элемент.
PM MAIL   Вверх
Toyamatokanava
Дата 25.9.2015, 17:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 63
Регистрация: 29.10.2012
Где: Ростов-на-Дону

Репутация: нет
Всего: нет



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


Код

void List::Del(int N) {
    int n;
    element *temp = Head; //Обращаемся к началу списка
    cout << "введите номер удаляемого элемента:";
    cin >> n;
    if (n == 1)//в этом ифе происходит удаление первого элемента
    {
        
        temp = temp->Next;//переходим к следующему элементу для удаления из списка этого элемента.
        Head = temp;//перейдя на следующий элемент, считаем его последним активным элементом
    }
    if (n == N)//в этом условии происходит удаление последнего элемента
    {
        for (int i = 1; i < N-1 ;i++)
        {
        temp = temp->Next;//перескакиваем по указателям, пока не дойдем до предпоследнего
        }
        temp->Next = NULL;
        temp = Head;
    }


    if (n!=1&&n!=N)
    {
        for (int i = 1; i <= n - 1; i++) temp = temp->Next;
        temp = temp->Next->Next;
        temp = Head;
    }


    N--;//уменьшаем на 1, так как удалили один элемент
    
        cout << "Список после удаления одного элемента\n";
    while (temp != NULL)//До тех пор пока не встретит пустое значение
    {
        
        for (int i = 1; i < N+1; i++)
        {
            cout << i << " элемент =" << temp->x << "\n";//выведен элемент х из списка
            temp = temp->Next;//Указывем, что далее нам нужен следующий элемент
        }
    }
}

PM MAIL   Вверх
volatile
Дата 25.9.2015, 23:29 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



удаление, без лишних телодвижений
Код

void del (unsigned n)  // удаление n-го элемента
{
   if (n >= size_) 
      return; // или исключение здесь

   element * pcur = head_;  // в pcur - будет указатель на текущий элемент (который удаляется)
   element * prev = 0;      // в prev - будет указатель на предыдущий элемент
   while (n --> 0)          // ищем
   {
      prev = pcur;
      pcur = pcur->next;
   }
   (prev ? prev->next : head_) = pcur->next;  // если удаляется первый, то прописываем адрес в голову, иначе в предыдущий элемент
   delete pcur; // удаляем
   -- size_;    // приводим в соответствие размер
}


Это сообщение отредактировал(а) volatile - 25.9.2015, 23:33
PM MAIL   Вверх
volatile
Дата 25.9.2015, 23:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



Весь класс с тестированием
http://ideone.com/VxBGrk

Toyamatokanava, будут вопросы, задавайте

PM MAIL   Вверх
Toyamatokanava
Дата 26.9.2015, 12:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 63
Регистрация: 29.10.2012
Где: Ростов-на-Дону

Репутация: нет
Всего: нет



volatile, все получается,только удаление последнего элемента не работает.
Код

if (!pcur->Next)//
    {
        
        prev->Next= NULL;//у меня первый введенный в список элемент имел указатель равный 0, поэтому досчитав до последнего, я предидущий приравнял к 0, как последний.
        delete pcur;
    }


Это сообщение отредактировал(а) Toyamatokanava - 26.9.2015, 12:31
PM MAIL   Вверх
volatile
Дата 26.9.2015, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



Цитата(Toyamatokanava @  26.9.2015,  12:05 Найти цитируемый пост)
if (!pcur->Next)//
    {
        
        prev->Next= NULL;
        delete pcur;
    }


Toyamatokanava, где вы этот код у меня увидели?


Это сообщение отредактировал(а) volatile - 26.9.2015, 12:42
PM MAIL   Вверх
Toyamatokanava
Дата 26.9.2015, 13:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 63
Регистрация: 29.10.2012
Где: Ростов-на-Дону

Репутация: нет
Всего: нет



У вас такого нету. Просто этот код не хочет удалять последний элемент, а любые другие спокойно.
Код

void List::Del(int N) {
    int n=0;
    cout << "Введите номер элемента,который хотите удалить =";
    cin >> n;
        if (n >= N) return; // или исключение здесь
    element * pcur = Head;  // в pcur - будет указатель на текущий элемент (который удаляется)
    element * prev = 0;      // в prev - будет указатель на предыдущий элемент
    while (n--> 1)          // ищем
    {
        prev = pcur;
        pcur = pcur->Next;
    
    }
        (prev ? prev->Next : Head) = pcur->Next;  // если удаляется первый, то прописываем адрес в голову, иначе в предыдущий элемент
        delete pcur; // удаляем

    N--;    // приводим в соответствие размер
    element *temp = Head; //Обращаемся к началу списка
        for (int i = 1; i <= N ; i++)
        {
            cout << i << " элемент =" << temp->x << "\n";//выведен элемент х из списка
            temp = temp->Next;//Указывем, что далее нам нужен следующий элемент
        }
    
}

PM MAIL   Вверх
volatile
Дата 26.9.2015, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



вы сместили нумерацию элементов.
у вас они идут не с 0, как принято в С, а с 1.
поэтому
Цитата(Toyamatokanava @  26.9.2015,  13:12 Найти цитируемый пост)
   cin >> n;
        if (n >= N) return; // или исключение здесь


Добавлено через 2 минуты и 55 секунд
if (n > N) return;
короче....

PM MAIL   Вверх
Toyamatokanava
Дата 26.9.2015, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 63
Регистрация: 29.10.2012
Где: Ростов-на-Дону

Репутация: нет
Всего: нет



Действительно, а я искал проблему в другом месте, а все тривиально.. Спасибо вам огромное.
PM MAIL   Вверх
volatile
Дата 26.9.2015, 14:22 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



N - у вас размер очереди, как я понял

Цитата(Toyamatokanava @  26.9.2015,  13:12 Найти цитируемый пост)
void List::Del(int N)

зачем здесь оно?
N- храните в членах класса.
а ваша функция будет
void List::Del()
{
   ...
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0708 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.