Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++
Войти
Регистрация
Восстановить пароль
 
UsualUser
0 / 0 / 0
Регистрация: 05.12.2017
Сообщений: 2
1

Объединение, пересечение и разность односвязных списков с выводом одинаковых элементов

05.12.2017, 17:43. Просмотров 177. Ответов 0
Метки нет (Все метки)

Есть 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
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
188
189
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include<iostream>
#include <cstddef>
using namespace std;
int s_union(const int* a1, int n1, const int* a2, int n2, int* a3);
int  s_intersect(const int* a1, int n1, const int* a2, int n2, int* a3);
int  s_diff(const int* a1, int n1, const int* a2, int n2, int* a3);
typedef struct Spisok {
    int info;
    struct Spisok  *next;
} Spisok;
typedef struct list {
    int data;
    struct list  *sled;
} list;
int main(void) {
    int a[100], b[100], c[200], d[100], e[100], i, N, K, n;
    Spisok *head, *curr;
    list *golova, *tek;
    cout << "Vvedite kolichestvo elementov pervogo spiska" << endl;
    cin >> N;
    head = NULL;
    cout << "Vvedite elementy pervogo spiska" << endl;
    for (i = 0; i<N; i++)
    {
        Spisok *temp = (struct Spisok*)malloc(sizeof(Spisok));
        cin >> temp->info;
        temp->next = head;
        head = temp;
    }
    Spisok * p = NULL;
    curr = head;
    if (curr != NULL)
    {
//сортировка по возрастанию
        while (curr->next != NULL)\\
        {
            p = curr->next;
            do {
                if (p->info < curr->info) {
                    int tmp = p->info;
                    p->info = curr->info;
                    curr->info = tmp;
                }
 
                p = p->next;
            } while (p != NULL);
            curr = curr->next;
        }
    }
    curr = head;
    cout << "Vash otsortirovanniy perviy spisok" << endl; \
    i = 0;
    while (i<N)
    {
        a[i ] = curr->info;
        cout << curr->info << " ";
        curr = curr->next;
        i++;
    }
    cout << endl;
 
    cout << "Vvedite kolichestvo elementov vtorogo spiska" << endl;
    cin >> K;
    golova = NULL;
    cout << "Vvedite elementy vtorogo spiska" << endl;
    for (i = 0; i<K; i++)
    {
        list *tmp = (struct list *)malloc(sizeof(list));
        cin >> tmp->data;
        tmp->sled = golova;
        golova = tmp;
    }
    list  * q = NULL;
    tek = golova;
    if (tek != NULL)
    {
        while (tek->sled != NULL)
        {
            q = tek->sled;
            do {
                if (q->data < tek->data) {
                    int tmp = q->data;
                    q->data = tek->data;
                    tek->data = tmp;
                }
 
                q = q->sled;
            } while (q != NULL);
            tek= tek->sled;
        }
    }
    tek = golova;
    cout << "Vash otsortirovanniy vtoroy spisok" << endl;
    i = 0;
    while (i<K)
    {
        b[ i] = tek->data;
        cout <<tek->data << " ";
        tek= tek->sled;
        i++;
    }
    cout << endl;
 
    n = s_union(a, N, b, K, c);
//объединение списков, функция ниже
    cout << "Obedinenie spiskov" << endl;
    for (int i = 0; i < n; i++)
        std::cout << c[i] << ' ';
    std::cout << std::endl;
 
    n = s_intersect(a, N, b, K, c);
    cout << "Peresechenie spiskov" << endl;
    for (int i = 0; i < n; i++)
        std::cout << c[i] << ' ';
    std::cout << std::endl;
    cout << "Raznost spiskov" << endl;
    n = s_diff(a, N, b, K, c);
    for (int i = 0; i < n; i++)
        std::cout << c[i] << ' ';
    cout << endl;
    system("pause");
    return 0;
}
 
//объединение множеств
int s_union(const int* a1, int n1, const int* a2, int n2, int* a3) {
    const int* e1 = a1 + n1;
    const int* e2 = a2 + n2;
    int*  p = a3;
 
    while ((a1 != e1) && (a2 != e2)) {
        if (*a1 < *a2)
            *p++ = *a1++;
        else if (*a2 < *a1)
            *p++ = *a2++;
        else {
            *p++ = *a1;
            ++a1;
            ++a2;
        }
    }
 
    while (a1 != e1)
        *p++ = *a1++;
    while (a2 != e2)
        *p++ = *a2++;
 
    return (p - a3);
}
 
// пересечение множеств
int  s_intersect(const int* a1, int n1, const int* a2, int n2, int* a3) {
    const int* e1 = a1 + n1;
    const int* e2 = a2 + n2;
    int*  p = a3;
    while ((a1 != e1) && (a2 != e2)) {
        if (*a1 < *a2)
            *a1++;
        else if (*a2 < *a1)
            *a2++;
        else {
            *p++ = *a1;
            ++a1;
            ++a2;
        }
    }
    return (p - a3);
}
 
// разность множеств
int  s_diff(const int* a1, int n1, const int* a2, int n2, int* a3) {
    const int* e1 = a1 + n1;
    const int* e2 = a2 + n2;
    int*  p = a3;
    while ((a1 != e1) && (a2 != e2)) {
        if (*a1 < *a2)
            *p++ = *a1++;
        else if (*a2 < *a1)
            ++a2;
        else {
            ++a1;
            ++a2;
        }
    }
    return (p - a3);
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.12.2017, 17:43
Ответы с готовыми решениями:

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

Объединение списков
Дано: - большое количество файлов со строками - строки не повторяются в...

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

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

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

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.12.2017, 17:43

Найти пересечение, объединение, разность, симметрическую разность множеств
Задание: Написать программу, которая проделывается операции над множествами...

Объединение, пересечение, разность, симметрическая разность множеств
Составить множество А из букв фамилии, множество В – из букв имени, множество С...

Реализовать объединение, пересечение и разность списков
Реализовать объединение,пересечение и разность списков(2 случая: 1. линейный...


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

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

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