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

перестановка - C++

Восстановить пароль Регистрация
 
kaffein
 Аватар для kaffein
5 / 5 / 1
Регистрация: 14.11.2010
Сообщений: 121
09.03.2011, 16:26     перестановка #1
Всем доброго времени суток!
у меня возник вопрос по спискам, вернее по перестановке элементов списка!
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void per(list *n,list *m)
{
    list *n0 = n->prev;
    list *n1 = n->next;
    list *m0 = m->prev;
    list *m1 = m->next;
    m1->prev = n;
    n->next = m1;
 
    n1->prev = m;
    m->next = n1;
 
    n0->next = m;
    m->prev = n0;
 
    m0->next = n;
    n->prev = m0;
}
эта функция переставляет элементы списка, например 3 с 5 и т. д
всё работает, но когда я хочу переставить первый и какой то другой не работает, потому-что нет в первого элемента предведущего ( prev ) там head в котором NULL; так же и с последним там next указывает на tail
модифицируйте мою функцию так что бы можно было переставлять и первые элементы с какими то другими, и последний
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.03.2011, 16:26     перестановка
Посмотрите здесь:

Матрицы (перестановка) C++
C++ Перестановка
Перестановка в массиве C++
Перестановка чисел C++
Перестановка слов C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
09.03.2011, 16:32     перестановка #2
Я же ещё тогда вам сказал - вам осталось учесть случаи, когда участвует первый или последний элемент... Подумайте хоть чуть-чуть сами.
kaffein
 Аватар для kaffein
5 / 5 / 1
Регистрация: 14.11.2010
Сообщений: 121
09.03.2011, 16:44  [ТС]     перестановка #3
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
n1->prev = m;
    m->next = n1;
    if(n0 == NULL)
        m0 = NULL;
    else
    {
    n0->next = m;
    m->prev = n0;
    }
    if(m1 == NULL)
        n1 = NULL;
    else
    
    m1->prev = n;
    n->next = m1;
я то написал, но оно не работает
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
09.03.2011, 17:05     перестановка #4
Порисуйте на бумажке то, что делаете в коде. Может, это натолкнёт вас на мысль...
kaffein
 Аватар для kaffein
5 / 5 / 1
Регистрация: 14.11.2010
Сообщений: 121
09.03.2011, 18:07  [ТС]     перестановка #5
я уже гору изресовал и знаю как она работает но не могу догадатся как етот кусок заменит ведь n0 не существует, тогда как нам m0 объявить
Цитата Сообщение от kaffein Посмотреть сообщение
n0->next = m;
m->prev = n0;
Добавлено через 49 минут
silent_1991, так ты поможешь ? потому, что я над этим списком уже второй час сижу
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
09.03.2011, 18:27     перестановка #6
Эта функция выполнит перестановку двух любых элементов.

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
37
38
39
40
41
42
void swap_nodes(Node *n, Node *m)
{
    Node *n_next = n->next;
    Node *n_prev = n->prev;
    Node *m_next = m->next;
    Node *m_prev = m->prev;
 
    Node *temp;
 
    if (n->next == NULL || m->prev == NULL)
    {
        temp = n;
        n = m;
        m = temp;
 
        temp = n_next;
        n_next = m_next;
        m_next = temp;
 
        temp = n_prev;
        n_prev = m_prev;
        m_prev = temp;
    }
 
    n->prev = m_prev;
    m_prev->next = n;
 
    m->next = n_next;
    n_next->prev = m;
 
    n->next = m_next;
    m->prev = n_prev;
 
    if (n->prev != NULL || m->next != NULL)
    {
        if (n->prev != NULL)
            n_prev->next = m;
 
        if (m->next != NULL)
            m_next->prev = n;
    }
}
kaffein
 Аватар для kaffein
5 / 5 / 1
Регистрация: 14.11.2010
Сообщений: 121
09.03.2011, 20:19  [ТС]     перестановка #7
Цитата Сообщение от silent_1991 Посмотреть сообщение
n_prev->next = m;
у меня чото здесь ошибка вылазит
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
09.03.2011, 21:05     перестановка #8
Какая ошибка? Я просто только закончил гадать над другой темой, мана ещё не восстановилась...
kaffein
 Аватар для kaffein
5 / 5 / 1
Регистрация: 14.11.2010
Сообщений: 121
09.03.2011, 21:36  [ТС]     перестановка #9
ну если я беру n как первый элемент, то n_prev не сработает, так как первый элемент указивает на NULL
тогда на n_prev->next = m; компилятор будет ругатся
Или у меня не так список сфотмирован ?
Когда я смотрю в локальных значениях на n_prev то там пишет что next и prev там нет
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
09.03.2011, 21:42     перестановка #10
Я, видимо, так и буду спрашивать вас, какая вылазит ошибка, а вы так и будете отвечать, что там, блин, ошибка.

Добавлено через 1 минуту
Я же делаю проверку, не равен ли n->prev NULL. Вы код не меняли? После if, случайно, точку с запятой не поставили?

Добавлено через 1 минуту
Так, стоп... Попробуйте-ка вот такой вариант:
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
37
38
39
40
41
42
void swap_nodes(Node *n, Node *m)
{
    Node *n_next = n->next;
    Node *n_prev = n->prev;
    Node *m_next = m->next;
    Node *m_prev = m->prev;
 
    Node *temp;
 
    if (n->next == NULL || m->prev == NULL)
    {
        temp = n;
        n = m;
        m = temp;
 
        temp = n_next;
        n_next = m_next;
        m_next = temp;
 
        temp = n_prev;
        n_prev = m_prev;
        m_prev = temp;
    }
 
    n->prev = m_prev;
    m_prev->next = n;
 
    m->next = n_next;
    n_next->prev = m;
 
    n->next = m_next;
    m->prev = n_prev;
 
    if (n_prev != NULL || m_next != NULL)
    {
        if (n_prev != NULL)
            n_prev->next = m;
 
        if (m_next != NULL)
            m_next->prev = n;
    }
}
kaffein
 Аватар для kaffein
5 / 5 / 1
Регистрация: 14.11.2010
Сообщений: 121
09.03.2011, 21:45  [ТС]     перестановка #11
Я написал свои мысли о возможной причине этой ошибки и хотел бы узнать метод решения, или это у меня не правельный список ?
сори, если задал тупой вопрос
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.03.2011, 21:46     перестановка
Еще ссылки по теме:

Перестановка строки. C++
C++ Массивы и перестановка
Перестановка чисел C++

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

Или воспользуйтесь поиском по форуму:
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
09.03.2011, 21:46     перестановка #12
О Боже... Вы сказали, что компилятор ругается. Я спросил, какими конкретно матами он ругается. Вы уже третье сообщение пишите об ошибке, не уточняя её деталей. Неужели столь неприличная ошибка?
Попробуйте последний вариант.
Yandex
Объявления
09.03.2011, 21:46     перестановка
Ответ Создать тему
Опции темы

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