Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.89/27: Рейтинг темы: голосов - 27, средняя оценка - 4.89
13 / 18 / 6
Регистрация: 02.05.2018
Сообщений: 545

Нахождение середины списка

23.02.2019, 17:04. Показов 5951. Ответов 22
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
не работает
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
     Node* GetMiddle(MyList c)
     {
         MyList a = c;
         MyList b = c;
         MyList Tail = NULL;
 
         while(b->Next != Tail && b->Next->Next != Tail)
         {
             a = a->Next;
             b = b->Next->Next;
         }
         return a;
     }
Весь код. Ф-я в самом конце

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
156
157
158
159
template <class T>
struct Node                             //Структура, являющаяся звеном списка
 {
 public:
    T data;                             //Значение x будет передаваться в список
    Node *Next, *Prev;                 //Указатели на адреса следующего и предыдущего элементов списка
     
};
 
template <class T>
 class MyList                              //Создаем тип данных Список
 {
public:
    Node<T> *Head;                 //Указатели на адреса начала списка и его конца
    Node<T> *Tail;  
    int size;  // размер списка, понадобится в ф-ии для удаления
 
    MyList():Head(NULL),Tail(NULL), size(0) {};    //Инициализируем адреса как пустые
    
    ~MyList()                           //Прототип деструктора
    {
        while (Head)                       //Пока по адресу на начало списка что-то есть
        {
            Tail = Head->Next;             //Резервная копия адреса следующего звена списка
            delete Head;                   //Очистка памяти от первого звена
            Head = Tail;                   //Смена адреса начала на адрес следующего элемента
        }
    }
    
    void Show()                       //Прототип функции отображения списка на экране
    {
        Node<T> *temp = Head;
 
        if(temp == NULL)
        {
            cout << "Список пуст!" << endl;
        }
        else
        {
            while(temp)
            {
                cout << temp->x;
                temp = temp->Next;
            }
        }
    }
    
    void Add(T data)                   //Прототип функции добавления элементов в список
    {
        Node<T> *temp = new Node<T>;               //Выделение памяти под новый элемент структуры
        temp->Next = NULL;                   //Указываем, что изначально по следующему адресу пусто
        temp->data = data; // ЗДЕСЬ ПРОИСХОДИТ МАГИЯ
 
        if (Head != NULL)                    //Если список не пуст
        {
            temp->Prev = Tail;               //Указываем адрес на предыдущий элемент в соотв. поле
            Tail->Next = temp;               //Указываем адрес следующего за хвостом элемента
            Tail = temp;                     //Меняем адрес хвоста
        }
        else //Если список пустой
        {
            temp->Prev = NULL;               //Предыдущий элемент указывает в пустоту
            Head = Tail = temp;              //Голова=Хвост=тот элемент, что сейчас добавили
        }
        size++;
    }
    
    int GetSize()  // получаем размер списка
    {
        Node *temp = Head;
        int i(0);
 
        while(temp)
        {
            i++;
            temp = temp->Next;
        }
 
        return i;
    }
    
    void Remove(int index)  // удаление по индексу
    {
            Node<T> *temp = Head;
 
    if ((index > size) || (index < 0))    //если указанный элемент не существует, то
        cout << "Задайте другой индекс!!!" << endl;  //выводим предупреждение на экран
    else
    {
        for(int i = 0; i != index; i++)  //иначе, переходим до этого элемента
        {
            temp = temp->Next;
        }
 
        if (temp->Prev == NULL)        //если удаляем первый элемент
        {
            if (size == 1)         //если этот элемент единственный
            {
                Head = NULL;
                Tail = NULL;
            }
            else                //если он первый, но не единственный
            {
                temp->Next->Prev = NULL;
                Head = temp->Next;
            }
 
            delete temp;
            size--;
            return;
        }
 
        if (temp->Next == NULL)        //если удаляем последний элемент, то
        {
            temp->Prev->Next = NULL;   //предыдущий элемент указывает на NULL
            Tail = temp->Prev;        //указатель на последний элемент указывает на предпоследний
 
            delete temp;
            return;
        }       
 
//если элемент находится в центре списка
        if (temp->Next != NULL && temp->Prev != NULL) 
        {
            temp->Prev->Next = temp->Next; //предыдущий элемент указывает на следующий
            temp->Next->Prev = temp->Prev; //следующий указывает на предыдущий
            delete temp;
            return;
        }
    }
    }
    
    void Insert(class x, int index); // помещаем новый элемент по заданному индексу
 
    void Clear() // ф-я для очищения списка, хотя детруктор и так долен очищать список после работы
    {
        while(Head)
        {
            Tail = Head->Next;
            delete Head;
            Head = Tail;
        }
    }
        
     Node* GetMiddle(MyList c)
     {
         MyList a = c;
         MyList b = c;
         MyList Tail = NULL;
 
         while(b->Next != Tail && b->Next->Next != Tail)
         {
             a = a->Next;
             b = b->Next->Next;
         }
         return a;
     }
    
};
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
23.02.2019, 17:04
Ответы с готовыми решениями:

Удаление элемента из середины списка
Приветствую. При написании программы возникла такая проблема. Не могу нормально удалить элемент, который находится в середине списка. У...

Удалить элемент из середины двусвязного списка
Не подскажите, как удалить элемент из середины двусвязного списка?????? дека

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

22
13 / 18 / 6
Регистрация: 02.05.2018
Сообщений: 545
23.02.2019, 17:06  [ТС]
снимок прикрепил
Миниатюры
Нахождение середины списка  
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
23.02.2019, 17:16
C++
1
MyList<int>
0
13 / 18 / 6
Регистрация: 02.05.2018
Сообщений: 545
23.02.2019, 17:20  [ТС]
zayats80888, а если я хочу вместо int собственный тип данных?
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
23.02.2019, 17:29
у меня все компилируется, возможно ошибка при инициализации переменной класса

Добавлено через 2 минуты
и не пойму зачем в метод класса передавать переменную класса да и еще копированием?
0
13 / 18 / 6
Регистрация: 02.05.2018
Сообщений: 545
23.02.2019, 17:33  [ТС]
zayats80888, хочу сделать сортиировку слиянием, для этого надо сделать ф-ю которая принимает список и находит его середину

Добавлено через 2 минуты
как здесь
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
student Merge(student a, student b)
{
    student head = NULL;
    student tail = NULL;
 
    while (true)
    {
 
        if (a == NULL)
        {
            if (tail == NULL)
            {
                head = b;
                head->Prev = NULL;
 
                return head;
            }
            else
            {
                tail->Next = b;
                b->Prev = tail;
 
                return head;
            }
        }
        if (b == NULL)
        {
            if (tail == NULL)
            {
                head = a;
                a->Prev = NULL;
 
                return head;
            }
            else
            {
                tail->Next = a;
                a->Prev = tail;
 
                return head;
            }
        }
 
        if (a->growth > b->growth)
        {
            if (tail == NULL)
            {
                head = a;
                tail = a;
                head->Prev = NULL;
            }
            else
            {
                tail->Next = a;
                a->Prev = tail;
                tail = a;
            }
            a = a->Next;
            tail->Next = NULL;
        }
        else
        {
            if (tail == NULL)
            {
                head = b;
                tail = b;
                head->Prev = NULL;
            }
            else
            {
                tail->Next = b;
                b->Prev = tail;
                tail = b;
            }
 
            b = b->Next;
            tail->Next = NULL;
        }
    }
}
 
student GetMiddle(student c, student tail = NULL)  //поиск середины
{
    student a = c;
    student b = c;
    if (tail != NULL) tail = tail->Next;
    while (b->Next != tail && b->Next->Next != tail)
    {
        a = a->Next;
        b = b->Next->Next;
    }
    return a;
}
 
student MergeSort(student c)
{
    if (c->Next == NULL)
    {
        return c;
    }
 
    student middle = GetMiddle(c);
    student r = middle->Next;  //Начало второй части списка (после разделения)
 
    r->Prev = NULL;
    middle->Next = NULL;
 
    c = MergeSort(c);
    r = MergeSort(r);
 
    return Merge(c, r);
}
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
23.02.2019, 17:40
и еще если у класса есть поля указатели желательно предусмотреть конструктор копирования и оператор присваивающего копирования, иначе разные объекты класса будут оперировать общими данными

Добавлено через 3 минуты
найти середину можно использую поле size
1
13 / 18 / 6
Регистрация: 02.05.2018
Сообщений: 545
23.02.2019, 17:52  [ТС]
zayats80888, я с 9 часов утра сижу за ноутом никак понять не могу как это сделать. Всегда ошибки.
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
23.02.2019, 18:05
zayats80888, хочу сделать сортиировку слиянием, для этого надо сделать ф-ю которая принимает список и находит его середину

Добавлено через 2 минуты
как здесь
мне ваш код тяжело осилить, но насколько я понимаю вы там разделяете исходный список пополам, а затем объединяете почленно сортируя?

Добавлено через 5 минут
если задача объединить два списка в один и отсортировать то и делать удобнее в таком порядке

Добавлено через 6 минут
напишите метод класса MyList::sort(), напишите внешнюю функцию MyList* MergeSort(MyList& a, MyList& b) с использованием методов MyList::add() и MyList::sort()
1
13 / 18 / 6
Регистрация: 02.05.2018
Сообщений: 545
23.02.2019, 18:08  [ТС]
zayats80888,
Цитата Сообщение от zayats80888 Посмотреть сообщение
мне ваш код тяжело осилить, но насколько я понимаю вы там разделяете исходный список пополам, а затем объединяете почленно сортируя?
да
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
23.02.2019, 19:43
Лучший ответ Сообщение было отмечено cherc как решение

Решение

Вот пример внешней функции, правда нужно написать копирующий конструктор классе MyList::MyList(MyList& list) что бы он выделял память и инициализировал ее значениями динамической памяти объекта list
C++
1
2
3
4
5
6
7
8
9
10
11
template <typename T> MyList<T> GetMiddle(MyList<T>& list)
     {
         MyList<T> result=list;
         int size=list.size;
         for (int i=0; i<size/2; ++i){
             result.Remove(i);
             list.Remove(size-1-i);
         }
         if (size%2) list.Remove(size/2+1);
         return result;
     }
Добавлено через 20 минут
Вот пример конструктора копирования(функцию T MyList::get(int i) напишите сами):
C++
1
MyList(MyList& list):MyList(){for (int i=list.size-1; i>=0; --i) add(list.get(i))}
Добавлено через 24 минуты
Ой, в конструкторе с циклом перемудрил, у вас же метод add() в конец списка добавляет, так что
for (int i=0; i<list.size-1; ++i)
1
Параллельный Кот
 Аватар для valen10
1905 / 827 / 350
Регистрация: 25.03.2016
Сообщений: 2,045
23.02.2019, 19:46
cherc, некоторое время назад вы уже пытались решить эту задачу. Что вам мешает использовать код повторно?
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
23.02.2019, 20:08
И в функции GetMiddle косяк:
C++
1
if (size%2) list.Remove(size/2);
1
13 / 18 / 6
Регистрация: 02.05.2018
Сообщений: 545
23.02.2019, 20:22  [ТС]
zayats80888, не знаете что за ошибка???
Миниатюры
Нахождение середины списка  
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
23.02.2019, 20:23
я конечно ламер, но может кто объяснит, что, тот метод сортировки слиянием с предварительным разбиением какой то особо эффективный?
0
13 / 18 / 6
Регистрация: 02.05.2018
Сообщений: 545
23.02.2019, 20:24  [ТС]
valen10, да пытался но не получилос, и я по другому там все реализовал. Теперь обратно вернулся и хочу как класс сделать
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
23.02.2019, 20:26
ну на скрине я вижу как в функции Merge ты инициализируешь две переменные класса MyList<T> нулем
1
13 / 18 / 6
Регистрация: 02.05.2018
Сообщений: 545
23.02.2019, 20:33  [ТС]
zayats80888, не в них проблема.
0
13 / 18 / 6
Регистрация: 02.05.2018
Сообщений: 545
23.02.2019, 20:43  [ТС]
zayats80888, кажется я неправильно объявляю
Миниатюры
Нахождение середины списка  
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
23.02.2019, 20:47
Лучший ответ Сообщение было отмечено cherc как решение

Решение

Тот код что ты адаптируешь под свой класс мне мозг взрывает, если вкратце объяснишь суть алгоритма я помогу.
Функция GetMiddle(), что я написал, берет исходный объект вырезает из него половину списка и вставляет её во временный объект,так что можешь инициализировать переменную этой функцией(если определил копирующий конструктор), например:
C++
1
MyList<T> half_list=GetMiddle(some_list);
Добавлено через 2 минуты
эти три функции внешние, убери их объявление из класса
ну или убери template <typename T> в реализации
лучше первое, не стоит делать такие функции методами класса
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
23.02.2019, 20:47
Помогаю со студенческими работами здесь

Решение уравнения, нахождение середины его корней
Подскажите, есть задание (решить квадратное уравнение, найти середину отрезка между корнями, сгенерировать 20 чисел и выяснить какие числа...

Нахождение треугольной матрицы для метода Холецкого. Доходя до середины цикл перестаёт идти по диагонали
Здравствуйте, нахожу треугольную матрицу для метода Холецкого, но доходя до середины цикл перестаёт идти по диагонали...(возможно глаз...

Как реализовать круговой цикл не с 1 до конца, а с середины до этой же середины
Нужно пройти цикл, но не с первого до последнего элемента, а скакого то n-го элемента и до этого же n-го элемента по кругу, то есть...

Поменять в квадратной матрице часть главной диагонали до середины с той, которая после середины
Массивы, дана матрица размерности Ann Поменять на квадратной матрице часть главной диагонали ту, что идет до середины с той, что идет...

Нахождение n-го элемента списка
Написать программу для получения значения n-го элемента списка. Например: в списке второй элемент равен one. Напишите, пожалуйста полную...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru