1 / 1 / 0
Регистрация: 08.11.2019
Сообщений: 25
1

Сортировка двусвязного списка

02.06.2020, 19:05. Показов 5249. Ответов 1
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте. Решал задание звучит так: "Создать супермаркет. Ведение записей по товарам : код , наименование , стоимость , количество и др. Реализовать функции: создание , добавление , удаление , редактирование , поиск , сортировка записей.
Формирование кассовых чеков . Реализовать функции: исключение дублирование записей в чеке , печать чека и др."

Решил делать с помощью двусвязного списка, так как мне нужно что бы в одном узле содержались два поля - указатель на продукт и количество этих продуктов. Столкнулся с проблемой, что не могу додуматься до алгоритма сортировки. Начал что-то накидывать, но кажется это бред.

Реализация списка:
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
#include "MyList.h"
 
struct Node
{
    Product* product;
    size_t count;
    Node* next;
    Node* prev;
    Node(Product* product);
    Node();
};
 
Node::Node(Product* product) : product(product), count(1), next(nullptr), prev(nullptr)
{
}
 
Node::Node() : product(nullptr), count(0), next(nullptr), prev(nullptr)
{
}
 
Node* MyList::repeat_check(const Product* product)
{
    Node* tmp = head;
    while (tmp)
    {
        if (*tmp->product == *product)
            return tmp;
        tmp = tmp->next;
    }
    return nullptr;
}
 
void MyList::swap_p(Node* left, Node* right)
{
    Node* tmp = new Node();
    tmp->next = left->next;
    tmp->prev = left->prev;
    if (head == left)
        head = right;
    if (tail == right)
        tail = left;
    left->next = right->next;
    left->prev = right->prev;
    right->next = tmp->next;
    right->prev = tmp->prev;
    delete tmp;
}
 
MyList::MyList() : head(nullptr), tail(nullptr), size(0)
{
}
 
void MyList::push_back(const Product* product)
{
    Node* tmp = new Node(const_cast<Product*>(product));
    if (!size)
    {
        head = tmp;
        tail = tmp;
        size++;
    }
    else
    {
        Node* check;
        if (check = repeat_check(product))
        {
            check->count++;
        }
        else
        {
            tail->next = tmp;
            tmp->prev = tail;
            tail = tmp;
            size++;
        }
    }
}
 
void MyList::clear()
{
    Node* tmp = head, * deleted;
    while (tmp)
    {
        deleted = tmp;
        tmp = tmp->next;
        delete deleted;
    }
}
 
void MyList::print_all() const
{
    Node* tmp = head;
    while (tmp)
    {
        cout << tmp->product->GetName() << "\t" << tmp->product->GetCost() << "\t" << tmp->product->GetWeight() << "\t" << tmp->count << endl;
        tmp = tmp->next;
    }
}
 
void MyList::sort_by_name()
{
    if (size < 2)
        return;
    Node* tmp1 = head, *tmp2 = head->next;
    while (tmp1 && tmp2)
    {
        if (tmp1->product->GetName() < tmp2->product->GetName())
            swap_p(tmp1, tmp2);
        tmp1 = tmp1->next;
        tmp2 = tmp2->next;
    }
}
 
void MyList::sort_by_cost()
{
}
 
MyList::~MyList()
{
    clear();
}

Буду очень благодарен за любую помощь.

Добавлено через 1 минуту
На всякий случай еще хедер:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#pragma once
#include "Product.h"
struct Node;
class MyList
{
    Node* head, * tail;
    size_t size;
    Node* repeat_check(const Product* product);
    void swap_p(Node* left, Node* right);
public:
    MyList();
    void push_back(const Product* product);
    void clear();
    void print_all() const;
    void sort_by_name();
    void sort_by_cost();
    ~MyList();
};
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.06.2020, 19:05
Ответы с готовыми решениями:

"Сортировка двусвязного списка путем исключения элемента с минимальным значением и включения его в начало нового списка
Здравствуйте! Возникла проблема с программой. Тема: &quot;Сортировка двусвязного списка путем исключения...

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

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

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

1
6770 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
02.06.2020, 19:43 2
Цитата Сообщение от forbidde Посмотреть сообщение
Решил делать с помощью двусвязного списка, так как мне нужно что бы в одном узле содержались два поля - указатель на продукт и количество этих продуктов. Столкнулся с проблемой, что не могу додуматься до алгоритма сортировки. Начал что-то накидывать, но кажется это бред.
Сортировка в двусвязном списке
0
02.06.2020, 19:43
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.06.2020, 19:43
Помогаю со студенческими работами здесь

Быстрая сортировка двусвязного списка
что не так?? void newsort(Offender_Node*first,Offender_Node*last) { ...

Шейкерная сортировка двусвязного списка
Здравствуйте! У меня возникла проблема с сортировкой двусвязного списка. Получилось...

Сортировка кольцевого двусвязного списка (пузырьковая)
Доброго дня! Помогите пожалуйста разобраться с сортировкой кольцевого двухсвязного списка. У меня...

Сортировка двусвязного списка, по мере поступления информации
Помогите отсортировать двусвязный список следующим образом: &quot;элементы добавлять таким образом,...

Разбитие и сортировка двусвязного списка на основе массива
Здравствуйте, может кто-нибудь помочь реализовать в этом двусвязном списке на основе массива...

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


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

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