Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/40: Рейтинг темы: голосов - 40, средняя оценка - 5.00
Котовчанин
942 / 482 / 200
Регистрация: 16.02.2010
Сообщений: 3,338
Записей в блоге: 37
1

Вставить элемент в двусвязный список

19.07.2017, 15:10. Показов 7259. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем добрый день!

Никогда не дружила со списками, но решила, что пора подружиться.
Задача такая - у меня есть упорядоченый двусвязный список:
C++
1
2
3
4
5
6
7
struct listNode
{
public:
    int val;
    listNode* prev;
    listNode* next;
};
Нужно добавить элемент так, чтобы не нарушилась упорядоченность по val. Вот кусок кода, который я уже написала
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
listNode* insertOrdered(listNode* listParent, listNode* listToInsert)
{
    listNode* tmp = listParent;
    // if listParent have only one node
    if (!tmp->next)
    {
        if (tmp->val < listToInsert->val)
            tmp->next = listToInsert;
        else
            tmp->prev = listToInsert;
 
        return;
    }
    // else
    while (tmp->next)
    {
        if (listToInsert->val < tmp->next->val && listToInsert->val > tmp->val)
        {
            tmp = tmp->next;
        }
 
    }
}
Однако не могу сообразить... Если элемент внутри списка (не первый и не последний), тогда нужно его добавить, а остальные указатели сместить?.. Или может есть способ прощё и умнее?..

Заранее спасибо!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.07.2017, 15:10
Ответы с готовыми решениями:

Двусвязный список - Добавить элемент после заданного, удалить заданный элемент
Реализуйте списочную структуру в виде класса. работа состоит из двух частей: из класса (структуры,...

Динамический двусвязный список (операции: добавить элемент после данного, удалить данный элемент …)
реализовать Динамический двусвязный список (операции: добавить элемент после данного, удалить...

Двусвязный список, удалить 1 элемент и вывести то что осталось
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; using namespace std; struct ds { int d; ds*next;...

Переделать двусвязный список в двусвязный кольцевой
Здравствуйте, у меня єсть двусвязный список однако он не кольцевой! как это запрограммировать? и...

5
Mental handicap
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
19.07.2017, 15:38 2
Как-то так:
1)создаем узел добавляемого элемента и заполненяем его;
2)переустанавливаем указатель "следующего" узла, предшествующего добавляемому, на добавляемый узел;
3)переустановка указателя "предыдущего" узла, следующему за добавляемым, на добавляемый узел;
4)установка указателя "следующего" добавляемого узла на следующий узел (тот, на который указывал предшествующий узел);
5)установка указателя "предыдущего" добавляемого узла на узел, предшествующий добавляемому (узел, переданный в функцию).
1
79 / 67 / 28
Регистрация: 22.04.2016
Сообщений: 384
19.07.2017, 15:43 3
Тамика,
Цитата Сообщение от Тамика Посмотреть сообщение
Однако не могу сообразить... Если элемент внутри списка (не первый и не последний), тогда нужно его добавить, а остальные указатели сместить?..
Думаю, да. Допустим, есть список, который состоит из четырех узлов. Новый узел, допустим, должен разместиться между третьим и вторым узлов. Тогда в новом списке, ранее третий узел будет уже четвертым и будет указывать на на последний узел и на новый узел , который уже третий и этот новый узел будет ссылаться на на второй узел и на четвертый.
1
Котовчанин
942 / 482 / 200
Регистрация: 16.02.2010
Сообщений: 3,338
Записей в блоге: 37
19.07.2017, 15:46  [ТС] 4
Эх... А я надеялась, что не придётся мотать лист...
0
308 / 271 / 220
Регистрация: 14.11.2016
Сообщений: 1,049
19.07.2017, 16:46 5
Тамика, так?! функция должна возвращать указатель на начало списка?
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
listNode* insertOrdered(listNode* listParent, listNode* listToInsert)
{
    listNode* tmp = listParent;
    if (!tmp->next)
    {
        if (tmp->val < listToInsert->val)
        {
            listToInsert->prev = tmp;
            tmp->next = listToInsert;
            return listParent;
        }
        else
        {
            listToInsert->next = tmp;
            tmp->prev = listToInsert;
            return tmp->prev;
        }
    }
    else if (!tmp->prev)
    {
        if (tmp->val > listToInsert->val)
        {
            listToInsert->next = tmp;
            tmp->prev = listToInsert;
            return tmp->prev;
        }
    }
    while (tmp->next)
    {
        if (tmp->val < listToInsert->val)
        {
            listToInsert->prev = tmp;
            listToInsert->next = tmp->next;
            tmp->next->prev = listToInsert;
            tmp->next = listToInsert;
            return listParent;
        }
        else
        {
            tmp = tmp->next;
        }
    }
}
0
Mental handicap
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
19.07.2017, 16:48 6
все немног проще
C++
1
2
3
4
5
6
7
8
9
10
listNode *insertOrdered(listNode *listParent, int number)
{
    listNode *tmp = new listNode;
    tmp->val = number;
    tmp->next = listParent;
    tmp->prev = nullptr;
    if(listParent != nullptr)
       listParent->prev = tmp;
    return tmp;
}
P.S. - писал с телефона, не компилил, возможны ошибки (:
0
19.07.2017, 16:48
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.07.2017, 16:48
Помогаю со студенческими работами здесь

Как вставить элемент в список?
Здравствуйте, сейчас изучал связные списки и возникла одна непонятка. void insert(ListNode...

Вставить элемент в односвязный список
Есть у меня такой код: Node *pv = new Node; //Node *b; char symbol; pv = head;...

В непустой двусвязный список вставить новый элемент Е1 перед первым вхождением элемента Е
Помогите решить задачу на C# В непустой динамически двусвязный список вставить новый элемент Е1...

В непустой динамический двусвязный список вставить новый элемент E1 перед первым вхождением элемента Е
нужно реализовать задачу на с# В непустой динамический двусвязный список вставить новый элемент E1...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru