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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.10.2011, 12:14   #1
world12_tk
Форумчанин
 
Регистрация: 24.02.2009
Сообщений: 269
По умолчанию c++ двусвязный список

Здраствуйте уважаемые форумчанины....
Я пытаюсь отсортировать список по любому полю класса....
заголовок класса:
Код:
struct Item
{
   int number;

   Item *next;
   Item *prev;
};

class NumericItems
{
   public:
      NumericItems();
      void Add(int data);
      void Sort(bool selection);
      String Print();
   private:
      int count;
      Item *firstItem;
      Item *prevItem;

};
Вот функции добавление и сортировка:
Код:
void NumericItems::Add(int data)
{
   Item *elem = new Item();
   if(firstItem==NULL)
   {
      firstItem=elem;
   }
   else
   {
      prevItem->prev=prevItem;
      prevItem->next=elem;
   }
   elem->number = data;
   elem->next = NULL;
   prevItem = elem;
   count++;

}
void NumericItems::Sort(bool selection)
{
   Item *elemSecond = NULL;
   Item *elem = NULL;
   Item *temp = NULL;
   int reverseNumber;
   if (selection)
   {
      elem = firstItem;
      temp = prevItem;
   }
   else
   {
      elem = prevItem;
      temp = firstItem;
   }
   while (elem != temp)
   {
      elemSecond = elem->next;
      while (elemSecond != NULL)
      {
         if (elem->number > elemSecond->number)
         {
            reverseNumber = elem->number;
            elem->number = elem->number;
            elemSecond->number = reverseNumber;
         }
         elemSecond = elemSecond->next;
      }
      elem = elem->next;
   }
}
Когда я сортирую список с начала и до конца, то все нормально... но когда сортирую наоборот, код не работает...
Не могли бы вы мне помочь исправить код...?
Заранее спасибо....
world12_tk вне форума Ответить с цитированием
Старый 15.10.2011, 12:36   #2
Tony Parker
Пользователь
 
Регистрация: 19.12.2010
Сообщений: 52
По умолчанию

1. Добавляемый элемент не ссылается на предыдущий, не заполняется поле elem->prev.
Исправление:
Код:
void NumericItems::Add(int data)
{
   Item *elem = new Item();
   if(firstItem==NULL)
   {
      firstItem=elem;
      elem->prev=NULL; // здесь
   }
   else
   {
      elem->prev=prevItem; // здесь
      prevItem->next=elem;
   }
   elem->number = data;
   elem->next = NULL;
   prevItem = elem;
   count++;

}
2. В сортировке нет прохода "назад", вида c = c->prev;
Исправление:
Код:
void NumericItems::Sort(bool selection)
{
   Item *elemSecond = NULL;
   Item *elem = NULL;
   Item *temp = NULL;
   int reverseNumber;
   if (selection)
   {
      elem = firstItem;
      temp = prevItem;
while (elem != temp)
   {
      elemSecond = elem->next;
      while (elemSecond != NULL)
      {
         if (elem->number > elemSecond->number)
         {
            reverseNumber = elem->number;
            elem->number = elem->number;
            elemSecond->number = reverseNumber;
         }
         elemSecond = elemSecond->next;
      }
      elem = elem->next;
   }
   }
   else
   {
      elem = prevItem;
      temp = firstItem;
while (elem != temp)
   {
      elemSecond = elem->prev; // ***
       while (elemSecond != NULL)
      {
         if (elem->number > elemSecond->number)
         {
            reverseNumber = elem->number;
            elem->number = elem->number;
            elemSecond->number = reverseNumber;
         }
         elemSecond = elemSecond->prev; // ***
      }
      elem = elem->prev; // ***
   }
   }
   
}
AllSuccess1.ru - каталог полезных курсов.
Tony Parker вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Двусвязный список Даsha Помощь студентам 3 26.06.2011 11:45
двусвязный список Work Group Помощь студентам 0 24.05.2010 21:27
двусвязный список klykovka Помощь студентам 8 22.05.2010 18:58
двусвязный список на си++ mizantrop32 Общие вопросы C/C++ 0 18.05.2010 17:45
Двусвязный список kruserg Паскаль, Turbo Pascal, PascalABC.NET 1 28.04.2009 10:37