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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.06.2013, 15:30   #1
LifeWind
Пользователь
 
Регистрация: 30.09.2012
Сообщений: 10
По умолчанию Обмен двух элементов в списке(C++)

Здравствуйте, вот задача: дан список из n элементов a1, a2, .. an. Поменять местами первый из минимальных и последний из положительных элементов списка. Вопрос вот в чем: как поменять эти элементы в списке? Пробовал, не получается, если только обменять их данные, но это не подходит по заданию, так как нужно обменять сами элементы. Напишите пожалуйста правильно.
Вот :
Код:
#include <iostream>
#include <iomanip>
using namespace std;
 
struct list
{
int info;
list *next, *pred;
};
 
//makelist формирует двухсвязный список с двумя сторожами
void makelist(list *&head, list *&tail)
{
head=new list;
tail=new list;
head->next=tail;
tail->pred=head;
int k,n;
cout<<"Введите количество элементов: "<<endl;
cin>>n;
cout<<"Вводите числа: "<<endl;
for(int i=0;i<n;i++)
{
    cin>>k;
    list*p=new list;
    p->info=k;
    p->next=tail;
    p->pred=tail->pred;
    tail->pred=p;
    p->pred->next=p;
}
return;
}
 
void printlist(list *head, list *tail) //вывод списка на экран
{
list *a=head;
while(a!=tail->pred)
{
cout<<a->next->info<<" ";
a=a->next;
}
cout << endl;
return;
}
 
void min(list *head, list *tail)//находит первый минимальный и последний положительный и меняет местами
{
    list *a=head->next;
    list *b=tail->pred;
    list *m, *p, *t;
    p=a;
    m=a;
    while(a!=tail)
    {
        if(a->info < m->info)
        m=a;
        if(a->info > 0)   
        p=a;
        a=a->next;
    }
    cout << m->info << endl << p->info <<endl;
    t=new list;  
    t->info=m->info;//вот здесь я просто меняю местами их info, а нужно поменять сами элементы местами
    m->info=p->info;
    p->info=t->info;
 
    return;
}
 
void main()
{  
    setlocale(LC_ALL, "Russian" );
    list * head, * tail;
    makelist(head,tail);
    printlist(head,tail);
    cout << endl;
    min(head,tail);
    printlist(head,tail);
    return;
}
LifeWind вне форума Ответить с цитированием
Старый 15.06.2013, 16:26   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
как поменять эти элементы в списке?
Код:
void xchg(list *q,list *w){
 list *qPred, *qNext, *wPred, *wNext;
 qPred=q->pred; qNext=q->next;
 wPred=w->pred;wNext=w->next;
 
 qPred->next=w;
 w->next=qNext;

 wPred->next=q;
 q->next=wNext;
 
}
Сюда передавай найденные элементы.
Не проверял но думаю сработает.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 15.06.2013, 17:14   #3
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Stilet, идея такова, но всего связей восемь (у каждого элемента 2 исходящие связи и 2 входящие), при этом может понадобиться изменить указатели head и tail, и могут не существовать qPred->next, wPred->next и так далее, так как q или w могут являться последним или первым элементом.
Обмен минимального и максимального - http://programmersforum.ru/showpost....6&postcount=15.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 15.06.2013 в 17:50.
BDA вне форума Ответить с цитированием
Старый 15.06.2013, 20:55   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Да, похоже я не все предусмотрел...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 15.06.2013, 22:44   #5
LifeWind
Пользователь
 
Регистрация: 30.09.2012
Сообщений: 10
По умолчанию

вот, я нашел как менять:
Код:
	m->next->pred = p;
    m->pred->next = p;
    p->next->pred = m;
    p->pred->next = m;
    std::swap(m->next, p->next);
    std::swap(m->pred, p->pred);
LifeWind вне форума Ответить с цитированием
Старый 15.06.2013, 22:59   #6
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Если Вас устраивает работа, то хорошо, но учтите, что программа может "сломаться" в любой момент с таким обменом
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 15.06.2013, 23:08   #7
Bugrimov
C/C++, Java
Участник клуба
 
Аватар для Bugrimov
 
Регистрация: 28.03.2012
Сообщений: 1,679
По умолчанию

Здорово... Скажите пожалуйста, я откровенно говоря не знаю, никогда не пробовал.
В метод swap передаются указатели next и pred. Метод может поменять их местами????
"Keep it simple" - придерживайтесь простоты!
Уильям Оккам - "Не следует множить сущее без необходимости"
Сложность - враг простоты и удобства!
Bugrimov вне форума Ответить с цитированием
Старый 15.06.2013, 23:43   #8
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Bugrimov, swap. Swap меняет местами содержание двух переменных, переданных ему в качестве аргументов.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Указатели.Поиск элементов в списке misery24-7 Паскаль, Turbo Pascal, PascalABC.NET 6 18.06.2012 14:26
Обмен двух ячеек местами Rusl92 JavaScript, Ajax 2 22.07.2011 01:07
Обмен двух столбцов на листе местами Decker Microsoft Office Excel 3 14.02.2010 14:31
Перестановка элементов в списке Adya Помощь студентам 0 26.08.2009 15:11
Обмен местами 2х элементов в односвязном списке. amdbodia Общие вопросы C/C++ 4 31.05.2009 23:26