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

Объединение двух списков в один с общими элементами

05.05.2021, 22:28. Показов 1116. Ответов 7
Метки c++ (Все метки)

Author24 — интернет-сервис помощи студентам
Ребят, помогите пожалуйста.
Само задание: Написать программу, содержащую процедуру, которая формирует список M, включив в него по одному разу элементы, которые входят одновременно в оба списка M1 и M2.

В чём проблема. Функция есть (unification), но работает она некорректно. Например, в первом списке 4 нуля, а во втором 2 нуля. тогда в списке M должно быть записано 2 нуля, но у меня запишутся все 4, так как ищу элементы из 1-го списка во 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
#include <iostream>
#include <ctime>
#define sizee 10
using namespace std;
 
struct listnode{
    int value;
    listnode *next;
};
 
listnode *list_createnode (int value){
    listnode *p = new listnode;
    if (p!= NULL){
 
        p->value = value;
        p->next = NULL;
    }
    return p;
}
 
listnode *addElem (listnode *lst, int value){
    listnode *temp, *p;
    temp = new listnode;
    p = lst->next;
    lst->next = temp;
    temp-> value = value; 
    temp->next = p;
    return temp;
}
 
void listprint (listnode *lst){
    listnode *p = lst;
    do {
        cout<<p->value<<" ";
        p = p->next;
    }while (p != NULL);
}
 
listnode *list_lookup (listnode *list, int value){
    for (; list!=NULL; list = list->next){
        if (list->value == value){
            return list;                    //seccess
        } 
    }
    return NULL; //not found
}
 
listnode *list_delete (listnode *list, int value){
    listnode *p, *prev = NULL;
    for (p = list; p!= NULL; p = p->next){
        if (p->value == value){
            if (prev == NULL){
                list  = p->next;      //delete head
            }else {
                prev->next = p->next;   //element on the left side
            }
            delete (p);       //free memory
            return list;       //pointer to new head
        }
        prev = p;          //remember previosly element
    }
    return NULL;   //not found
}
 
void digits (int *array, int *digits){
    for (int i=0; i<10; i++){
        for (int j=0; j<sizee; j++){
            if (array[j] == i){
                digits[i]++;
            }
        }
    }
}
 
void sort (int *(&array), int size){
    for (int i=0; i<size; i++){
        for (int j=i+1; j<size; j++){
            if (array[i] > array[j]){
                int temp = array[j];
                array[j] = array[i];
                array[i] = temp;
            }
        }
    }
}
 
listnode *unification (listnode *lst1, listnode *lst2, listnode *lst){
    listnode *check1, *check2;
    lst = list_createnode (0);
    for (; lst1 != NULL; lst1 = lst1->next){
        check1 = list_lookup (lst2, lst1->value);
        if (check1 != NULL){
            addElem (lst, lst1->value);
        }
    }
    return lst;
}
 
int main() {
    srand (time(0));
    listnode *node;
    listnode *node1;
    listnode *node2;
    int *array1 = new int [sizee], *array2 = new int [sizee];
    for (int i=0; i<sizee; i++){
        array1[i] = rand() % 10;
        array2[i] = rand() % 10;
    }
    node1 = list_createnode (array1[0]);
    node2 = list_createnode (array2[0]);
    for (int i=1; i<sizee; i++){
        addElem (node1, array1[i]);
        addElem (node2, array2[i]);
    }
    cout<<"Your elements: "<<endl;
    cout<<"List 1"<<endl;
    listprint (node1);
    cout<<"\nList 2"<<endl;
    listprint (node2);
 
    node = unification (node1, node2, node);
    cout<<"\nResult list: "<< endl;
    listnode *p = list_delete (node,0);
    if (p != NULL){
        node = p;     //pointer to new head
    }
    listprint (node);
 
    int _digits1[10] = {0}, _digits2[10] = {0};
    digits (array1, _digits1);
    digits (array2, _digits2);
    sort (array1, sizee);
    sort (array2, sizee);
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.05.2021, 22:28
Ответы с готовыми решениями:

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

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

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

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

7
0 / 0 / 0
Регистрация: 05.05.2021
Сообщений: 1
05.05.2021, 22:37 2
Бог тебе в помощь!
0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
05.05.2021, 22:52 3
Цитата Сообщение от Kotsik Посмотреть сообщение
В чём проблема. Функция есть (unification), но работает она некорректно. Например, в первом списке 4 нуля, а во втором 2 нуля. тогда в списке M должно быть записано 2 нуля, но у меня
Для начала - оба исходных списка должны быть отсортированы по-возрастанию. Это так?
0
Комп_Оратор)
Эксперт по математике/физике
8949 / 4703 / 629
Регистрация: 04.12.2011
Сообщений: 13,999
Записей в блоге: 16
05.05.2021, 23:39 4
Цитата Сообщение от Kotsik Посмотреть сообщение
Само задание: Написать программу, содержащую процедуру, которая формирует список M, включив в него по одному разу элементы, которые входят одновременно в оба списка M1 и M2.
Kotsik, в задании нет задачи создать сам по себе список (контейнер). Это логично так как иначе оно выглядело бы как "1. Построить хлеб завод, 2. Выпечь хлеб, 3. Завести продукт в магазин. 4. Пойти за хлебом и подарить продавщице бублик."
Список есть в стандартной библиотеке. Я бы создал три списка целых чисел. Два заполнил бы тестовыми наборами значений. Тестовые наборы содержат одинаковые значения среди прочих. А третий - пустой, заполнял бы идя по самому длинному из 2 предыдущих и проверяя:
1. есть ли во втором исходном списке повтор
2. есть ли такое значение в результирующем (не было ли оно добавлено ранее).
При этом задание допускает повторы и в пределах каждого из исходных списков, кстати.
1
0 / 0 / 0
Регистрация: 05.05.2021
Сообщений: 3
06.05.2021, 00:17  [ТС] 5
Библиотеку использовать нельзя. Это оговорка препода.

Добавлено через 1 минуту
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Для начала - оба исходных списка должны быть отсортированы по-возрастанию. Это так?
Для начала - оба исходных списка должны быть отсортированы по-возрастанию. Это так?
В условии это не оговорено

Добавлено через 2 минуты
Цитата Сообщение от IGPIGP Посмотреть сообщение
Kotsik, в задании нет задачи создать сам по себе список (контейнер). Это логично так как иначе оно выглядело бы как "1. Построить хлеб завод, 2. Выпечь хлеб, 3. Завести продукт в магазин. 4. Пойти за хлебом и подарить продавщице бублик."
Список есть в стандартной библиотеке. Я бы создал три списка целых чисел. Два заполнил бы тестовыми наборами значений. Тестовые наборы содержат одинаковые значения среди прочих. А третий - пустой, заполнял бы идя по самому длинному из 2 предыдущих и проверяя:
1. есть ли во втором исходном списке повтор
2. есть ли такое значение в результирующем (не было ли оно добавлено ранее).
При этом задание допускает повторы и в пределах каждого из исходных списков, кстати.
Да, повторы возможны. Вы написали условия добавления, а что делать при их выполнении? Добавлять соответственно в третий - результирующий - список
0
Комп_Оратор)
Эксперт по математике/физике
8949 / 4703 / 629
Регистрация: 04.12.2011
Сообщений: 13,999
Записей в блоге: 16
06.05.2021, 00:33 6
Цитата Сообщение от Kotsik Посмотреть сообщение
а что делать при их выполнении?
Цитата Сообщение от Kotsik Посмотреть сообщение
А третий - пустой, заполнял бы идя по самому длинному из 2 предыдущих и проверяя:
Впрочем вы сами ответили на свой вопрос. Хотя я это написал. Грустно вот что:
Цитата Сообщение от Kotsik Посмотреть сообщение
Библиотеку использовать нельзя. Это оговорка препода.
В вашем задании (как вы упорно утверждаете, но в тексте этого нет) совмещены ортогональные задачи. Создание контейнера - списка. И задача работы со списками, которая мало зависит (вообще не зависит) от реализации списка.
Kotsik,
Цитата Сообщение от Kotsik Посмотреть сообщение
Функция есть (unification), но работает она некорректно. Например, в первом списке 4 нуля, а во втором 2 нуля. тогда в списке M должно быть записано 2 нуля, но у меня запишутся все 4
не стыкуется с условием, всё едино. Если:
Цитата Сообщение от Kotsik Посмотреть сообщение
процедуру, которая формирует список M, включив в него по одному разу элементы, которые входят одновременно в оба списка M1 и M2.
То ноль должен быть в результирующем списке M единожды. Думаю, если решать такие задачи, то научиться не судьба. Локальность, модульность, "разделяй и властвуй", это о мухах и котлетах. Не получится качественно понять поиск, сортировку, операции множеств (объденение, пересечение, вычитание и пр.), работу с графами вообще и деревьями в частности и тп. соединяя всё в кучу.
1
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
06.05.2021, 09:49 7
Цитата Сообщение от Kotsik Посмотреть сообщение
Для начала - оба исходных списка должны быть отсортированы по-возрастанию. Это так?
В условии это не оговорено
Эта задача эффективно решается только для сортированных последовательностей. Для неотсортированных сложность алгоритма будет N-квадрат, а то и больше.
1
0 / 0 / 0
Регистрация: 05.05.2021
Сообщений: 3
06.05.2021, 10:48  [ТС] 8
Благодарю вас за информацию и пояснения.

Добавлено через 40 минут
Всё получилось. Я очень невнимательный. В условии написано, что элементы должны быть включены единожды. Спасибо ещё раз всем за инфу.
По итогу, функция объединения у меня выглядит так.
C++
1
2
3
4
5
6
7
8
9
10
11
listnode *unification (listnode *lst1, listnode *lst2, listnode *lst){
    lst = list_createnode (15);
    for (; lst1 != NULL; lst1 = lst1->next){
        if (list_lookup (lst2, lst1->value) != NULL){
            if (list_lookup (lst, lst1->value) == NULL){
                addElem (lst, lst1->value);
            }
        }
    }
    return lst;
}
0
06.05.2021, 10:48
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.05.2021, 10:48
Помогаю со студенческими работами здесь

Объединение двух списков в один без повтора элементов (С++)
нужно дописать функцию, которая делает из двух списков один (новый), в котором все элементы разные,...

Вывести сумму неповторяющихся элементов, являющихся общими для данных двух списков.
Написать функцию , которая принимает два списка и выводит сумму неповторяющихся элементов,...

Заполнить третий стек общими элементами для первых двух стеков
Даны два стека и необходимо заполнить третий общими элементами для первый двух. Не знаю как...

Как из двух списков сделать один список кортежей/списков
Доброго времени суток! Буду очень благодарен, если поможете из двух списков, к примеру a и b,...

Объединение списков в один
Ввести с клавиатуры два списка, содержащих 10 и 5 элементов. Объединить их в один список, включив...

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


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru