Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
kaffein
5 / 5 / 1
Регистрация: 14.11.2010
Сообщений: 121
#1

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

09.03.2011, 16:26. Просмотров 909. Ответов 11
Метки нет (Все метки)

Всем доброго времени суток!
у меня возник вопрос по спискам, вернее по перестановке элементов списка!
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
модифицируйте мою функцию так что бы можно было переставлять и первые элементы с какими то другими, и последний
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.03.2011, 16:26
Здравствуйте! Я подобрал для вас темы с ответами на вопрос перестановка (C++):

Перестановка - C++
Уважаемые профи, я в Си нуб.Каким образом можно реализовать строчную перестановку(все варианты)? То есть вводим LOL, а программа выведет...

Рекурсия и перестановка - C++
Добрый день. Нужно написать рекурсивную функцию, которая выводит все перестановки от 1 до n в лексиграфическом порядке. Подскажите...

Перестановка.(Комбинаторика) - C++
Прошу помощи. Объясните пожалуйста тугодуму этот код. Какой день его пытаюсь понять. Не как не могу в нём разобраться. Вроде знаю как...

Перестановка в массиве - C++
Дана целочисленная прямоугольная матрица. 1. Определить количество столбцов, не содержащих ни одного нулевого элемента 2....

Перестановка чисел - C++
Для заданного n получить все возможные перестановки чисел: 1, 2, …, n. Подскажите плиз как сделать.

Перестановка байтов - C++
Задание: Определить объединение из двух полей. Первое поле - массив из 4 байт, второе двойное слово. Ввести случайное целое число в...

11
silent_1991
Эксперт С++
4989 / 3046 / 149
Регистрация: 11.11.2009
Сообщений: 7,028
Завершенные тесты: 1
09.03.2011, 16:32 #2
Я же ещё тогда вам сказал - вам осталось учесть случаи, когда участвует первый или последний элемент... Подумайте хоть чуть-чуть сами.
0
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;
я то написал, но оно не работает
0
silent_1991
Эксперт С++
4989 / 3046 / 149
Регистрация: 11.11.2009
Сообщений: 7,028
Завершенные тесты: 1
09.03.2011, 17:05 #4
Порисуйте на бумажке то, что делаете в коде. Может, это натолкнёт вас на мысль...
0
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, так ты поможешь ? потому, что я над этим списком уже второй час сижу
0
silent_1991
Эксперт С++
4989 / 3046 / 149
Регистрация: 11.11.2009
Сообщений: 7,028
Завершенные тесты: 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;
    }
}
1
kaffein
5 / 5 / 1
Регистрация: 14.11.2010
Сообщений: 121
09.03.2011, 20:19  [ТС] #7
Цитата Сообщение от silent_1991 Посмотреть сообщение
n_prev->next = m;
у меня чото здесь ошибка вылазит
0
silent_1991
Эксперт С++
4989 / 3046 / 149
Регистрация: 11.11.2009
Сообщений: 7,028
Завершенные тесты: 1
09.03.2011, 21:05 #8
Какая ошибка? Я просто только закончил гадать над другой темой, мана ещё не восстановилась...
0
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 там нет
0
silent_1991
Эксперт С++
4989 / 3046 / 149
Регистрация: 11.11.2009
Сообщений: 7,028
Завершенные тесты: 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;
    }
}
1
kaffein
5 / 5 / 1
Регистрация: 14.11.2010
Сообщений: 121
09.03.2011, 21:45  [ТС] #11
Я написал свои мысли о возможной причине этой ошибки и хотел бы узнать метод решения, или это у меня не правельный список ?
сори, если задал тупой вопрос
0
silent_1991
Эксперт С++
4989 / 3046 / 149
Регистрация: 11.11.2009
Сообщений: 7,028
Завершенные тесты: 1
09.03.2011, 21:46 #12
О Боже... Вы сказали, что компилятор ругается. Я спросил, какими конкретно матами он ругается. Вы уже третье сообщение пишите об ошибке, не уточняя её деталей. Неужели столь неприличная ошибка?
Попробуйте последний вариант.
0
09.03.2011, 21:46
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.03.2011, 21:46
Привет! Вот еще темы с ответами:

Перестановка битов - C++
Помогите пожалуйста в файле задание

Массив перестановка. - C++
Переставить первые три и последние три элементы местами, сохраняя их следование.

Перестановка столбцов - C++
Суть в том, чтобы переставить столбец Z с первым столбцом матрицы. Программа вылетает на строке, указанной ниже (видимо выход за границы...

Перестановка рангов - C++
Пожалуйстаа!! Прошу помощи с заданием.. Зоолог Том заметил, что в стае пингвинов всегда существует строгая иерархия. Если в стае n...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.