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

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

Войти
Регистрация
Восстановить пароль
 
Нафис
0 / 0 / 0
Регистрация: 28.02.2013
Сообщений: 14
#1

Поиск одинаковых элементов в двусвязном списке - C++

23.04.2014, 12:19. Просмотров 593. Ответов 0
Метки нет (Все метки)

Здравствуйте уважаемые форумчане. Вопрос в следующем: есть двусвязный список, в котором необходимо реализовать модуль перемещения одинаковых элементов в конец списка. Не могу переместить элементы... Прошу помощи...
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
#include <stdlib.h>
#include <iostream>
 
using namespace std;
 
struct Node       //Структура являющаяся звеном списка
 {
     int x;     //Значение x будет передаваться в список
     Node *Next,*Prev; //Указатели на адреса следующего и предыдущего элементов списка
 };
 
 class List   //Создаем тип данных Список
 {
     Node *Head,*Tail; //Указатели на адреса начала списка и его конца
 public:
     List():Head(NULL),Tail(NULL){}; //Инициализируем адреса как пустые
     ~List(); //Деструктор
     void Show(); //Функция отображения списка на экране
     void Add(int x); //Функция добавления элементов в список
     void Transfer(int n);
     void FindClone();
 };
 
List::~List() //Деструктор
 {   
     while (Head) //Пока по адресу на начало списка что-то есть
     {
         Tail=Head->Next; //Резервная копия адреса следующего звена списка
         delete Head; //Очистка памяти от первого звена
         Head=Tail; //Смена адреса начала на адрес следующего элемента
     }
 }
 
 void List::Add(int x)
 {
   Node *temp=new Node; //Выделение памяти под новый элемент структуры
   temp->Next=NULL;  //Указываем, что изначально по следующему адресу пусто
   temp->x=x;//Записываем значение в структуру
 
   if (Head!=NULL) //Если список не пуст
   {
       temp->Prev=Tail; //Указываем адрес на предыдущий элемент в соотв. поле
       Tail->Next=temp; //Указываем адрес следующего за хвостом элемента
       Tail=temp; //Меняем адрес хвоста
   }
   else //Если список пустой
   {
       temp->Prev=NULL; //Предыдущий элемент указывает в пустоту
       Head=Tail=temp; //Голова=Хвост=тот элемент, что сейчас добавили
   }
 }
 
void List::FindClone() // процедура работает не правильно.
{
    Node *pel = Head, *prev = Head, *pr = Head, *r;
    while (pel->Next != NULL)
    {    
        while (pel->Next != NULL)
        {  
            pel = pel->Next;
            if (Head->x != pel->x)
            {
                cout << pel -> x << endl;   // тут вывожу этот элемент, у которого есть клон. но выводит не то что нужно.
//тут же нужно сразу переместить одинаковые элементы в конец. При перемещении элемента в начало, с помощью процедуры
//Transfer, необходимо знать индекс элемента, вот тут тоже не ясно как это сделать, ведь у меня структура, а не массив.
 
            }
        }
        pel = Head->Next;
        Head = Head->Next;
        prev = Head->Next;
    }
    Head = pr;
}
//Как переделать эту процедуру, чтобы можно было перемещать в конец элемент?
void List::Transfer(int n) // модуль перемещения объекта по индексу в начало списка.
{               
    Node *p2, *p1, *x = Head;
    int w = n;
    while (n - 1>0)
    {
        x = x->Next;
        n = n - 1;
    }
    p1 = x->Next;
    p2 = Head;
    while (w - 2>0)
    {
        p2 = p2->Next;
        w--;
    }
    p2->Next = p1;
    x->Next = Head;
    Head = x;
}
 
 void List::Show()
 {
     Node *temp=Tail;
     temp=Head; //Временно указываем на адрес первого элемента
      while (temp!=NULL) //Пока не встретим пустое значение
     {
         cout<<temp->x<<" "; //Выводим каждое считанное значение на экран
         temp=temp->Next; //Смена адреса на адрес следующего элемента
     }
     cout<<"\n";
 }
 
int main ()
{
     system("CLS");
     List lst; //Объявляем переменную, тип которой есть список
     int n, i;;
     cin >> n;
     while (n > 0)
        {
            cin >> i;
            lst.Add(i); //Добавляем в список элементы
            n--;
        }
    //lst.Transfer(3);
    lst.FindClone();
    lst.Show();
    system("PAUSE");
}
Добавлено через 1 час 51 минуту
Изменил процедуру поиска. Теперь правильно могу выловить одинаковые элементы. НО! Не правильно отлавливаются индексы этих элементов. Хотел попробовать переместить эти элементы вперед.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void List::FindClone()
{
    Node *pel = Head, *pr = Head;
    int i = 0;
    while (Head->Next != NULL)
    {    
        i++;
        while (pel->Next != NULL)
        {  
            pel = pel->Next;
            if (Head->x == pel->x)
            {
                cout << Head ->  x << " " << pel -> x <<endl;
                Transfer(i);     
            }
            i++;    
        }
        pel = Head->Next;
        Head = Head->Next;
    }
    Head = pr;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.04.2014, 12:19     Поиск одинаковых элементов в двусвязном списке
Посмотрите здесь:

C++ Ошибка в двусвязном списке
C++ Поиск элемента в двусвязном списке
C++ Использование итератора в двусвязном списке
C++ Нахождение элемента в двусвязном списке
C++ что я делаю не так? в двусвязном списке?
Поиск элемента в двусвязном списке C++
Поиск в двусвязном списке C++
C++ Поиск в двусвязном списке
Поиск в линейном двусвязном списке C++
C++ Сортировка в двусвязном списке
Ошибки линковки в двусвязном списке C++
C++ Сдвиг элемента в двусвязном списке

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

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