Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.80/15: Рейтинг темы: голосов - 15, средняя оценка - 4.80
31 / 15 / 7
Регистрация: 08.01.2019
Сообщений: 636

Двусвязные списки без ООП

01.10.2019, 15:01. Показов 3979. Ответов 53
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, я перелазил по всем сайтам и совсем уже запутался, ни как не разберу как создать мне двусвязный список И как его мне его потом вызвать в мейне.
C++
1
2
3
4
5
6
struct *Node{
    unsigned int size;
    char* data;
    Node* next;
    Node* prev;
};
В конец я запутался когда нашел сайт(версия двусвязного списка на си) где помимо структуры узла заводят структуру для самого списка тогда как я понял должно быть так:
C++
1
2
3
4
5
6
7
8
9
10
struct *Node{
    char* data;
    Node* next;
    Node* prev;
};
struct Dblist{
    unsigned int size;
    Node* head;
    Node* tail;
};
Есть особая разница в том так или так?
Точно понятно что список нужно вывести. А остальное я не понимаю, все что-то пишут на сайтах не дает вообще никакого понятия как работают списки чем больше читаю тем больше вхожу в заблуждение.
Чтобы реализовать двусвязный список нужно написать функции: добавление элемента в конец, в начало списка, так же нужно написать удаление всего списка, а это значит что нужно кроме как завести память под элемент(узел) списка прежде чем его куда-то добавлять нужно было еще в начале завести память под весь список, верно? хоть какие то мои предположения верны?Еще создание нового элемента и добавление его в список это одно и тоже?
Помогите, пожалуйста с этим делом
P.S. Хватит с меня ссылок. Нужен человек который напишет код и все объяснит по нему ИЛИ(и) человек готовый разжевать все до мелочей. Крч суть в том, что те добрые люди который откликнуться должны быть готовы ответь на мои тупые вопросы которые будут возникать по ходу понимания как работает эта структура данных
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
01.10.2019, 15:01
Ответы с готовыми решениями:

Двусвязные списки
Добрый день) имеется задание: Необходимо реализовать список сотрудников, работающих на предприятии. Сведения о сотрудниках содержатся...

двусвязные списки
привет всем. Помогите пожалуйста написать функции очистки списка и добавление елемента в начало списка. Заранее спасибо.

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

53
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
03.10.2019, 20:27
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Vlast001 Посмотреть сообщение
Что значит дешевле?)
Просто меняешь у них prev-next и всё
0
31 / 15 / 7
Регистрация: 08.01.2019
Сообщений: 636
07.10.2019, 17:16  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Просто меняешь у них prev-next и всё
Я извиняюсь, но кажись я вас не правильно понял. По этому пытался реализовать по другому, но там у меня провал. Вот код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void findnode(List &list,int ind){
    
    Node* node = list.head;
    while(list.head){
        if(list.head->count=ind)
            return;
        else
            list.head->next;
    }
    return;
}
void my_swap(List &list, int ind1, int ind2){
    Node* n1 = findnode(list,ind1);
    Node* n2 = findnode(list, ind2);
    if((n1==0)||(n2==0) || (n1==n2) )
        return;
    int temp = n1.data;
    n1->data=n2->data;
    n2->data = temp;
    n1->count.ind2;
    n2->count.ind1;
}
Я щас на том этапе, что у меня проблемы в функции свап из-за которых я не могу скомпилировать, но вот решил спросить Вас будет ли оно вообще свапать и на правильном ли я пути.

А вот ваше
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Просто меняешь у них prev-next и всё
Звучит так просто, но я не понял, что вы этим хотели сказать.

Добавлено через 1 час 4 минуты
Цитата Сообщение от Vlast001 Посмотреть сообщение
void my_swap(List &list, int ind1, int ind2){
* * Node* n1 = findnode(list,ind1);
* * Node* n2 = findnode(list, ind2);
* * if((n1==0)||(n2==0) || (n1==n2) )
* * * * return;
* * int temp = n1.data;
* * n1->data=n2->data;
* * n2->data = temp;
* * n1->count.ind2;
* * n2->count.ind1;
}
Опустим тот нюанс, что я идиот, который пытался свапать стринги через инты

Не могли бы Вы, пожалуйста реализовать свап
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Просто меняешь у них prev-next и всё
таким вот образом, очень интересно для общего развития

Добавлено через 17 минут
oleg-m1973, Подскажите, пожалуйста, где я мог проколотся:
main:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
List list;
    char str[4096];
    int i = 1;
 
    for(;;)
    {
        fgets(str, 4096, stdin);
        if (feof(stdin))
           break;
        push_back(list, i++, str);
    }
    print(list);
    uint a, b;
    cout<<"Choose two string numbers to swap: "; 
    cin >> a, b; //эти три
    my_swap(list, a, b); // строчки
    print(list); // почему-то не работают. Список выводиться лишь раз( тот который был перед uint a,b; )
    
    clearlist(list);
    return 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
Node* findnode(uint ind){ //Если тут вместо Node* написать List* будет правильнее, как я полагаю, но проблема в строке return(node); которую я не смог решить, собственно потому и перешел на Node*
    List list;
    Node* node = list.head;
    while(node){
        if(node->count==ind){
            return (node);
        }           
        else
            node->next;
    }
    return 0;
}
 
void my_swap(List &list, uint ind1, uint ind2){
    Node* n1 = list.head = findnode(ind1);
    Node* n2 = list.head = findnode(ind2);
    if( (n1==0)||(n2==0) || (n1==n2) )
        return;
    string temp = n1->data;
    n1->data=n2->data;
    n2->data = temp;
    n1->count=ind2;
    n2->count=ind1;
}
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
07.10.2019, 19:56
Цитата Сообщение от Vlast001 Посмотреть сообщение
oleg-m1973, Подскажите, пожалуйста, где я мог проколотся:
Вот здесь
Цитата Сообщение от Vlast001 Посмотреть сообщение
Node* n1 = list.head = findnode(ind1);
И вот здесь
Цитата Сообщение от Vlast001 Посмотреть сообщение
Node* n2 = list.head = findnode(ind2);
Зачем ты присваиваешь list.head?

Добавлено через 28 секунд
Цитата Сообщение от Vlast001 Посмотреть сообщение
oleg-m1973, Подскажите, пожалуйста, где я мог проколотся:
Вот здесь
Цитата Сообщение от Vlast001 Посмотреть сообщение
Node* n1 = list.head = findnode(ind1);
И вот здесь
Цитата Сообщение от Vlast001 Посмотреть сообщение
Node* n2 = list.head = findnode(ind2);
Зачем ты присваиваешь list.head?
0
31 / 15 / 7
Регистрация: 08.01.2019
Сообщений: 636
07.10.2019, 21:05  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
list.head
Оу, случайно
C++
1
2
Node* n1 = findnode(ind1);
    Node* n2 = findnode(ind2);
Ну так вывелось, но свап не работает все ровно
Изображения
 
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
07.10.2019, 21:10
Цитата Сообщение от Vlast001 Посмотреть сообщение
Ну так вывелось, но свап не работает все ровно
Покажи класс Node

И что-то я не вижу на скриншоте надписи Choose two string numbers to swap:
0
31 / 15 / 7
Регистрация: 08.01.2019
Сообщений: 636
07.10.2019, 21:18  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Покажи класс Node
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
struct Node
{
    uint count;
    string data;
    Node* next;
    Node* prev;
}; 
 
struct List
{
    Node *head = NULL;
    Node *tail = NULL;
};

Цитата Сообщение от oleg-m1973 Посмотреть сообщение
И что-то я не вижу на скриншоте надписи Choose two string numbers to swap:
Я пока-что это убрал и задаю так uint a=1, a=3; так как оно не дает возможности ввести данные, то что вы видите на скриншоте происходит без возможности ввести данные, щас покажу новое вложения, если снова не понятно объяснил)
Изображения
 
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
07.10.2019, 21:28
Цитата Сообщение от Vlast001 Посмотреть сообщение
Node* findnode(uint ind){ //Если тут вместо Node* написать List* будет правильнее, как я полагаю, но проблема в строке return(node); которую я не смог решить, собственно потому и перешел на Node*
* * List list;
* * Node* node = list.head;
* * while(node){
C++
1
2
Node* findnode(const List &list, uint ind){ 
    Node* node = list.head;
0
31 / 15 / 7
Регистрация: 08.01.2019
Сообщений: 636
07.10.2019, 21:56  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Node* findnode(const List &list, uint ind){
* * Node* node = list.head;
Цитата Сообщение от Vlast001 Посмотреть сообщение
void my_swap(List &list, int ind1, int ind2){
* * Node* n1 = findnode(list,ind1);
* * Node* n2 = findnode(list, ind2);
* * if((n1==0)||(n2==0) || (n1==n2) )
* * * * return;
* * string temp = n1.data;
* * n1->data=n2->data;
* * n2->data = temp;
* * n1->count.ind2;
* * n2->count.ind1;
}
Если так то после первого вывода списка приложение думает и ничего не показывает, приходиться нажимать ctrl+C,чтобы завершить работу
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
07.10.2019, 21:59
Цитата Сообщение от Vlast001 Посмотреть сообщение
Если так то после первого вывода списка приложение думает и ничего не показывает, приходиться нажимать ctrl+C,чтобы завершить работу
Пройдись под отладчиком и посмотри, где зависает
0
31 / 15 / 7
Регистрация: 08.01.2019
Сообщений: 636
07.10.2019, 22:03  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Пройдись под отладчиком и посмотри, где зависает


Я сделал по старинке
C++
1
2
3
4
    cout << "ky1"; // вывелось
    my_swap(list,a,b);
    cout << "ky2"; // сюда не дошло
        print(list);
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
07.10.2019, 22:07
Цитата Сообщение от Vlast001 Посмотреть сообщение
Я сделал по старинке
Поставь точку останова, F9, на первой строчке, потом запусти по F5 и иди по F10 - F11
0
31 / 15 / 7
Регистрация: 08.01.2019
Сообщений: 636
07.10.2019, 22:42  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Поставь точку останова, F9, на первой строчке, потом запусти по F5 и иди по F10 - F11
Я понял, что нужно создать проект в студии, но из этих клавиш заработала только ф5... И мне сказали, что у меня утечки памяти
0
31 / 15 / 7
Регистрация: 08.01.2019
Сообщений: 636
07.10.2019, 22:44  [ТС]
Вложение
Миниатюры
Двусвязные списки без ООП  
0
31 / 15 / 7
Регистрация: 08.01.2019
Сообщений: 636
07.10.2019, 23:11  [ТС]
Вижуал студия вообще дикая, я вроде и избавился от утечек памяти, но все ровно выводиться только первая строка
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.10.2019, 23:11

Двусвязные списки
Сформировать двусвязный список и выполнить: Структура содержит фамилию и 4 оценки. Удалить из списка неуспевающих. Наррооод!!! Спасите,...

Шаблонные двусвязные списки.
Два велосипеда из закрома ов родина. Не пропадать же добру. А поделюсь -- так может какой студиозус найдет и порадуется. #include...

Линейные двусвязные списки
Проверьте пожалуйста. 1.Дан список. Найти указатель на его последний элемент. template&lt;typename T&gt; node&lt;T&gt; *...

Указатели и двусвязные списки
Уважаемые форумчане! Учусь по книжке Страструпа для начинающих. Вот пример кода: #include &lt;iostream&gt; #include...

Очереди и Двусвязные списки!
1) Создать очередь и заполнить её случайными целыми числами из диапазона 1-100. Найти и вывести на печать: Все простые числа, количество...


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

Или воспользуйтесь поиском по форуму:
54
Ответ Создать тему
Новые блоги и статьи
Транслитерация текста с кириллицы на латиницу (вариант №3)
Maks 15.11.2026
Обновленная версия предыдущей обработки. Изменения коснулись букв: Ъ, Ы, Ь, Э, отображения которых зависят от положения реквизита "Транслитерация имён". Изменено отображение буквы Й. Добавлена. . .
Транслитерация текста с кириллицы на латиницу (вариант №2)
Maks 13.11.2026
Обновленная версия ранее созданной обработки. Добавлено: - Проверка исходного текста на кириллицу, через обращение к стандартной функции "ТолькоКириллицаВСтроке" из общего модуля. . .
Часы с термометром и праздничным календарем
yariko 12.11.2026
Сегодня мы рассмотрим как можно сделать отличные многофункциональные часы. Итак, поставим конкретную задачу: разработать часы с календарем, двумя термодатчиками, выводом поздравительных сообщений. . .
Транслитерация текста с кириллицы на латиницу (вариант №1)
Maks 11.11.2026
Решил облегчить жизнь себе и коллегам админам при создании электронных почтовых ящиков для пользователей, в результате написал обработку "Транслитерация текста" с кириллицы на латиницу, а в ней. . .
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version 1. 2003 - 06 - Designing Virtual Worlds (1st Edition) Автор: Richard A. Bartle | Объем: 768 стр. Ссылки: Amazon . . .
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров". Задача: Запрет инициалов. Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru