Как реализовать перегрузку оператора "=" для односвязного списка в c++?

Пользователь

от willa_will , в категории: C/C++ , год назад

Как реализовать перегрузку оператора "=" для односвязного списка в c++?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

2 ответа

Пользователь

от elian.swift , год назад

@willa_will 

Перегрузка оператора "=" для односвязного списка в 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
#include 

struct Node {
    int data;
    Node* next;
};

class LinkedList {
private:
    Node* head;

public:
    LinkedList() {
        head = nullptr;
    }

    // Функция для добавления элементов в список
    void add(int value) {
        Node* newNode = new Node;
        newNode->data = value;
        newNode->next = nullptr;

        // Если список пустой, делаем новый узел начальным узлом
        if (head == nullptr) {
            head = newNode;
        }
        else {
            Node* temp = head;
            while (temp->next != nullptr) {
                temp = temp->next;
            }
            temp->next = newNode;
        }
    }

    // Перегрузка оператора "="
    LinkedList& operator=(const LinkedList& other) {
        // Проверка на самоприсваивание
        if (this == &other) {
            return *this;
        }

        // Удаляем существующие узлы
        while (head != nullptr) {
            Node* temp = head;
            head = head->next;
            delete temp;
        }

        // Копируем узлы из другого списка
        Node* temp = other.head;
        while (temp != nullptr) {
            add(temp->data);
            temp = temp->next;
        }

        return *this;
    }

    // Функция для вывода списка на экран
    void display() {
        Node* temp = head;
        while (temp != nullptr) {
            std::cout << temp->data << " ";
            temp = temp->next;
        }
        std::cout << std::endl;
    }
};

int main() {
    LinkedList list1;
    list1.add(1);
    list1.add(2);
    list1.add(3);

    LinkedList list2;
    list2.add(4);
    list2.add(5);

    list2 = list1; // Используется перегруженный оператор "="

    list1.display(); // Вывод: 1 2 3
    list2.display(); // Вывод: 1 2 3

    return 0;
}


В этом примере мы создали класс LinkedList, содержащий узлы список. Функция-член add используется для добавления элементов в список. Затем мы перегрузили оператор "=", который выполняет копирование одного списка в другой. Используя этот оператор в главной функции, мы копируем содержимое списка list1 в list2.

Пользователь

от ludie , 7 месяцев назад

@willa_will 

Прекрасный пример! Он иллюстрирует, как можно реализовать перегрузку оператора "=" для односвязного списка в C++. Этот пример позволяет копировать содержимое одного списка в другой, обеспечивая грамотное управление памятью и предотвращая утечки.


Не забывайте, что при перегрузке оператора "=" всегда хорошей практикой является проверка на самоприсваивание (this == &other), чтобы избежать ненужных операций копирования и потенциальных проблем с управлением памятью.


Спасибо за ваш пример!