Форум программистов, компьютерный форум CyberForum.ru

Односвязный список. Поменять местами элементы - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 54, средняя оценка - 4.94
VladSharikov
 Аватар для VladSharikov
22 / 22 / 1
Регистрация: 02.12.2010
Сообщений: 824
01.06.2011, 22:05     Односвязный список. Поменять местами элементы #1
Привет. Есть односвязный список. Например: 5 элементов, поменять местами 2 и 3
Как поменять местами элементы p1 и p2.
Что я сделал?
нашел позиции этих p1 и p2 через циклы.
Как поменять? Я думаю, что нужно поменять указатели, как конкретно их поменять?
Что на что должно указывать? Напишите кодом, пожалуйста.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
void list::change(int first,int last) {
 
    nodes *p1 = new nodes;
    nodes *p2 = new nodes;
    nodes *tmp_pos = new nodes;
 
    p1 = begin;
    p2 = begin;
    tmp_pos = begin;
 
    for(int i = 1; i < first; i++) {
        p2 = p2->next;
    }
    for(int i = 1; i < last; i++) {
        p1 = p1->next;
    }
    p2->data.vivod(); printf("\n");
    p1->data.vivod(); printf("\n");
 
 
    tmp_pos->next = p1->next;
    p1->next = p2->next;
    p2->next = tmp_pos->next;
 
    delete tmp_pos;
}
мой нерабочий вариант

Добавлено через 2 минуты
Нерабочий почему? потому что запуска такой функции и вывода на экран список не выводится, вернее выводится через *опу!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.06.2011, 22:05     Односвязный список. Поменять местами элементы
Посмотрите здесь:

C++ Реализовать односвязный список, элементы которого содержат целые числа
Поменять местами первый и последний элементы. Все единичные элементы массива заменить нулями C++
Задали односвязный линейный список с целыми числами. Создать новый список, который содержит элементы заданного списка в обратном порядке C++
Односвязный список (псевдокод) - поменять два элемента местами (посмотреть, правильно ли написан код) C++
C++ Однонаправленный список типа "Очередь". Поменять элементы местами
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
VladSharikov
 Аватар для VladSharikov
22 / 22 / 1
Регистрация: 02.12.2010
Сообщений: 824
01.06.2011, 22:59  [ТС]     Односвязный список. Поменять местами элементы #21
хорошо, а 456->next зачем? >_<
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
AzaKendler
 Аватар для AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
01.06.2011, 23:08     Односвязный список. Поменять местами элементы #22
сории не разбурусь никак с форумом как что шлется. 456->next мы приклеим 100. чтобы не разорвать список. будет 99-456-101...... 455-100-457.........
grizlik78
Эксперт С++
 Аватар для grizlik78
1884 / 1416 / 102
Регистрация: 29.05.2011
Сообщений: 2,961
01.06.2011, 23:41     Односвязный список. Поменять местами элементы #23
Ну а теперь, наконец, поверенный код. Не обрабатывается случай, когда один из элементов в начале списка.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
void list::change(int first,int last) {
        nodes *p1, *prev_p1, *p2, *prev_p2, *tmp_pos;
 
        prev_p1 = begin;
        prev_p2 = begin;
 
        for(int i = 1; i < first; i++) {
                prev_p2 = prev_p2->next;
        }
        p2 = prev_p2->next;
        for(int i = 1; i < last; i++) {
                prev_p1 = prev_p1->next;
        }
        p1 = prev_p1->next;
 
        p2->data.vivod(); printf("\n");
        p1->data.vivod(); printf("\n");
 
        if (prev_p1 == p2)
        {
            p2->next = p1->next;
            p1->next = p2;
            prev_p2->next = p1;
        }
        else if (prev_p2 == p1)
        {
            p1->next = p2->next;
            p2->next = p1;
            prev_p1->next = p2;
        }
        else
        {
            swap(p1->next, p2->next);
            swap(prev_p1->next, prev_p2->next);
        }
}
VladSharikov
 Аватар для VladSharikov
22 / 22 / 1
Регистрация: 02.12.2010
Сообщений: 824
01.06.2011, 23:47  [ТС]     Односвязный список. Поменять местами элементы #24
Не договорил в icq а Kandlerom.
Вот вариант, до которого мы договорились. Бесконечный цикл в итоге, при выводе.

C++
1
2
3
4
5
6
7
8
    tmp1_pos = p1->next->next;
    tmp2_pos = p2->next->next;
    tmp1_pos->next = p1->next;
    tmp2_pos->next = p2->next;
    p1->next = p2->next;
    p2->next->next = tmp1_pos;
    p2->next = p1->next;
    p1->next->next = tmp2_pos;
Добавлено через 45 секунд
Что за swap гризлик?
grizlik78
Эксперт С++
 Аватар для grizlik78
1884 / 1416 / 102
Регистрация: 29.05.2011
Сообщений: 2,961
01.06.2011, 23:51     Односвязный список. Поменять местами элементы #25
Вообще, помнится, у Кнута подробно описана работа со списками, возможно и обмен элементов есть, не помню. Лень открывать

Добавлено через 1 минуту
swap это стандартная функция для обмена значений переменных. можно реализовать через временную переменную, которая была в первых версиях (и которую забыл удалить в последней)
VladSharikov
 Аватар для VladSharikov
22 / 22 / 1
Регистрация: 02.12.2010
Сообщений: 824
02.06.2011, 00:02  [ТС]     Односвязный список. Поменять местами элементы #26
Ясно. Работает вроде как. Жаль что прицнипа не понимаю.
grizlik78
Эксперт С++
 Аватар для grizlik78
1884 / 1416 / 102
Регистрация: 29.05.2011
Сообщений: 2,961
02.06.2011, 00:06     Односвязный список. Поменять местами элементы #27
Там 2 случая:
когда элементы являются соседними и когда не являются
(вернее три, но первый и второй отличаются лишь тем, кто за кем идёт)
Оба непонятны?
AzaKendler
 Аватар для AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
02.06.2011, 08:48     Односвязный список. Поменять местами элементы #28
Цитата Сообщение от VladSharikov Посмотреть сообщение
Ясно. Работает вроде как. Жаль что прицнипа не понимаю.
И должно работать. а с выходом из цикла - это ты намудрил что то в циклах уже. Я тебе описывал принцип обмена, ужо пристрой сам к своему тексту.

Добавлено через 3 минуты
а мой вариант ты исказил
Я описывал так - надо поменять элемент 32 и элемент 79 местами:

указ_на_33 = 32->next
указ_на_80 = 79->next
31->next =79
79->next = указ_на_33
78->next = 32
32-> next = указ_на_80
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.01.2015, 01:30     Односвязный список. Поменять местами элементы
Еще ссылки по теме:

C++ Односвязный список, поменять местами элементы (максимальный и последний)
C++ Создать динамический список, поменять местами последний и первый элементы списка, предпоследний и второй и т.д.
Некорректно удаляет элементы(односвязный список) C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
FlackoKirill
0 / 0 / 0
Регистрация: 28.01.2015
Сообщений: 1
28.01.2015, 01:30     Односвязный список. Поменять местами элементы #29
Огромное спасибо!

Добавлено через 35 секунд
AzaKendler, огромное спасибо!!!
Yandex
Объявления
28.01.2015, 01:30     Односвязный список. Поменять местами элементы
Ответ Создать тему
Опции темы

Текущее время: 13:19. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru