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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Разработать алгоритм вычисления и вывода необходимого количества итераций http://www.cyberforum.ru/cpp-beginners/thread1154947.html
Разработать алгоритм вычисления и вывода необходимого количества итераций и приближенного значения функции для заданных в исходных данных значений аргумента и значений допустимой абсолютной погрешности.Так же вывести вычисленное с помощью стандартной функции значение и значение полученной абсолютной погрешности. функция y=(x)^(1/3) y(i+1)=05*y(i)+(1.2*x)/(2y(i)^2+x/y(i)) почему-то программа...
C++ Найти наибольшее и наименьшее абсолютное значение вещественного массива Найти наибольшее и наименьшее абсолютное значение вещественного массива. Если таких значений несколько, определить их количество. Создать функции для определения минимума и максимума. http://www.cyberforum.ru/cpp-beginners/thread1154938.html
C++ Раскраска таблицы умножения
Раскраска таблицы умножения (Время: 1 сек. Память: 16 Мб Сложность: 32%) Таблицей умножения назовем таблицу размера n строк на m столбцов, в которой на пересечении i-ой строки и j-ого столбца стоит число i∙j (строки и столбцы нумеруются с единицы). В одной из математических школ было решено провести педагогический эксперимент. Для того, чтобы ученикам было проще запоминать таблицу...
C++ Работа с неструктурированными данными
Для исследования различных методов доступа к файлам данных необходимо выполнить следующие подготовительные действия: 1) Создать в Блокноте следующий текстовый файл input_1.txt: У меня спросили: сколько будет x Опер y ? А я не знаю! А n Опер k ? Тоже! Помогите! Например: У меня спросили: сколько будет 7 * 2 ? А я не знаю! А 9 / 4 ? Тоже! Помогите! 2) Создать программу, выводящую...
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>. Однако пробовал и #include <string.h> и #include <string> - bzero идентификатор не найден. #include <string.h> #include <string> void main() { int n = 5; int *mass = new int;
C++ Как открыть проект в программе, не запуская саму программу Ребят, такая тема: У меня есть программа, в которой я создаю проекты, но как сделать так, что бы при запуске созданного мной проекта 1) Запускалась моя программа, можно ли сделать программно, что бы файлы моего проекта были ассоциированы? 2) Что бы сработала функция загрузки из файла подробнее

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

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

23.04.2014, 12:19. Просмотров 614. Ответов 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;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru