Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.03.2017, 14:04   #1
EDWIN503
Пользователь
 
Регистрация: 13.11.2016
Сообщений: 15
По умолчанию Удалить первый отрицательный элемент из списка

Доброго времени суток, возникли затруднения с одной задачей, вот собственно она:
Цитата:
Пусть L динамический однонаправленный список. Описать функцию, которая удаляет из списка L первый отpицательный элемент , если такой есть.
Странно что в заголовке темы нельзя использовать слово "Отрицательный" XD.
У меня есть программа создающая список, но я не знаю как написать функцию удаляющую из списка первый отрицательный элемент.
Буду рад любой помощи.
Код:
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <locale>
using namespace std;
 
struct TStack
{
   int value;
   TStack* next;
};
 
//----------------------------------------------//
TStack*& Push(TStack*& stack, int value)
{
   TStack* node = new TStack;
   node->value = value;
   node->next = stack;
   stack = node;
 
   return stack;
}
//----------------------------------------------//
TStack*& FillRandom(TStack*& stack, size_t count)
{
   for (; count; --count)
   {
      Push(stack, rand() % (2*(count+1)));
   }
 
   return stack;
}
//----------------------------------------------//
void Print(const TStack* stack)
{
   for (; stack; stack = stack->next)
   {
      cout << stack->value << ' ';
   }
   cout << endl;
}
//----------------------------------------------//
 
int main()
{
   setlocale (LC_ALL, "Rus");
   srand(time(NULL));
 
   cout << "Введите количество элементов: ";
   size_t count;
   cin >> count;
 
   TStack* stack = NULL;
 
   FillRandom(stack, count);
   Print(stack);
 
   system("pause");
 
   return 0;
}
EDWIN503 вне форума Ответить с цитированием
Старый 01.03.2017, 15:24   #2
New man
Форумчанин
 
Регистрация: 24.01.2011
Сообщений: 774
По умолчанию

Код:

void RemoveNode(TStack* previous)
{
   TStack to_del = previous->next;
   if(!to_del) return;
   previous->next = to_del->next;
   delete to_del;
}

void RemoveFirstNegative(TStack*& head)
{
    if(!head) return;
    TStack* tmp = head; 
    if(head->value<0)
    {
       head = head->next;
       delete tmp;
       return
    }
    while(tmp->next)
   {
      if(tmp->next->value<0)
      {
         RemoveNode(tmp);
         return;
      }
      tmp = tmp->next;
   }
}
a.k.a. Angelicos Phosphoros
Мой сайт
New man вне форума Ответить с цитированием
Старый 01.03.2017, 18:03   #3
EDWIN503
Пользователь
 
Регистрация: 13.11.2016
Сообщений: 15
По умолчанию

Цитата:
Сообщение от New man Посмотреть сообщение
Код:

void RemoveNode(TStack* previous)
{
   TStack to_del = previous->next;
   if(!to_del) return;
   previous->next = to_del->next;
   delete to_del;
}

void RemoveFirstNegative(TStack*& head)
{
    if(!head) return;
    TStack* tmp = head; 
    if(head->value<0)
    {
       head = head->next;
       delete tmp;
       return
    }
    while(tmp->next)
   {
      if(tmp->next->value<0)
      {
         RemoveNode(tmp);
         return;
      }
      tmp = tmp->next;
   }
}
не могли бы вы дать небольшие пояснения к коду, не очень понимаю как адаптировать его для моей программы
EDWIN503 вне форума Ответить с цитированием
Старый 02.03.2017, 12:24   #4
New man
Форумчанин
 
Регистрация: 24.01.2011
Сообщений: 774
По умолчанию

Это две функции.
Добавляешь их перед main.

Вызываешь где тебе надо.

Код:
// Убирает элемент после previous
void RemoveNode(TStack* previous)
{
   TStack to_del = previous->next;
   if(!to_del) return; // Если следующего элемента нет, то уходим
   previous->next = to_del->next; // вынимаем из списка
   delete to_del; // чистим память
}

// убирает самый первый отриц. элемент списка
void RemoveFirstNegative(TStack*& head)
{
    if(!head) return;
    TStack* tmp = head; 
    // Удаление головы
    if(head->value<0)
    {
       head = head->next;
       delete tmp;
       return;
    }
    // Итерируем по списку
    while(tmp->next)
   {
       // если нашли отрицательный элемент
      if(tmp->next->value<0)
      {
         RemoveNode(tmp);
         return;
      }
      tmp = tmp->next;
   }
}
a.k.a. Angelicos Phosphoros
Мой сайт
New man вне форума Ответить с цитированием
Старый 02.03.2017, 19:46   #5
EDWIN503
Пользователь
 
Регистрация: 13.11.2016
Сообщений: 15
По умолчанию

Цитата:
Сообщение от New man Посмотреть сообщение
Это две функции.
Добавляешь их перед main.

Вызываешь где тебе надо.
Остался вопрос по параметрам, какие параметры мне нужно передать в функции (в head и в previous) при вызове?
void RemoveNode(TStack* previous)
void RemoveFirstNegative(TStack*& head)
EDWIN503 вне форума Ответить с цитированием
Старый 03.03.2017, 01:44   #6
New man
Форумчанин
 
Регистрация: 24.01.2011
Сообщений: 774
По умолчанию

По-моему, это очевидно из названий переменных.

head - самый первый элемента списка.
previous - элемента, который находится перед тем, который надо удалять (который указывает на удаляемый).
a.k.a. Angelicos Phosphoros
Мой сайт
New man вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удалить из массива первый отрицательный элемент. EasyMak Помощь студентам 4 19.01.2015 17:40
Указатели в Паскале: Программу, которая удаляет из линейного списка целых чисел первый отрицательный элемент Victor1995 Помощь студентам 8 24.12.2013 11:19
найти первый отрицательный элемент массива имеющий чётный номер (Delphi) Vanger Помощь студентам 5 25.01.2011 11:41
Паскаль. Первый отрицательный элемент. DaRus Помощь студентам 7 18.12.2009 21:26