Показать сообщение отдельно
  (#2 (permalink)) Старый
shilovec5377 shilovec5377 вне форума
Новичок
 
Сообщений: 4
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 03.06.2013
По умолчанию 04.06.2013, 11:06

вот код, но что-то выводит только исходный список (заполненный рандомно), а (поменяный min с max) не хочет, может я не так вывожу?

функция для замены min с max: void List::Swap() //меняем min с max

cpp Код:
#include <stdlib.h>
#include <iostream>
using namespace std;
 
struct Node       //Структура являющаяся звеном списка
 {
     int x;     //Значение x будет передаваться в список
     Node *Next,*Prev; //Указатели на адреса следующего и предыдущего элементов списка
 };
 
 class List   //Создаем тип данных Список
 {
     Node *Head,*Tail; //Указатели на адреса начала списка и его конца
 public:
     List():Head(NULL),Tail(NULL){}; //Инициализируем адреса как пустые
     ~List(); //Деструктор
     void Show(); //Функция отображения списка на экране
     void Add(int x); //Функция добавления элементов в список
     void Swap();//sortirovka
 };
 
List::~List() //Деструктор
 {  
     while (Head) //Пока по адресу на начало списка что-то есть
     {
         Tail=Head->Next; //Резервная копия адреса следующего звена списка
         delete Head; //Очистка памяти от первого звена
         Head=Tail; //Смена адреса начала на адрес следующего элемента
     }
 }
 
 void List::Add(int x)
 {
   Node *temp=new Node; //Выделение памяти под новый элемент структуры
   temp->Next=NULL;  //Указываем, что изначально по следующему адресу пусто
   temp->x=x;//Записываем значение в структуру
 
   if (Head!=NULL) //Если список не пуст
   {
       temp->Prev=Tail; //Указываем адрес на предыдущий элемент в соотв. поле
       Tail->Next=temp; //Указываем адрес следующего за хвостом элемента
       Tail=temp; //Меняем адрес хвоста
   }
   else //Если список пустой
   {
       temp->Prev=NULL; //Предыдущий элемент указывает в пустоту
       Head=Tail=temp; //Голова=Хвост=тот элемент, что сейчас добавили
   }
 }
 
 void List::Show()
 {
//ВЫВОДИМ СПИСОК С КОНЦА
     Node *temp=Tail;
      //Временный указатель на адрес последнего элемента
     while (temp!=NULL) //Пока не встретится пустое значение
     {
     cout<<temp->x<<" "; //Выводить значение на экран
     temp=temp->Prev; //Указываем, что нужен адрес предыдущего элемента
     }
     cout<<"\n";
  }
 
 
 
 void List::Swap()  //меняем min с max
{
    Node *min = Head, *max = Head, *cur = Head;        //head element
 
//Поиск минимального и максимального узла
    while(cur != Tail)
    {
        cur = cur->Next;
        if(cur->x < min->x)
        {
            min = cur;
        }
        if(cur->x > max->x)
        {
            max = cur;
        }
    }
   
    Node *beforeMin = min->Prev;
    Node *afterMin = min->Next;
   
    Node *beforeMax = min->Prev;
    Node *afterMax = max->Next;
   
    //выбор адресов элементов
    beforeMin->Next = max;
    afterMin->Prev = max;
   
    beforeMax->Next = min;
    afterMax->Prev = min;
   
    min->Prev = beforeMax;
    min->Next = afterMax;
   
    max->Prev = beforeMin;
    max->Next = afterMin;
   
//Проверка головы и хвоста
    if(min == Head) Head = max;
    if(min == Tail) Tail = max;
   
    if(max == Head) Head = min;
    if(max == Tail) Tail = min;
}
 
 
 
int main ()
{
 
 List lst; //Объявляем переменную, тип которой есть список
for (int i = 0, n = rand()%11 + 10; i < n; ++i)
{
  lst.Add(rand()%101-50);
}
 
 
 lst.Show(); //Отображаем список на экране
 
 lst.Swap(); //Отображаем поменяный список на экране
 return 0;
}
Ответить с цитированием
Ads