Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 5.00
romka_f
1 / 1 / 0
Регистрация: 08.04.2013
Сообщений: 15
#1

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

08.04.2013, 18:34. Просмотров 2201. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Объединение двух списков в один без повтора элементов (С++) (C++):

Объединение двух массивов в третий (без добавления дублирующихся элементов) - C++
Итак, есть нужно объеденить 2 массива в 3й так что бы элементы которые повторяются в обоих массивах не добавлялись, т.е. a={1,2,3}...

Объединение двух списков - C++
Помогите пожалуйста с решением следующей задачи. Нужно добавить функцию для объединения двух списков. #include &lt;iostream&gt; ...

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

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

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

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

18
Hellrider_
50 / 50 / 2
Регистрация: 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
374 / 345 / 22
Регистрация: 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
374 / 345 / 22
Регистрация: 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
374 / 345 / 22
Регистрация: 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
374 / 345 / 22
Регистрация: 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
374 / 345 / 22
Регистрация: 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
374 / 345 / 22
Регистрация: 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
08.04.2013, 21:43
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.04.2013, 21:43
Привет! Вот еще темы с ответами:

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

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

Объединение 2х списков <list>, выделение уникальных элементов из них - C++
# include &lt;iostream&gt; # include &lt;string&gt; # include &lt;fstream&gt; # include &lt;list&gt; # include &lt;iterator&gt; # include &lt;algorithm&gt; ...

Объединение двух массивов в один с поиском минимума - C++
День добрый, есть задача: Заданы четыре массива {ai}, {bi}, {cj}, {dj}; i=1,2,…,n; j=1,2,…,m. Построить новые массивы по правилу:...


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

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

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