1 / 1 / 2
Регистрация: 18.11.2013
Сообщений: 337
1

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

28.04.2014, 16:36. Показов 6620. Ответов 57
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, подскажите пожалуйста, как можно создать новый список из двух других, чтобы он содержал равные элементы из двух других списков.

Добавлено через 49 секунд
Я знаю, как создать список и как в него добавить значения, но не могу понять как правильно нужно сравнить элементы все, чтобы потом их записать в третий
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
28.04.2014, 16:36
Ответы с готовыми решениями:

Создать список с указателями на поля из двух других списков
Здравствуйте. Есть два списка состоящие из структуры, как поля данных и класса, как указателей на...

Сформировать список из двух других списков и отсортировать его
Сформировать список L, включив в него положительные элементы списка L1 и отрицательные элементы...

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

Вывести список элементов, состоящий из уникальных общих элементов двух других списков
Помогите пожалуйста, срочно нужна помощь. Есть такое задание: Составить диалоговую программу,...

57
Будущее рядом
101 / 100 / 48
Регистрация: 06.03.2014
Сообщений: 342
28.04.2014, 16:51 2
ilya0610, ну как же, типа так
C++
1
2
3
elem_a = elem_a->next; elem_b = elem_b->next;
if (elem_a->data == elem_b->data)
    add(elem_a->data);
0
1 / 1 / 2
Регистрация: 18.11.2013
Сообщений: 337
28.04.2014, 17:18  [ТС] 3
C
1
2
3
elem_a = elem_a->next; elem_b = elem_b->next;
if (elem_a->data == elem_b->data)
    add(elem_a->data);
TenGen, как я понимаю здесь первая строка это указатель на следующий элемент, потом сравнивается содержимое , а потом добавление первого содержимого, или как?

Добавлено через 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
void push(multinom **pfirst)
{
    multinom *p;
    int step, kof;
    p = (multinom*)malloc(sizeof(multinom));
    p->next = *pfirst;
    *pfirst = p;
    do
    {
        printf("Enter exponent = ");
        scanf("%d", &step);
        p->step = step;
    }
    while(step < 0);
    do
    {
        printf("Enter factor = ");
        scanf("%d", &kof);
        p->kof = kof;
    }
    while(kof == 0);
    
}
C
1
2
3
4
5
6
7
typedef struct Tmultinom
{
    int step;
    int kof;
    struct Tmultinom* next;
 
}multinom;
Сможете к ней сделать?

Добавлено через 13 минут
Помогите, а то мне не кто не может помочь
0
Будущее рядом
101 / 100 / 48
Регистрация: 06.03.2014
Сообщений: 342
28.04.2014, 17:42 4
ilya0610, буду дома, попробую написать
0
1 / 1 / 2
Регистрация: 18.11.2013
Сообщений: 337
28.04.2014, 17:50  [ТС] 5
TenGen, Спасибо за помощь
0
Будущее рядом
101 / 100 / 48
Регистрация: 06.03.2014
Сообщений: 342
29.04.2014, 09:03 6
Лучший ответ Сообщение было отмечено ilya0610 как решение

Решение

ilya0610, вот программа. Тестировал у себя, работает

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
#include <stdio.h>
#include <stdlib.h>
 
/* Элемент списка */
typedef struct element
{
    int step, kof;
    struct element *next;
} elem;
 
/* Функция для создания элемента, возвращает указатель на новый элемент */
elem *create(int step, int kof)
{
    elem *tmp = (elem*)malloc(sizeof(elem));
    tmp->step = step;
    tmp->kof = kof;
    tmp->next = NULL;
    return tmp;
}
 
/* Рекурсивная чистка списка (передаем самый первый элемент) */
void delete(elem *tmp)
{
    if (tmp->next) delete(tmp->next);
    free(tmp);
}
 
/* Хедер списка (для удобства, мы же белые люди) */
typedef struct list_header
{
    elem *head, *end;
    int size;
} list;
 
/* Возвращает указатель на элемент списка с нужным индексом */
elem *item(list *tmp, int index)
{
    int i;
    if (!tmp || (index < 0 || index >= tmp->size)) return NULL;
    if (index == 0) return tmp->head;
    if (index == tmp->size-1) return tmp->end;
    elem *counter = tmp->head;
    for (i = 1; i <= index; i++) counter = counter->next;
    return counter;
}
 
/* Возвращает кол-во элементов с списке */
int size_list(list *tmp)
{
    return tmp->size;
}
 
/* Готовит хедер списка для работы */
void init_list(list *tmp)
{
    tmp->head = tmp->end = NULL;
    tmp->size = 0;
}
 
/* Добавление элемента в нужный список */
void add(list *vect, elem *tmp)
{
    if (!vect->head) vect->head = vect->end = tmp;
    else
    {
        vect->end->next = tmp;
        vect->end = tmp;
    }
    vect->size++;
}
 
int main(int argc, char *argv[])
{
    list a, b, c; int n, i; 
    init_list(&a); init_list(&b); init_list(&c);
    printf("Input count of elements:");
    scanf("%i", &n);
    /* Заполняем список А */
        printf("List A:\n");
    for (i = 0; i < n; i++)
    {
        int step, kof;
        printf("\nInput %i elem:\nstep:", (i+1));
        scanf("%i", &step);
        printf("kof:");
        scanf("%i", &kof);
        add(&a, create(step, kof));
    }
    /* Заполняем список B */
        printf("---\nList B:\n");
    for (i = 0; i < n; i++)
    {
        int step, kof;
        printf("\nInput %i elem:\nstep:", (i+1));
        scanf("%i", &step);
        printf("kof:");
        scanf("%i", &kof);
        add(&b, create(step, kof));
    }
        /* Сравниваем элементы и заносим одинаковые в список С */
    for (i = 0; i < n; i++)
    {
        elem *tmp_a = item(&a, i), *tmp_b = item(&b, i);
        if (tmp_a->step == tmp_b->step && tmp_a->kof == tmp_b->kof) add(&c, create(tmp_a->step, tmp_a->kof));
    }
    n = size_list(&c);
        /* Выводим список С */
    printf("---\nResult:\n");
    for (i = 0; i < n; i++)
    {
        elem *tmp = item(&c, i);
        printf("%i) step = %i. kof = %i\n", (i+1), tmp->step, tmp->kof);
    }
    delete(a.head); delete(b.head); delete(c.head);
    return 0;
}
1
1 / 1 / 2
Регистрация: 18.11.2013
Сообщений: 337
29.04.2014, 10:30  [ТС] 7
TenGen, если будут вопросы, а могу задать?
0
Будущее рядом
101 / 100 / 48
Регистрация: 06.03.2014
Сообщений: 342
29.04.2014, 10:37 8
ilya0610, само собой
0
1 / 1 / 2
Регистрация: 18.11.2013
Сообщений: 337
29.04.2014, 13:25  [ТС] 9
TenGen, У меня почему то с удалением хедера проблема и вообще, что такое хедер зачем он нужен? а можно сделать так что, если step равны, то записать туда равные а kof сложить?
C
1
2
3
4
5
 
elem *tmp_a = item(&a, i), *tmp_b = item(&b, i);
if (tmp_a->step == tmp_b->step) 
tmp_a->kof = tmp_a->kof + tmp_b->kof 
add(&c, create(tmp_a->step, tmp_a->kof));
0
Будущее рядом
101 / 100 / 48
Регистрация: 06.03.2014
Сообщений: 342
29.04.2014, 13:29 10
ilya0610, зачем вы удаляете хедер? Если я не ошибаюсь, он статический, под него не выделяется память в куче. Он нужен для более удобной работы со списком (то бишь он хранит указатели на начало и конец списка, а также хранит количество элементов)

можно конечно, замените код
C
1
2
3
4
elem *tmp_a = item(&a, i), *tmp_b = item(&b, i);
if (tmp_a->step == tmp_b->step) 
tmp_a->kof = tmp_a->kof + tmp_b->kof 
add(&c, create(tmp_a->step, tmp_a->kof));
на такой:
C
1
2
elem *tmp_a = item(&a, i), *tmp_b = item(&b, i);
if (tmp_a->step == tmp_b->step) add(&c, create(tmp_a->step, tmp_a->kof+tmp_b->kof));
1
1 / 1 / 2
Регистрация: 18.11.2013
Сообщений: 337
29.04.2014, 13:31  [ТС] 11
Вот проблема вот здесь
C
1
2
3
4
5
void delete(elem *tmp)
{
    if (tmp->next) delete(tmp->next);
    free(tmp);
}
Говорит, что идентификатор не определен
0
Будущее рядом
101 / 100 / 48
Регистрация: 06.03.2014
Сообщений: 342
29.04.2014, 13:35 12
ilya0610, а вы как вызываете ее? У меня все работает без проблем. Имейте в виду, функция принимает не указатель на хедер, а указатель на первый элемент списка.
И я надеюсь, вы не пытаетесь компилить это приложение как программу на с++
0
1 / 1 / 2
Регистрация: 18.11.2013
Сообщений: 337
29.04.2014, 13:45  [ТС] 13
Не не пытаюсь, а с хедером я понял, так и вправду более понятна суть работы по списком. Сейчас переделал стала запускаться, но вылетает ошибка, когда результат пишет
0
Будущее рядом
101 / 100 / 48
Регистрация: 06.03.2014
Сообщений: 342
29.04.2014, 13:47 14
ilya0610, выкладывайте код, посмотрим
0
1 / 1 / 2
Регистрация: 18.11.2013
Сообщений: 337
29.04.2014, 15:15  [ТС] 15
Добавлено через 1 час 19 минут
TenGen, все я нашел, я просто ввод неправильно делал, теперь все работает. Спасибо. Можно вас кое что попросить, я никак не могу исправить ошибку в своей программе, тоже связанная с односвязным списком, вы можете ее посмотреть?

Добавлено через 1 минуту
Или как мне лучше исправить эту, чтобы та заработала
0
Будущее рядом
101 / 100 / 48
Регистрация: 06.03.2014
Сообщений: 342
29.04.2014, 15:29 16
ilya0610, я не совсем понял...
0
1 / 1 / 2
Регистрация: 18.11.2013
Сообщений: 337
29.04.2014, 15:35  [ТС] 17
TenGen, У меня есть программа, которая я никак не могу правильно написать
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 "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
typedef struct Tmultinom
{
    int step;
    int kof;
    struct Tmultinom* next;
 
}multinom;
 
void push(multinom **pfirst);
void print(multinom *pfirst);
void push2(multinom **psecond);
void print2(multinom *psecond);
void solve(multinom *pfirst, multinom *psecond, multinom *pthree);
void print3(multinom *pthree);
 
void push(multinom **pfirst)
{
    multinom *p;
    int step, kof;
    p = (multinom*)malloc(sizeof(multinom));
    p->next = *pfirst;
    *pfirst = p;
    do
    {
        printf("Enter exponent = ");
        scanf("%d", &step);
        p->step = step;
    }
    while(step < 0);
    do
    {
        printf("Enter factor = ");
        scanf("%d", &kof);
        p->kof = kof;
    }
    while(kof == 0);
    
}
 
void print(multinom *pfirst)
{
    multinom *p;
    for(p = pfirst; p != NULL; p = p->next)
    {
        if(p->next != NULL)
        {
            if(p->step == 1)
            {
                printf("%d p + ", p->kof);
            }
            else
            {
                if(p->step == 0)
                    printf("1 + ");
                else
                    printf("%d p^ %d + ", p->kof, p->step);
            }
        }
        if(p->next == NULL)
        {
            if(p->step == 1)
            {
                printf("%d p = 0\n", p->kof);
            }
            else
            {
                if(p->step == 0)
                    printf("1 = 0\n");
                else
                    printf("%d p^ %d = 0\n", p->kof, p->step);
            }
        }   
    
    }
    
 
}
void solve(multinom *pfirst, multinom *psecond, multinom **pthree)
{
    
    multinom *pf;
    multinom *ps;
    multinom *pt;
    multinom *p;
    int step, kof;
    for(pf = pfirst; pf != NULL; pf = pf->next) 
            for(ps = psecond; ps != NULL; ps = ps->next)
                if(pf->step = ps->step)
                {
                    p = (multinom*)malloc(sizeof(multinom));
                    p->next = *pthree;
                    *pthree = p;
                    (*pthree)->kof = pfirst->kof + psecond->kof;
                    
                }
                else
                {
                    printf("\nError");
                
                }
                    
                
                
}
int _tmain(int argc, _TCHAR* argv[])
{
    multinom *pfirst = NULL;
    multinom *psecond = NULL;
    multinom *pthree = NULL;
    int i, m, j, n;
    printf("\nHow many variable = ");
        scanf("%d", &m);
 
    for(i = 0; i < m; i++)
    {
        push(&pfirst);
    }
    printf("\n");
    print(pfirst);
 
    printf("\nHow many variable = ");
    scanf("%d", &n);
    for(i = 0; i < n; i++)
    {
        push(&psecond);
    }
    printf("\n");
    print(psecond);
    solve(pfirst, psecond, &pthree);
 
    print(pthree);
    getchar();
    return 0;
}
Мб вы мне поможете ее исправить, ошибка заключается в функции solve,а никак не могу понять, как мне правильно надо сравнить step и потом выделив при этом память, создать тем самым новый список, записать в него равный step и сложенные kof

Добавлено через 1 минуту
Пытался сейчас применить к своей программе, вашу программу, но никак не получается
0
Будущее рядом
101 / 100 / 48
Регистрация: 06.03.2014
Сообщений: 342
29.04.2014, 15:52 18
ilya0610, постойте, у меня же в программе есть функция create, которая возвращает вам указатель на созданный элемент с уже забитыми числами и обнуленным указателем next. Вам не понравился мой вариант решения или я не совсем понял суть задания?
0
1 / 1 / 2
Регистрация: 18.11.2013
Сообщений: 337
29.04.2014, 16:12  [ТС] 19
TenGen, да у вас прекрасная программа, я просто к своей никак не могу применить

Добавлено через 3 минуты
TenGen, просто мне надо,, как то к своей использовать, а у меня не получается это сделать

Добавлено через 26 секунд
Я прост думаю, что вы сможете мне чем то помочь, мою исправить
0
Будущее рядом
101 / 100 / 48
Регистрация: 06.03.2014
Сообщений: 342
29.04.2014, 16:14 20
ilya0610, что бы исправить программу, я должен ее понять. А вот я откровенно теряюсь в догадках относительно вашей функции solve
0
29.04.2014, 16:14
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
29.04.2014, 16:14
Помогаю со студенческими работами здесь

написать функцию которая на основе двух списков формирует новый список в котором чередуются элементы исходных
написать функцию которая на основе двух списков формирует новый список в котором чередуются...

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

Создать список, содержащий элементы общие для двух списков, с помошью классов
разработать алгоритм программы решения задачи создания списка содержащего элементы общие для двух...

Сформировать новый массив из максимальных элементов двух других
Ввести 2 одномерных числовых массива А и В одинаковой длины и сформировать новый массив С , который...


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

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

Новые блоги и статьи
Интеграция Arduino и ChatGPT: Практическое руководство
InfoMaster 16.01.2025
В современную эпоху технологических инноваций интеграция искусственного интеллекта с микроконтроллерами открывает принципиально новые возможности для создания умных устройств и автоматизированных. . .
Как создать робота, управляемого ChatGPT
InfoMaster 16.01.2025
Концепция проекта В современную эпоху искусственный интеллект и робототехника становятся все более доступными для энтузиастов и разработчиков. Создание роботизированной руки, управляемой ChatGPT,. . .
Как создать ChatGPT бота в Telegram на Python
InfoMaster 16.01.2025
В современном мире технологии искусственного интеллекта становятся все более доступными для разработчиков, открывая новые возможности для создания умных и интерактивных приложений. Одним из самых. . .
Машинное обучение с помощью Python
InfoMaster 16.01.2025
Машинное обучение стало неотъемлемой частью современных технологий, позволяя компьютерам учиться на основе данных и принимать решения без явного программирования. В сочетании с языком. . .
Использование связки C# и PHP в корпоративной разработке и микросервисной архитектуре
InfoMaster 16.01.2025
Введение в интеграцию C# и PHP В современной корпоративной разработке все чаще возникает потребность в создании гибких и масштабируемых решений, способных эффективно решать широкий спектр. . .
Как использовать Kerio дома для управления сетью и пользователями
InfoMaster 16.01.2025
Использование технологий для улучшения повседневной жизни стало неотъемлемой частью современного быта. Одной из таких технологий является Kerio — мощный инструмент для управления сетью и. . .
Есть ли будущее у DVD и Blu-ray?
InfoMaster 16.01.2025
В эпоху стремительного развития цифровых технологий и повсеместного распространения потоковых сервисов вопрос о будущем физических носителей информации становится все более актуальным. Особенно остро. . .
Как проводить научные вычисления на Python
InfoMaster 15.01.2025
Python стал одним из наиболее востребованных языков программирования в области научных вычислений благодаря своей простоте, гибкости и обширной экосистеме специализированных библиотек. Научные. . .
Создание игры типа Minecraft на PyGame/Python: пошаговое руководство
InfoMaster 15.01.2025
В данном руководстве мы рассмотрим процесс создания игры в стиле Minecraft с использованием библиотеки PyGame на языке программирования Python. Этот проект идеально подходит как для начинающих. . .
Как создать свою первую игру в стиле Doom на Unreal Engine
InfoMaster 15.01.2025
Разработка шутера от первого лица в стиле классического Doom представляет собой увлекательное путешествие в мир игрового программирования, где сочетаются творческий подход и технические навыки. . . .
Параллельное программировани­е: основные технологии и принципы
InfoMaster 15.01.2025
Введение в параллельное программирование Параллельное программирование представляет собой фундаментальный подход к разработке программного обеспечения, который позволяет одновременно выполнять. . .
Как написать микросервис на C# с Kafka, MediatR, Redis и GitLab CI/CD
InfoMaster 15.01.2025
В современной разработке программного обеспечения микросервисная архитектура стала стандартом де-факто для создания масштабируемых и гибких приложений. Этот подход позволяет разделить сложную систему. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru