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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Разработать алгоритм вычисления и вывода необходимого количества итераций http://www.cyberforum.ru/cpp-beginners/thread1154947.html
Разработать алгоритм вычисления и вывода необходимого количества итераций и приближенного значения функции для заданных в исходных данных значений аргумента и значений допустимой абсолютной...
C++ Найти наибольшее и наименьшее абсолютное значение вещественного массива Найти наибольшее и наименьшее абсолютное значение вещественного массива. Если таких значений несколько, определить их количество. Создать функции для определения минимума и максимума. http://www.cyberforum.ru/cpp-beginners/thread1154938.html
C++ Раскраска таблицы умножения
Раскраска таблицы умножения (Время: 1 сек. Память: 16 Мб Сложность: 32%) Таблицей умножения назовем таблицу размера n строк на m столбцов, в которой на пересечении i-ой строки и j-ого столбца...
C++ Работа с неструктурированными данными
Для исследования различных методов доступа к файлам данных необходимо выполнить следующие подготовительные действия: 1) Создать в Блокноте следующий текстовый файл input_1.txt: У меня спросили:...
C++ B zero идентификатор не найден http://www.cyberforum.ru/cpp-beginners/thread1154895.html
Приветствую всех, столкнулся с необходимостью использовать bzero(). Вот такой код не работает. Тут http://www.opennet.ru/docs/RUS/libc/libc-4.html сказано подключать #include <string.h>. Однако...
C++ Как открыть проект в программе, не запуская саму программу Ребят, такая тема: У меня есть программа, в которой я создаю проекты, но как сделать так, что бы при запуске созданного мной проекта 1) Запускалась моя программа, можно ли сделать программно, что... подробнее

Показать сообщение отдельно
Нафис
0 / 0 / 0
Регистрация: 28.02.2013
Сообщений: 14

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

23.04.2014, 12:19. Просмотров 699. Ответов 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;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.