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

Переместить элемент на n поз. назад(кольц.односв.сп) - C++

Восстановить пароль Регистрация
 
VladSharikov
 Аватар для VladSharikov
22 / 22 / 1
Регистрация: 02.12.2010
Сообщений: 824
15.05.2011, 22:15     Переместить элемент на n поз. назад(кольц.односв.сп) #1
Собственно сабж

есть кольцевой односвязный список. нужно переместить последний элемент(на который указываем в данный момент) на n позиций назад, и остальные позиции сдвинуть вправо.

тоесть есть
1 2 3 4 5 6 7
возвращаем на 3 назад
получаем
1 2 3 7 4 5 6

как?! попробовал вариантов 20 блин!
не понимаю как! хоть убейте!

знаю что надо поменять местами указатели. а как в упор не пойму!!!

моя мысля: (неверная)
C++
1
2
3
4
5
tmp_position = new_position;
new_position = position;
new_position->next = tmp_position;
for(int i =  1; i < bStep; i++) 
    new_position->next= new_position->next->next;
Как блин?! всю задачу написал, осталось только вернуть на элемент на несколько позиций назад.

Добавлено через 2 часа 33 минуты
У кого то какие-то варианты есть?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.05.2011, 22:15     Переместить элемент на n поз. назад(кольц.односв.сп)
Посмотрите здесь:

C++ Utf8-Utf16 и назад. КАК?
C++ получение символа по коду и назад
Путем перестановок строк и столбцов (целиком) элемент надо переместить в правый верхний угол подмассива (Перевести программу в c++) C++
C++ Путем перестановок строк и столбцов элемент переместить в правый верхний угол подмассива (С Turbo Pascal на C++)
Массивы (циклическим сдвигом переместить найденный элемент на последнюю позицию) C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
lifestyle
Mobile Developer
 Аватар для lifestyle
230 / 226 / 4
Регистрация: 10.05.2009
Сообщений: 917
15.05.2011, 23:41     Переместить элемент на n поз. назад(кольц.односв.сп) #2
1.указатель с предпоследнего обьекта ставишь на первый
2.последний впихиваешь в нужном месте, путем изменения указателя обьекта который будет идти на месте n-1 по новому будет указывать на твоей "последний" обьект который ты перетащиль , а указатель этого "последнего" обькта ставишь на обьект n+1.

если список двусторонний то просто так же меняешь указатели "назад"

Добавлено через 2 минуты
| 1 |->| 2 |-> | 3 |->| 4 |->| 1 |

| 1 |->| 2 |-> | 3 |-X>| 4 |-X>| 1 | => | 1 |-X>| 2 |-> | 3 |->| 1 |

=> | 1 |->| 4 |->| 2 |-> | 3 |->| 1 |
VladSharikov
 Аватар для VladSharikov
22 / 22 / 1
Регистрация: 02.12.2010
Сообщений: 824
15.05.2011, 23:52  [ТС]     Переместить элемент на n поз. назад(кольц.односв.сп) #3
моей последний объект??
аа правда не понятно! (

Добавлено через 1 минуту
Нет нет, уважаемый.
Вы меня не поняли!

Мне нужно вот так
1 2 3 4 5 6 7 -> 1 2 3 4 7 5 6
Вот так вот, сударь
lifestyle
Mobile Developer
 Аватар для lifestyle
230 / 226 / 4
Регистрация: 10.05.2009
Сообщений: 917
15.05.2011, 23:57     Переместить элемент на n поз. назад(кольц.односв.сп) #4
ну я образно сказал последний, вот берем твою 7 в твоем случае.она привязана к 6 и к 1 так?
теперь:
1. меняем указатель 6 с 7 на 1 т.е. теперь 6 указывает на 1.
2. теперь необходимо впихнуть 7 между 4 и 5 , значит- изменяем указатель 4 с 5 на 7 ,т.е. 4 теперь указывает на 7 а не на 5. теперб указатель 7 ставим на 5 . т.е. 7 указывает на 5, а не на 1.
все тоже что и описанно сверху.
VladSharikov
 Аватар для VladSharikov
22 / 22 / 1
Регистрация: 02.12.2010
Сообщений: 824
16.05.2011, 00:01  [ТС]     Переместить элемент на n поз. назад(кольц.односв.сп) #5
к 1 ведь не привязана.
список ведь односвязный.
или вы имеете в виду то, что он кольцевой?
lifestyle
Mobile Developer
 Аватар для lifestyle
230 / 226 / 4
Регистрация: 10.05.2009
Сообщений: 917
16.05.2011, 00:03     Переместить элемент на n поз. назад(кольц.односв.сп) #6
конечно -кольцевой ведь. да и какая разница если не кольцевой то тогда 7 не привязана к 1 а 6 не надо перепривазывать с 7 на 1 а просто удалять указатель на следующий обьект т.к. 6 станет последним обьектом в списке, НЕ кольцевом.
VladSharikov
 Аватар для VladSharikov
22 / 22 / 1
Регистрация: 02.12.2010
Сообщений: 824
16.05.2011, 00:38  [ТС]     Переместить элемент на n поз. назад(кольц.односв.сп) #7
C++
1
2
3
4
5
6
7
8
9
    nodes* new_position = new nodes;
    new_position = head;
    int tmp1 = 1;   
    do {
        new_position = new_position->next;
        tmp1++;
    } while(tmp1 != (count - bStep - 1));
    new_position->next = position;
    position = new_position->next;
в упор не получается. что не так?

Добавлено через 10 минут
C++
1
2
3
4
5
6
7
8
9
10
    nodes* new_position = new nodes;
    new_position = head;
    int tmp = 1;    
    do {
        new_position = new_position->next;
        tmp++;
    } while(tmp != (count - bStep - 1));
    position->next = new_position->next;
    new_position->next = position;
    new_position = new_position->next;
вот так правильно?
lifestyle
Mobile Developer
 Аватар для lifestyle
230 / 226 / 4
Регистрация: 10.05.2009
Сообщений: 917
16.05.2011, 00:49     Переместить элемент на n поз. назад(кольц.односв.сп) #8
я вообще не понимаю что ты тут делаешь))))
вот у тебя есть уже реализованный список? как ты добавляешь новый обьект в список? -вот таким же принципом и меняешь место обьекты))зачем ты делаешь новую позицию?!
создай метод
C++
1
2
3
4
5
6
7
 void move(Node node)
{
      this->prev=this->next;//предыдущий элемент указывает на следующий элемент пердвигаемого обьекта
      this->next=node->next;//указател передвигаемого обьекта ставим на n+1
      node->next->prev=this;//n+1 prev указываем на передвигаемый обьект
      node->next=this;// обьект на месте n указываем на передвигаемый обьект
}
Кольцевой двусторонний список.

в не кольцевом и одностороннем списке пропиши три метода :
1. перенос главы списка
2. перенос хвоста списка
3. перенос элементы в "середине" списка + метод типа getNodeAtIndex(int i index) чтобы можно было предшествующие элементы достать и работать с ними так как поля prev в одностороннем уже нету.
первые два мтеода нужны посколько если главу списка смещаешь то не нужно пердшествующие ему элемент линковать и в хвосте не нужно следующий с предшествующим линковать.
VladSharikov
 Аватар для VladSharikov
22 / 22 / 1
Регистрация: 02.12.2010
Сообщений: 824
16.05.2011, 01:05  [ТС]     Переместить элемент на n поз. назад(кольц.односв.сп) #9
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
//1. Разработайте класс, реализцющий кольцевой односвязный список. 
// Методы класса: добавление элемента в список, просмотр списка, перемещение элемента с текущей позиции на n позиций назад по списку. 
// Поля записей: фамилия работник, его год рождения, семейное положение, специаьность.
 
#include "stdafx.h"
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
 
const int str_size = 66;
 
struct ELEMENT {
    char name[20], status[20], occupation[20], year[5];
 
    void InElement() {
        printf("In name: "); scanf("%s", name);
        printf("In Year Of Birth: "); scanf("%s", year);
        printf("In semeynoe pologhenie: "); scanf("%s", status);
        printf("In occupation: "); scanf("%s", occupation);
    }
}el;
 
struct nodes {
    char data[str_size];
    nodes* next;
};
 
class list {
private:
    nodes*  head;                   // гЄ*§*⥫м ** **з*«® бЇЁбЄ*
    nodes*  position;               // ⥪гй*п Ї®§ЁжЁп
    int     count;      
 
public:
            
    void        go_first();         // ЇҐаҐе®¤ Є ЇҐаў®¬г н«Ґ¬Ґ*вг бЇЁбЄ*
    void        go_next();          // ЇҐаҐе®¤ Є б«Ґ¤го饩 §*ЇЁбЁ
    void        insert();           // ўбв*ўЄ* Ї®б«Ґ ⥪г饩 §*ЇЁбЁ
    int         size();             // ў®§ўа*й*Ґв Є®«ЁзҐбвў® н«Ґ¬Ґ*в®ў ў бЇЁбЄҐ
    void        back_step(int);     // ў®§ўа*й*Ґв гЄ*§*⥫м ** N и*Ј®ў **§*¤
    void        show_list();
 
    list() {
        head = NULL;
        count = 0;
        go_first();
    }
 
};
 
void list::go_first() {
    position = head;
}
 
void list::go_next() {
    if(position != NULL)
        position = position->next;
}
 
 
 
void list::insert() {
    nodes* new_node = new nodes;
    char space[2] = " "; 
 
    el.InElement();
 
    strcpy(new_node->data, el.name); strcat(new_node->data, space);
    strcat(new_node->data, el.year); strcat(new_node->data, space);
    strcat(new_node->data, el.status); strcat(new_node->data, space);
    strcat(new_node->data, el.occupation); strcat(new_node->data, space);
 
    if(position != NULL) {
        new_node->next = position->next;
        position->next = new_node;
        go_next();
    } else {
        new_node->next = new_node;
        position = head = new_node;
    }
 
    count++;
}
 
int list::size() {
    return count;
}
 
void list::back_step(int bStep) {
 
    nodes* tmp_position = new nodes;
    tmp_position = head;
    int tmp = 1;    
    do {
        tmp_position = tmp_position->next;
        tmp++;
    } while(tmp != (count - bStep - 1));
    position->next = tmp_position->next;
    tmp_position->next = position;
    tmp_position = tmp_position->next;
 
 
}
 
 
 
void list::show_list() {
    go_first();
    for(int i = 1; i <= count; i++) {
    printf("%s\n", position->data);
    if(i != size())
        go_next();      
    }
}
 
int main(void) {
    system("cls");
    int tmp = 0;
    printf("Menu(in button):\n 1 - create new list \n 2 - exit \n\n Press button: ");
    scanf("%d", &tmp);
    if(tmp == 1) {
        tmp = 0;
        list lister;
        while(!0) {
            system("cls");
            printf("Menu(in button)[list num: %d]:\n 1 - add element \n 2 - show list \n 3 - move element N steps back \n 4 - exit\n\n Press button: ", lister.size()); scanf("%d", &tmp);
            switch(tmp) {
            case 1:
                lister.insert();
                continue;
            case 2:
                system("cls");
                lister.show_list();
                printf("\n\n Press any key to open menu");
                if(_getch()) {
                    continue;
                }
            case 3:
                system("cls");
                int steps;
                printf("In num of back steps: "); scanf("%d", &steps);
                lister.back_step(steps);
                continue;
            case 4: 
                exit(1488);
            }
 
        }
    }
    if(tmp == 2) {
        exit(1488);
    }
    return 0;
}
держите, сударь.
все понятно думаю
lifestyle
16.05.2011, 01:10
  #10

Не по теме:

нет сударь , сегодня уже ничего мн ене понятно. вам достаточно информации к размышлению и реализации+ есть гугл и яндекс в помощь)))а я спать)

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.05.2011, 01:35     Переместить элемент на n поз. назад(кольц.односв.сп)
Еще ссылки по теме:

Переместить самый максимальный элемент массива в левый верхний угол C++
C++ Перестановкой строк и столбцов минимальный элемент переместить в [1][1]
Переместить элемент внутри списка std::list C++

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

Или воспользуйтесь поиском по форуму:
VladSharikov
 Аватар для VladSharikov
22 / 22 / 1
Регистрация: 02.12.2010
Сообщений: 824
16.05.2011, 01:35  [ТС]     Переместить элемент на n поз. назад(кольц.односв.сп) #11
Нет! это рабочий вариант, сударь
Yandex
Объявления
16.05.2011, 01:35     Переместить элемент на n поз. назад(кольц.односв.сп)
Ответ Создать тему
Опции темы

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