Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.93/14: Рейтинг темы: голосов - 14, средняя оценка - 4.93
romka_f
1 / 1 / 0
Регистрация: 08.04.2013
Сообщений: 15
#1

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

08.04.2013, 18:34. Просмотров 2497. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.04.2013, 18:34
Ответы с готовыми решениями:

Объединение двух массивов в третий (без добавления дублирующихся элементов)
Итак, есть нужно объеденить 2 массива в 3й так что бы элементы которые...

Объединение двух списков
Помогите пожалуйста с решением следующей задачи. Нужно добавить функцию...

Найти объединение двух списков
Помогите мне решить задачку, я в принципе не понимаю как её решать, вот её...

Объединение (конкатенация) двух односвязных списков
Задача: Построить стек (односвязный список). Показать реализацию стека на...

Объединение двух связанных списков (нужен совет)
шаблон ListNode #pragma once // оголошення, щоб зробити другом template&lt;...

18
Hellrider_
50 / 50 / 4
Регистрация: 12.03.2013
Сообщений: 171
08.04.2013, 18:46 #2
Сравниваете в цикле эти два списка и записываете в третий что не совпало. Ну и эти списки в вектор для удобства лучше поместить.
0
romka_f
1 / 1 / 0
Регистрация: 08.04.2013
Сообщений: 15
08.04.2013, 19:01  [ТС] #3
Можно, пожалуйста, конкретнее. Со списками у меня не очень пока получается. Если можно, код. Спасибо.
0
yoghurt92
375 / 346 / 113
Регистрация: 17.05.2012
Сообщений: 1,049
08.04.2013, 19:16 #4
romka_f, ну если ты написал этот код, тогда смотри, берешь значения первого элемента второго списка, и сравниваешь его с каждым элементов первого(тут можно использовать флаги(true - false) если вдруг сравнение дает true, выходишь из цикла, иначе добавляешь новый элемент в конец, вот и весь алгоритм
1
romka_f
1 / 1 / 0
Регистрация: 08.04.2013
Сообщений: 15
08.04.2013, 19:40  [ТС] #5
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
yoghurt92
375 / 346 / 113
Регистрация: 17.05.2012
Сообщений: 1,049
08.04.2013, 19:47 #6
romka_f, а вы разве сами не можете проверить?
0
romka_f
1 / 1 / 0
Регистрация: 08.04.2013
Сообщений: 15
08.04.2013, 19:51  [ТС] #7
Проверил, не работает.
Но вроде похоже на ваш алгоритм. Беру 1 элемент 1 списка, бегу по второму, сравниваю, если такой есть, то выхожу с цикла. Если такого нету, то добавляю в конец 3 списка. Но это в теории. На деле не работает.
0
yoghurt92
375 / 346 / 113
Регистрация: 17.05.2012
Сообщений: 1,049
08.04.2013, 20:12 #8
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
romka_f
1 / 1 / 0
Регистрация: 08.04.2013
Сообщений: 15
08.04.2013, 20:44  [ТС] #9
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
yoghurt92
375 / 346 / 113
Регистрация: 17.05.2012
Сообщений: 1,049
08.04.2013, 20:51 #10
romka_f, а что вы переделали не пойму? покажите все и где ругается именно.
0
romka_f
1 / 1 / 0
Регистрация: 08.04.2013
Сообщений: 15
08.04.2013, 20:59  [ТС] #11
Вот код целиком. Ошибки компилятора приложил как скриншот.
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
Миниатюры
Объединение двух списков в один без повтора элементов (С++)  
yoghurt92
375 / 346 / 113
Регистрация: 17.05.2012
Сообщений: 1,049
08.04.2013, 21:04 #12
romka_f, вы не правильно работаете с перегруженными операторами, в вашем случае тогда нужно перегрузить оператор + и = по отдельности... оставьте мой вариант, тогда все будет работать, да и смысл не меняется от L1+=L2 и L1 = L1 + L2.
0
romka_f
1 / 1 / 0
Регистрация: 08.04.2013
Сообщений: 15
08.04.2013, 21:13  [ТС] #13
Исправил на l+=l2;
В итоге всё равно ругается на эту строчку.
И ещё что-то не в порядке с void operator+=
Приложил коды ошибок
0
Миниатюры
Объединение двух списков в один без повтора элементов (С++)  
yoghurt92
375 / 346 / 113
Регистрация: 17.05.2012
Сообщений: 1,049
08.04.2013, 21:20 #14
romka_f, покажите ваш новый код, с этими ошибками.
0
romka_f
1 / 1 / 0
Регистрация: 08.04.2013
Сообщений: 15
08.04.2013, 21:43  [ТС] #15
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
yoghurt92
375 / 346 / 113
Регистрация: 17.05.2012
Сообщений: 1,049
08.04.2013, 21:47 #16
Цитата Сообщение от romka_f Посмотреть сообщение
void operator+ (List &list);

нужно же

C++
1
void operator+= (List &list);
1
romka_f
1 / 1 / 0
Регистрация: 08.04.2013
Сообщений: 15
09.04.2013, 22:17  [ТС] #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
yoghurt92
375 / 346 / 113
Регистрация: 17.05.2012
Сообщений: 1,049
09.04.2013, 22:29 #18
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
romka_f
1 / 1 / 0
Регистрация: 08.04.2013
Сообщений: 15
09.04.2013, 23:24  [ТС] #19
Всё, заработало, заменил мой метод add_element вашим addToBack и всё пошло)
Спасибо огромное за помощь.
0
09.04.2013, 23:24
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.04.2013, 23:24

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

Шаблон класса: из двух списков создать один
Помогите найти ошибку. Текст задачи: Составить программу, которая формирует...

Объединение двух кодов в один
Здравствуйте! Недавно начал заниматься программированием, и столкнулся со...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru