Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/48: Рейтинг темы: голосов - 48, средняя оценка - 4.73
1 / 1 / 0
Регистрация: 08.04.2013
Сообщений: 15

Объединение двух списков в один без повтора элементов (С++)

08.04.2013, 18:34. Показов 9342. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
нужно дописать функцию, которая делает из двух списков один (новый), в котором все элементы разные, то есть не повторяются. Спасибо!
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
#include <iostream>
using namespace std;
 
class Elem
{
public:
int num;
Elem *next;
Elem (int n) { num = n; next = NULL; };
};
 
class List
{
protected:
Elem *first, *last;
public:
Elem *current;
public:
List () { first = last = current = NULL; };
void add_element (int n);
void delete_element ();
int is_empty () { return (first == NULL); };
void start () { current = first; };
int end () { return (current == NULL); };
void next(){if (!end())current = current -> next;};
void print();
int* merge_lists(int* head1, int* head2);
};
 
int main()
{
List l;
List l2;
int k;
cout << "Введите элемент 1 списка (0,чтобы закончить):\n";
cin >> k;
while (k!=0)
{
l.add_element (k);
cout << "Введите элемент 1 списка (0,чтобы закончить):\n";
cin >> k;
};
 
cout << "Введите элемент 2 списка (0,чтобы закончить):\n";
cin >> k;
while (k!=0)
{
l2.add_element (k);
cout << Введите элемент 2 списка (0,чтобы закончить):\n";
cin >> k;
};
 
 
cout << "1 список: ";
for (l.start(); !l.end(); l.next())
{
cout << l.current->num << ' ';
}
 
cout << endl;
 
cout << "2. список: ";
for (l2.start(); !l2.end(); l2.next())
{
cout << l2.current->num << ' ';
}
 
 
return 0;
};
 
 
void List::add_element (int n)
{
Elem *p = new Elem (n);
if (first == NULL) first = last = p;
else last = last -> next = p;
current =p;
};
 
void List:elete_element ()
{
Elem *p = first;
if(!is_empty())
{
if (current == first) current = first-> next;
first = first -> next;
delete p;
if(is_empty())last = NULL;
}
};
 
void List:rint()
{
for(start(); !end(); next())
cout << current->num << endl;
cout << endl;
}
 
 
int* List::merge_lists(int* head1, int* head2)
{
//ЧТО-ТО.....
 
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
08.04.2013, 18:34
Ответы с готовыми решениями:

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

Написать программу объединение двух списков в один
1) Написать программу объединение двух списков в один. 2) Написать программу для слияние двух отсортированных списков. помогите...

Объединение двух упорядоченных списков A и B в один упорядоченный список С
Помогите, решить, пожалуйста! Даны два целочисленных списка A и B, упорядоченных по неубыванию. Объедините их в один упорядоченный...

18
 Аватар для Hellrider_
50 / 50 / 4
Регистрация: 12.03.2013
Сообщений: 171
08.04.2013, 18:46
Сравниваете в цикле эти два списка и записываете в третий что не совпало. Ну и эти списки в вектор для удобства лучше поместить.
0
1 / 1 / 0
Регистрация: 08.04.2013
Сообщений: 15
08.04.2013, 19:01  [ТС]
Можно, пожалуйста, конкретнее. Со списками у меня не очень пока получается. Если можно, код. Спасибо.
0
381 / 352 / 113
Регистрация: 17.05.2012
Сообщений: 1,049
08.04.2013, 19:16
romka_f, ну если ты написал этот код, тогда смотри, берешь значения первого элемента второго списка, и сравниваешь его с каждым элементов первого(тут можно использовать флаги(true - false) если вдруг сравнение дает true, выходишь из цикла, иначе добавляешь новый элемент в конец, вот и весь алгоритм
1
1 / 1 / 0
Регистрация: 08.04.2013
Сообщений: 15
08.04.2013, 19:40  [ТС]
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void List::merge_lists(List l, List l2)
{
    List l3;
 
    for(l.start(); l.!end(); l.next())
    {
        for(l2.start(); l2.!end(); l2.next())
        {
            if(l.current==l2.current) break;
            else l3.add_element(l1.current);
        }
    }
    return;
}
что-то типа того? или совсем не то? можете подправить, пожалуйста?
0
381 / 352 / 113
Регистрация: 17.05.2012
Сообщений: 1,049
08.04.2013, 19:47
romka_f, а вы разве сами не можете проверить?
0
1 / 1 / 0
Регистрация: 08.04.2013
Сообщений: 15
08.04.2013, 19:51  [ТС]
Проверил, не работает.
Но вроде похоже на ваш алгоритм. Беру 1 элемент 1 списка, бегу по второму, сравниваю, если такой есть, то выхожу с цикла. Если такого нету, то добавляю в конец 3 списка. Но это в теории. На деле не работает.
0
381 / 352 / 113
Регистрация: 17.05.2012
Сообщений: 1,049
08.04.2013, 20:12
romka_f, вот вам мой вариант

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
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
// obr.cpp : Defines the entry point for the console application.
//
 
#include "stdafx.h"
#include <iostream>
#include <iomanip>
#include <locale>
using namespace std;
 
struct List
{
    int data;
    List *next;
};
 
class ListNode
{
    private:
        List *Head;
 
    public:
        void operator+= (ListNode &list)
        {
            bool flag;
            List *tmp = list.Head;
 
            while(tmp != NULL)
            {
                List *tmp1 = Head;
                flag = false;
                while(tmp1 -> next!= NULL)
                {
                    if(tmp1 -> data == tmp -> data)
                    {
                        flag = true;
                        break;
                    }
 
                    tmp1 = tmp1 -> next;
                }
 
                if(flag == false)
                {
                    if(tmp1 -> data != tmp -> data)
                    {
                        List *cmp = new List;
                        cmp -> data = tmp -> data;
                        tmp1 -> next = cmp;
                        cmp -> next = NULL;
                    }
                }
 
                tmp = tmp -> next;
            }
        }
 
        ListNode()
        {
            Head = NULL;
        }
 
        void addToBack(const int value)                 //добавление в конец
        {
            List *Ptr = new List;
            Ptr -> data = value;
 
            if(Head == NULL)
            {
                Head = Ptr;
                Ptr -> next = NULL;
            }
            else
            {
                List *temp = Head;
 
                while(temp -> next != NULL)
                    temp = temp -> next;
                
                temp -> next = Ptr;
                Ptr -> next = NULL;
            }
        }
 
        void delList()
        {
            List *tmp = Head;
            List *cur = NULL;
 
            if(Head != NULL)
            {
                if(Head -> next == NULL)
                {
                    delete Head;
                    Head = NULL;
                }
                else
                {
                    while(tmp -> next != NULL)
                    {
                        cur = tmp;
                        tmp = tmp -> next;
                    }
 
                    cur -> next = NULL;
                    delete tmp;
                }
            }
        }
 
        void showList()
        {
            List *temp = Head;
 
            if(Head != NULL)
            {
                while(temp != NULL)
                {
                    cout << temp -> data << " ";
                    temp = temp -> next;
                }
            }
            else
                wcout << L"Список пуст!\n";
        }
};
 
void instructions();
void menu(ListNode &);
 
int _tmain(int argc, _TCHAR* argv[])
{
    wcout.imbue(locale(".866"));
    wcin.imbue(locale(".866"));
 
    ListNode list1, list2;
    menu(list1);
 
    menu(list2);
    
    //объединияем списки
    list1 += list2;
 
    //выведим новый список
    cout << "New List: ";
    list1.showList();
 
    cout << "\n\n";
    return 0;
}
 
void instructions()
{
    wcout << L"Выберите пункт меню: " <<
        L"\n1 - Добавить элемент в начало" <<
        L"\n2 - удалить элемент" <<
        L"\n3 - Выход.\n";
}
 
void menu(ListNode &Universal)
{
    int punkt_menu, value;
 
    instructions();
 
    do{
        wcout << L"\n? ";
            cin >> punkt_menu;
 
            switch(punkt_menu)
            {
                case 1:
                    wcout << L"Введите число: ";
                        cin >> value;
 
                    Universal.addToBack(value);
                    Universal.showList();
                    break;
                case 2:
                    Universal.delList();
                    Universal.showList();
                    break;
            }
 
    }while(punkt_menu != 3);
 
    cout << "\n";
}
2
1 / 1 / 0
Регистрация: 08.04.2013
Сообщений: 15
08.04.2013, 20:44  [ТС]
yoghurt92, спасибо большое за код. Переделал твою функцию под себя не много, но компилятор всё равно выдаёт ошибку, что функция void operator+= должна принимать 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
int main()
{
  .......
  ........
    l+=l2;
 
    cout << endl;
    cout << "3. saraksts: ";
    l.print();
}
 
void operator+= (List &list)
{
    bool flag;
    List *tmp = list.first;
 
    while(tmp != NULL)
    {
        List *tmp1 = first;
        flag = false;
        while(tmp1 -> next!= NULL)
        {
            if(tmp1 -> num == tmp -> num)
            {
                flag = true;
                break;
            }
 
            tmp1 = tmp1 -> next;
        }
 
        if(flag == false)
        {
            if(tmp1 -> num != tmp -> num)
            {
                List *cmp = new List;
                cmp -> num = tmp -> num;
                tmp1 -> next = cmp;
                cmp -> next = NULL;
            }
        }
 
        tmp = tmp -> next;
    }
}
0
381 / 352 / 113
Регистрация: 17.05.2012
Сообщений: 1,049
08.04.2013, 20:51
romka_f, а что вы переделали не пойму? покажите все и где ругается именно.
0
1 / 1 / 0
Регистрация: 08.04.2013
Сообщений: 15
08.04.2013, 20:59  [ТС]
Вот код целиком. Ошибки компилятора приложил как скриншот.
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
#include <iostream>
using namespace std;
// Klase Elem - saraksta elements
class Elem
{
public:
    int num;
    Elem *next;
    Elem (int n) { num = n; next = NULL; };
};
// Klase List - saistîts vienvirziena saraksts
class List
{
protected:
    Elem *first, *last;
public:
    Elem *current;
public:
    List () { first = last = current = NULL; };
    void add_element (int n); // pievieno beigâs
    void delete_element (); // izmet no sâkuma
    int is_empty () { return (first == NULL); };
    void start () { current = first; };
    int end () { return (current == NULL); };
    void next(){if (!end())current = current -> next;};
    void print();
    void operator+ (List &list);
};
 
int main()
{
    List l;
    List l2;
    List l3;
    int k;
    cout << "Ievadi 1. saraksta elementu (0,lai beigtu):\n";
    cin >> k;
    while (k!=0)
    {
        l.add_element (k);
        cout << "Ievadi 1. saraksta elementu (0, lai beigtu):\n";
        cin >> k;
    };
 
    cout << "Ievadi 2. saraksta elementu (0,lai beigtu):\n";
    cin >> k;
    while (k!=0)
    {
        l2.add_element (k);
        cout << "Ievadi 2. saraksta elementu (0, lai beigtu):\n";
        cin >> k;
    };
 
    //izvadam 1. un 2. saraksta elementus
    cout << "1. saraksts: ";
    l.print();
 
    cout << endl;
 
    cout << "2. saraksts: ";
    l2.print();
 
    l=l+l2;
 
    cout << endl;
    cout << "3. saraksts: ";
    l.print();
 
    while (!l.is_empty())
    {
        l.delete_element ();
    };
 
    return 0;
};
 
 
void List::add_element (int n)
{ // maina current vçrtîbu, lai râdîtu uz jauno elementu
    Elem *p = new Elem (n);
    if (first == NULL) first = last = p;
    else last = last -> next = p;
    current =p;
};
 
void List::delete_element ()
{ // saglabâ current vçrtîbu (nomaina uz sâkumu,ja râdîja uz izmetamo)
    Elem *p = first;
    if(!is_empty())
    {
        if (current == first) current = first-> next;
        first = first -> next;
        delete p;
        if(is_empty())last = NULL;
    }
};
 
void List::print()
{
    for(start(); !end(); next())
        cout << current->num << ' ';
    cout << endl;
}
 
void operator+= (List &list)
{
    bool flag;
    Elem *tmp = list.first;
 
    while(tmp != NULL)
    {
        Elem *tmp1 = first;
        flag = false;
        while(tmp1 -> next!= NULL)
        {
            if(tmp1 -> num == tmp -> num)
            {
                flag = true;
                break;
            }
 
            tmp1 = tmp1 -> next;
        }
 
        if(flag == false)
        {
            if(tmp1 -> num != tmp -> num)
            {
                Elem *cmp = new Elem;
                cmp -> num = tmp -> num;
                tmp1 -> next = cmp;
                cmp -> next = NULL;
            }
        }
 
        tmp = tmp -> next;
    }
}
Миниатюры
Объединение двух списков в один без повтора элементов (С++)  
0
381 / 352 / 113
Регистрация: 17.05.2012
Сообщений: 1,049
08.04.2013, 21:04
romka_f, вы не правильно работаете с перегруженными операторами, в вашем случае тогда нужно перегрузить оператор + и = по отдельности... оставьте мой вариант, тогда все будет работать, да и смысл не меняется от L1+=L2 и L1 = L1 + L2.
0
1 / 1 / 0
Регистрация: 08.04.2013
Сообщений: 15
08.04.2013, 21:13  [ТС]
Исправил на l+=l2;
В итоге всё равно ругается на эту строчку.
И ещё что-то не в порядке с void operator+=
Приложил коды ошибок
Миниатюры
Объединение двух списков в один без повтора элементов (С++)  
0
381 / 352 / 113
Регистрация: 17.05.2012
Сообщений: 1,049
08.04.2013, 21:20
romka_f, покажите ваш новый код, с этими ошибками.
0
1 / 1 / 0
Регистрация: 08.04.2013
Сообщений: 15
08.04.2013, 21:43  [ТС]
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
 #include <iostream>
using namespace std;
// Klase Elem - saraksta elements
class Elem
{
public:
    int num;
    Elem *next;
    Elem (int n) { num = n; next = NULL; };
};
// Klase List - saistоts vienvirziena saraksts
class List
{
protected:
    Elem *first, *last;
public:
    Elem *current;
public:
    List () { first = last = current = NULL; };
    void add_element (int n); // pievieno beigвs
    void delete_element (); // izmet no sвkuma
    int is_empty () { return (first == NULL); };
    void start () { current = first; };
    int end () { return (current == NULL); };
    void next(){if (!end())current = current -> next;};
    void print();
    void operator+ (List &list);
};
 
int main()
{
    List l;
    List l2;
    List l3;
    int k;
    cout << "Ievadi 1. saraksta elementu (0,lai beigtu):\n";
    cin >> k;
    while (k!=0)
    {
        l.add_element (k);
        cout << "Ievadi 1. saraksta elementu (0, lai beigtu):\n";
        cin >> k;
    };
 
    cout << "Ievadi 2. saraksta elementu (0,lai beigtu):\n";
    cin >> k;
    while (k!=0)
    {
        l2.add_element (k);
        cout << "Ievadi 2. saraksta elementu (0, lai beigtu):\n";
        cin >> k;
    };
 
    //izvadam 1. un 2. saraksta elementus
    cout << "1. saraksts: ";
    l.print();
 
    cout << endl;
 
    cout << "2. saraksts: ";
    l2.print();
 
    l+=l2;
 
    cout << endl;
    cout << "3. saraksts: ";
    l.print();
 
    while (!l.is_empty())
    {
        l.delete_element ();
    };
 
    return 0;
};
 
 
void List::add_element (int n)
{ // maina current vзrtоbu, lai rвdоtu uz jauno elementu
    Elem *p = new Elem (n);
    if (first == NULL) first = last = p;
    else last = last -> next = p;
    current =p;
};
 
void List::delete_element ()
{ // saglabв current vзrtоbu (nomaina uz sвkumu,ja rвdоja uz izmetamo)
    Elem *p = first;
    if(!is_empty())
    {
        if (current == first) current = first-> next;
        first = first -> next;
        delete p;
        if(is_empty())last = NULL;
    }
};
 
void List::print()
{
    for(start(); !end(); next())
        cout << current->num << ' ';
    cout << endl;
}
 
void operator+= (List &list)
{
    bool flag;
    Elem *tmp = list.first;
 
    while(tmp != NULL)
    {
        Elem *tmp1 = first;
        flag = false;
        while(tmp1 -> next!= NULL)
        {
            if(tmp1 -> num == tmp -> num)
            {
                flag = true;
                break;
            }
 
            tmp1 = tmp1 -> next;
        }
 
        if(flag == false)
        {
            if(tmp1 -> num != tmp -> num)
            {
                Elem *cmp = new Elem;
                cmp -> num = tmp -> num;
                tmp1 -> next = cmp;
                cmp -> next = NULL;
            }
        }
 
        tmp = tmp -> next;
    }
}
0
381 / 352 / 113
Регистрация: 17.05.2012
Сообщений: 1,049
08.04.2013, 21:47
Цитата Сообщение от romka_f Посмотреть сообщение
void operator+ (List &list);

нужно же

C++
1
void operator+= (List &list);
1
1 / 1 / 0
Регистрация: 08.04.2013
Сообщений: 15
09.04.2013, 22:17  [ТС]
всё равно...
error: 'void operator+= (List&)' must take exactly two arguments
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
#include <iostream>
using namespace std;
// Klase Elem - saraksta elements
class Elem
{
public:
    int num;
    Elem *next;
    Elem (int n) { num = n; next = NULL; };
};
// Klase List - saistîts vienvirziena saraksts
class List
{
protected:
    Elem *first, *last;
public:
    Elem *current;
public:
    List () { first = last = current = NULL; };
    void add_element (int n); // pievieno beigâs
    void delete_element (); // izmet no sâkuma
    int is_empty () { return (first == NULL); };
    void start () { current = first; };
    int end () { return (current == NULL); };
    void next(){if (!end())current = current -> next;};
    void print();
    void operator+= (List &list);
};
 
int main()
{
    List l;
    List l2;
    List l3;
    int k;
    cout << "Ievadi 1. saraksta elementu (0,lai beigtu):\n";
    cin >> k;
    while (k!=0)
    {
        l.add_element (k);
        cout << "Ievadi 1. saraksta elementu (0, lai beigtu):\n";
        cin >> k;
    };
 
    cout << "Ievadi 2. saraksta elementu (0,lai beigtu):\n";
    cin >> k;
    while (k!=0)
    {
        l2.add_element (k);
        cout << "Ievadi 2. saraksta elementu (0, lai beigtu):\n";
        cin >> k;
    };
 
    //izvadam 1. un 2. saraksta elementus
    cout << "1. saraksts: ";
    l.print();
 
    cout << endl;
 
    cout << "2. saraksts: ";
    l2.print();
 
    l+=l2;
 
    cout << endl;
    cout << "3. saraksts: ";
    l.print();
 
    while (!l.is_empty())
    {
        l.delete_element ();
    };
 
    return 0;
};
 
 
void List::add_element (int n)
{ // maina current vçrtîbu, lai râdîtu uz jauno elementu
    Elem *p = new Elem (n);
    if (first == NULL) first = last = p;
    else last = last -> next = p;
    current =p;
};
 
void List::delete_element ()
{ // saglabâ current vçrtîbu (nomaina uz sâkumu,ja râdîja uz izmetamo)
    Elem *p = first;
    if(!is_empty())
    {
        if (current == first) current = first-> next;
        first = first -> next;
        delete p;
        if(is_empty())last = NULL;
    }
};
 
void List::print()
{
    for(start(); !end(); next())
        cout << current->num << ' ';
    cout << endl;
}
 
 
void operator+= (List &list)
{
    bool flag;
    Elem *tmp = list.first;
 
    while(tmp != NULL)
    {
        Elem *tmp1 = first;
        flag = false;
        while(tmp1 -> next!= NULL)
        {
            if(tmp1 -> num == tmp -> num)
            {
                flag = true;
                break;
            }
 
            tmp1 = tmp1 -> next;
        }
 
        if(flag == false)
        {
            if(tmp1 -> num != tmp -> num)
            {
                Elem *cmp = new Elem;
                cmp -> num = tmp -> num;
                tmp1 -> next = cmp;
                cmp -> next = NULL;
            }
        }
 
        tmp = tmp -> next;
    }
}
0
381 / 352 / 113
Регистрация: 17.05.2012
Сообщений: 1,049
09.04.2013, 22:29
romka_f, потому что она должна быть описана внутри класса.

Добавлено через 5 минут
romka_f, вот нужно

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
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
 
class Elem
{
public:
    int num;
    Elem *next;
    Elem() {}
    Elem (int n) { num = n; next = NULL; }
};
// Klase List - saistоts vienvirziena saraksts
class List
{
protected:
    Elem *first, *last;
public:
    Elem *current;
public:
    List () { first = last = current = NULL; };
    void add_element (int n); // pievieno beigвs
    void delete_element (); // izmet no sвkuma
    int is_empty () { return (first == NULL); };
    void start () { current = first; };
    int end () { return (current == NULL); };
    void next(){if (!end())current = current -> next;};
    void print();
 
    void operator+= (List &list)
{
    bool flag;
    Elem *tmp = list.first;
 
    while(tmp != NULL)
    {
        Elem *tmp1 = first;
        flag = false;
        while(tmp1 -> next!= NULL)
        {
            if(tmp1 -> num == tmp -> num)
            {
                flag = true;
                break;
            }
 
            tmp1 = tmp1 -> next;
        }
 
        if(flag == false)
        {
            if(tmp1 -> num != tmp -> num)
            {
                Elem *cmp = new Elem;
                cmp -> num = tmp -> num;
                tmp1 -> next = cmp;
                cmp -> next = NULL;
            }
        }
 
        tmp = tmp -> next;
    }
}
};
 
int main()
{
    List l;
    List l2;
    List l3;
    int k;
    cout << "Ievadi 1. saraksta elementu (0,lai beigtu):\n";
    cin >> k;
    while (k!=0)
    {
        l.add_element (k);
        cout << "Ievadi 1. saraksta elementu (0, lai beigtu):\n";
        cin >> k;
    };
 
    cout << "Ievadi 2. saraksta elementu (0,lai beigtu):\n";
    cin >> k;
    while (k!=0)
    {
        l2.add_element (k);
        cout << "Ievadi 2. saraksta elementu (0, lai beigtu):\n";
        cin >> k;
    };
 
    //izvadam 1. un 2. saraksta elementus
    cout << "1. saraksts: ";
    l.print();
 
    cout << endl;
 
    cout << "2. saraksts: ";
    l2.print();
 
    l+=l2;
 
    cout << endl;
    cout << "3. saraksts: ";
    l.print();
 
    while (!l.is_empty())
    {
        l.delete_element ();
    };
 
    return 0;
};
 
void List::add_element (int n)
{ // maina current vзrtоbu, lai rвdоtu uz jauno elementu
    Elem *p = new Elem (n);
    if (first == NULL) first = last = p;
    else last = last -> next = p;
    current =p;
};
 
void List::delete_element ()
{ // saglabв current vзrtоbu (nomaina uz sвkumu,ja rвdоja uz izmetamo)
    Elem *p = first;
    if(!is_empty())
    {
        if (current == first) current = first-> next;
        first = first -> next;
        delete p;
        if(is_empty())last = NULL;
    }
};
 
void List::print()
{
    for(start(); !end(); next())
        cout << current->num << ' ';
    cout << endl;
}
если хотите все описывать, значит перегрузите оператор + и = по отдельности и пишите тогда L1 = L1 + L2
0
1 / 1 / 0
Регистрация: 08.04.2013
Сообщений: 15
09.04.2013, 23:24  [ТС]
Всё, заработало, заменил мой метод add_element вашим addToBack и всё пошло)
Спасибо огромное за помощь.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
09.04.2013, 23:24
Помогаю со студенческими работами здесь

Объединение двух списков без повторений
Условие задачи:Даны два списка, имеющие ненулевое пересечение. Построить список, включающий все элементы указанных двух списков без...

Организовать ввод и формирование двух вещественных списков с проверкой. Найти их объединение без повторов
Организовать ввод и формирование двух вещественных списков с проверкой. Найти их объединение без повторов. Упорядочить полученный список по...

Объединение 2 и более списков в список списков по индексу без использования циклов
Уважаемые товарищи, подскажите есть ли способ объединения 2 и более списков в список списков по индексу без использования циклов. К примеру...

Создание списка, представляющего собой объединение (по операции ИЛИ) элементов двух списков
Создание списка, представляющего собой объединение (по операции ИЛИ) элементов двух списков.

Создание списка, представляющего собой объединение (по операции ИЛИ) элементов двух списков
Создание списка, представляющего собой объединение (по операции ИЛИ) элементов двух списков.


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru