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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.06.2013, 16:39   #11
shilovec5377
Форумчанин
 
Аватар для shilovec5377
 
Регистрация: 29.06.2011
Сообщений: 117
По умолчанию

спасибо.
помогите пожалуйстас условием: ( поменять местами элементы с максимальныи и минимальным значениями, при этом элементы не должны перемещаться в памяти )
shilovec5377 вне форума Ответить с цитированием
Старый 03.06.2013, 16:52   #12
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

Вы должны пройти по списку и найти минимальный и максимальный элемент (указатели на элементы списка):
Сначала предположите, что максимальный и минимальный элемент это первый.
Затем, проходя по списку, сравнивайте текущий элемент с максимальным и минимальным, и меняйте указатели, если нужно.

У каждого элемента есть ссылки на соседей, а у соседей ссылки на элемент. Имея указатели на максимальный и минимальный элементы, нужно поменять местами соответствующие ссылки (всего их 8 штук).
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 04.06.2013, 11:15   #13
shilovec5377
Форумчанин
 
Аватар для shilovec5377
 
Регистрация: 29.06.2011
Сообщений: 117
Восклицание

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

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

Код:
#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;
}
shilovec5377 вне форума Ответить с цитированием
Старый 04.06.2013, 11:43   #14
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
вот код, но что-то выводит только исходный список (заполненный рандомно), а (поменяный min с max) не хочет, может я не так вывожу?
В функции List::Swap() где-то производится вывод списка? Извините, не нашёл.
Abstraction вне форума Ответить с цитированием
Старый 04.06.2013, 11:51   #15
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

Код:
void List::Swap()  //меняем min с max
{
    Node *min = Head, *max = Head, *cur = Head->Next;

//Поиск минимального и максимального узла
    while(cur != NULL)
    {
        if(cur->x < min->x)
        {
            min = cur;
        } else if(cur->x > max->x)
        {
            max = cur;
        }
        cur = cur->Next;
    }

    Node *beforeMin = min->Prev;
    Node *afterMin = min->Next;

    Node *beforeMax = max->Prev;
    Node *afterMax = max->Next;

    //выбор адресов элементов
    if (beforeMin)
        beforeMin->Next = max;
    if (afterMin)
        afterMin->Prev = max;
    if (beforeMax)
        beforeMax->Next = min;
    if (afterMax)
        afterMax->Prev = min;

    min->Prev = beforeMax;
    min->Next = afterMax;

    max->Prev = beforeMin;
    max->Next = afterMin;

    if (max->Next == NULL)
        Tail = max;
    else if (min->Next == NULL)
        Tail = min;
    if (max->Prev == NULL)
        Head = max;
    else if (min->Prev == NULL)
        Head = min;
}
Добавил некоторые условия (основная ошибка - описка в beforeMax).
В main:
Код:
lst.Swap();
lst.Show();
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 04.06.2013, 16:41   #16
shilovec5377
Форумчанин
 
Аватар для shilovec5377
 
Регистрация: 29.06.2011
Сообщений: 117
Радость

а на экран выводится итоговый или изначатльный список?

как можно вывести 2 списка (итоговый и изначатльный )

Последний раз редактировалось shilovec5377; 04.06.2013 в 16:44.
shilovec5377 вне форума Ответить с цитированием
Старый 04.06.2013, 16:58   #17
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

Код:
lst.Show();
lst.Swap();
lst.Show();
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 04.06.2013, 17:27   #18
shilovec5377
Форумчанин
 
Аватар для shilovec5377
 
Регистрация: 29.06.2011
Сообщений: 117
По умолчанию

спасибо большое за помощь.
shilovec5377 вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создать двунаправленный список shilovec5377 Общие вопросы Delphi 5 31.05.2013 12:49
Двунаправленный список de_coder Паскаль, Turbo Pascal, PascalABC.NET 2 15.10.2012 12:41
Создать односвязный список и вывести его на экран. Из этого списка создать новый список по указанному ниже правилу и новый список San111 Паскаль, Turbo Pascal, PascalABC.NET 1 15.05.2012 22:08
Двунаправленный список Вельвет Помощь студентам 1 10.01.2012 14:14
Двунаправленный список dip Помощь студентам 3 02.03.2010 12:16