Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.90/107: Рейтинг темы: голосов - 107, средняя оценка - 4.90
2 / 2 / 1
Регистрация: 18.10.2010
Сообщений: 59

Слияние двух списков(срочно!)

28.10.2011, 21:25. Показов 20175. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Даны два списка, нужно их склеить. Вот, написал, но при комплияции выдаются неведомые мне ошибки. Кто-нибудь из опытных людей может мне помочь, пожалуйста?

Вот код:


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
#include <iostream>
#include <math.h>
using namespace std;
 
struct node                 //Описание первого списка
{
    int symbol;
    node *next;
};
 
struct node1                //Описание второго списка
{
    int symbol1;
    node1 *next1;
};
 
int merge(node,node1);
 
int main()
{   //Ввод первого списка
    int x;
    node *head, *elem;
    cin >> x;
    head = 0;
    while (x != 0)
    {
        node*elem = new(node);
        (*elem).symbol = x;
        (*elem).next = head;
        head = elem;
        cin >> x;
    }
 
    //Ввод второго списка
        int x1,z;
        node1 *head1, *elem1;
        cin >> x1;
        head1 = 0;
        z = x1; //Запоминаем первый элемент второго списка для последующей операции[*]
        while (x1 != 0)
        {
            node1*elem1 = new(node1);
            (*elem1).symbol1 = x1;
            (*elem1).next1 = head1;
            head1 = elem1;
            cin >> x1;
        }
 
    //Вывод первого списка
    cout << "Исходный стек №1: " << endl;
    elem = head;
    while (elem != 0)
    {
        cout << (*elem).symbol << " ";
        elem = (*elem).next;
    }
    cout << endl;
    //Вывод второго списка
    cout << "Исходный стек №2: " << endl;
            elem1 = head1;
            while (elem1 != 0)
            {
                cout << (*elem1).symbol1 << " ";
                elem1 = (*elem1).next1;
            }
 
    //Процедура слияния списков, операция[*]
            while (elem1 != z)
            {
                while (elem != 0)
                {
                    node*elem = new(node);
                    (*elem).symbol = (*elem1).symbol1;
                    (*elem).next = (*elem1).next1;
                    head = elem1;
                }
            *elem1 = (*elem1).next1;
            }
    //Вывод результат склеивания
    cout << "Результат cклеивания:" << endl;
    elem = head;
        while (elem != 0)
        {
            cout << (*elem).symbol << " ";
            elem = (*elem).next;
        }
 
 
return 0;
 
}
Сообщение комплиятора:

.\src\Home4.cpp:68: error: ISO C++ forbids comparison between pointer and integer
..\src\Home4.cpp:74: error: cannot convert `node1*' to `node*' in assignment
..\src\Home4.cpp:75: error: cannot convert `node1*' to `node*' in assignment
..\src\Home4.cpp:77: error: no match for 'operator=' in '*elem1 = elem1->node1::next1'
..\src\Home4.cpp:12: note: candidates are: node1& node1::operator=(const node1&)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
28.10.2011, 21:25
Ответы с готовыми решениями:

Слияние двух отсортированных списков
Напишите функцию List&amp; merge(List&amp; L1, List&amp; L2), добавляю- щую к упорядоченному списку L1 также упорядоченный список L2 и ...

слияние списков
помогите с написание программы!!! нужно написать программу которая объединяет два упорядоченных списка в один. Функция merge должна...

Троичное слияние списков
Задание: даны три упорядоченных списка к примеру А В С, нужно слить их в едино(список Д). Помогите кто чем сможет(код, отрезок кода,...

19
Заблокирован
28.10.2011, 21:39
Цитата Сообщение от Rancorous_1942 Посмотреть сообщение
Даны два списка, нужно их склеить. Вот, написал, но при комплияции выдаются неведомые мне ошибки. Кто-нибудь из опытных людей может мне помочь, пожалуйста?

Вот код:


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
#include <iostream>
#include <math.h>
using namespace std;
 
struct node                 //Описание первого списка
{
    int symbol;
    node *next;
};
 
struct node1                //Описание второго списка
{
    int symbol1;
    node1 *next1;
};
 
int merge(node,node1);
 
int main()
{   //Ввод первого списка
    int x;
    node *head, *elem;
    cin >> x;
    head = 0;
    while (x != 0)
    {
        node*elem = new(node);
        (*elem).symbol = x;
        (*elem).next = head;
        head = elem;
        cin >> x;
    }
 
    //Ввод второго списка
        int x1,z;
        node1 *head1, *elem1;
        cin >> x1;
        head1 = 0;
        z = x1; //Запоминаем первый элемент второго списка для последующей операции[*]
        while (x1 != 0)
        {
            node1*elem1 = new(node1);
            (*elem1).symbol1 = x1;
            (*elem1).next1 = head1;
            head1 = elem1;
            cin >> x1;
        }
 
    //Вывод первого списка
    cout << "Исходный стек №1: " << endl;
    elem = head;
    while (elem != 0)
    {
        cout << (*elem).symbol << " ";
        elem = (*elem).next;
    }
    cout << endl;
    //Вывод второго списка
    cout << "Исходный стек №2: " << endl;
            elem1 = head1;
            while (elem1 != 0)
            {
                cout << (*elem1).symbol1 << " ";
                elem1 = (*elem1).next1;
            }
 
    //Процедура слияния списков, операция[*]
            while (elem1 != z)
            {
                while (elem != 0)
                {
                    node*elem = new(node);
                    (*elem).symbol = (*elem1).symbol1;
                    (*elem).next = (*elem1).next1;
                    head = elem1;
                }
            *elem1 = (*elem1).next1;
            }
    //Вывод результат склеивания
    cout << "Результат cклеивания:" << endl;
    elem = head;
        while (elem != 0)
        {
            cout << (*elem).symbol << " ";
            elem = (*elem).next;
        }
 
 
return 0;
 
}
Сообщение комплиятора:

.\src\Home4.cpp:68: error: ISO C++ forbids comparison between pointer and integer
..\src\Home4.cpp:74: error: cannot convert `node1*' to `node*' in assignment
..\src\Home4.cpp:75: error: cannot convert `node1*' to `node*' in assignment
..\src\Home4.cpp:77: error: no match for 'operator=' in '*elem1 = elem1->node1::next1'
..\src\Home4.cpp:12: note: candidates are: node1& node1::operator=(const node1&)
Вам что надо, пере5вести на русский сообщения об ошибках?

Первое: сравнение между указателем и целочисленным типом.
Второе: не может преобразовать node1*' в `node* при выполнении оператора присваивания.
Короче говоря, вы пытаетесь выполнить присваивание переменной одного типа переменной другого типа, когда такое присваивание невозможно.

Например, в строке 69 вы сравниваете указатель с переменной целого типа

C++
1
 while (elem1 != z)
Так делать нельзя!
1
2 / 2 / 1
Регистрация: 18.10.2010
Сообщений: 59
29.10.2011, 07:18  [ТС]
А вы можете, пожалуйста, написать саму функцию слияния двух списков на основании моей программы? А то у меня уже голова не работает, 4-ый час сижу, в списках разбираюсь.

Добавлено через 18 минут
ребят, ну отзовитесь, пожалуйста...

Добавлено через 9 часов 13 минут
.....
0
1 / 1 / 0
Регистрация: 28.10.2011
Сообщений: 7
29.10.2011, 10:36
Какой алгоритм слияния? Второй список должен идти за первым? Или элементы первого и второго
должны чередоваться? Или как-то еще? Поясните, пожалуйста.
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
29.10.2011, 14:37
Rancorous_1942, сделай два списка типа struct node
разные списки всё равно придётся переделывать в одинаковые
если просто склеить их, то можно взять голову второго списка и записать в tail->next первого списка
у тебя нет tail ? сделай

C
1
2
3
struct list {
    struct node *head, *tail;
};
0
2 / 2 / 1
Регистрация: 18.10.2010
Сообщений: 59
29.10.2011, 23:56  [ТС]
Вот условие задачи:

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

Пример: 0 - конец ввода

Первый список:
1 2 3 4 0

Второй список:
-1 5 9 0

Вывод:
4 3 2 1 9 5 -1

Я читал, что стек обрабатывается сзади, поэтому и вывод соответствующий.
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
30.10.2011, 08:34
не, merge - это слияние
нужно два упорядоченных списка слить в один упорядоченный

Цитата Сообщение от Rancorous_1942
Я читал, что стек обрабатывается сзади
не сзади, а с какой-нибудь одной стороны
куда кладёшь, оттуда и снимаешь

C
1
2
3
4
5
6
7
8
struct node {
    int n;
    struct node *next;
};
 
struct stack {
    struct node *head;
};
нужны функции push() и pop()
0
2 / 2 / 1
Регистрация: 18.10.2010
Сообщений: 59
01.11.2011, 01:21  [ТС]
а подробнее, пожалуйста?
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
01.11.2011, 02:33
похоже, тут конечный автомат нужен
один из стеков может закончиться в то время, когда во втором стеке есть ещё элементы
если просто на флажках делать, получается запутанный код

C
1
2
3
4
5
6
7
8
9
10
11
    struct stack st1, st2, st3;
    
    push(st1, 4);
    push(st1, 3);
    push(st1, 2);
    push(st1, 1);
    
    push(st2, 10);
    push(st2, 9);
    push(st2, 8);
    push(st2, 7);
это подготовка стеков
0
2 / 2 / 1
Регистрация: 18.10.2010
Сообщений: 59
06.11.2011, 12:44  [ТС]
Никаких тут конечных автоматов не надо. Сам я написал слияние. Теперь такой вопрос, как сам процесс слияния сделать функцией? Только напишите, пожалуйста, готовую программу(правильно переделанную из моей).


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
#include <iostream>
#include <math.h>
using namespace std;
 
struct node                 //Описание структуры
{
        int symbol;
        node *next;
};
 
int main()
{   //Ввод первого списка
        int x;
        node *head, *elem, *head1, *elem1, *head3, *elem3;
        cin >> x;
        head = 0;
        while (x != 0)
        {
                node*elem = new(node);
                (*elem).symbol = x;
                (*elem).next = head;
                head = elem;
                cin >> x;
        }
 
        //Ввод второго списка
                int x1;
                cin >> x1;
                head1 = 0;
                while (x1 != 0)
                {
                        node*elem1 = new(node);
                        (*elem1).symbol = x1;
                        (*elem1).next = head1;
                        head1 = elem1;
                        cin >> x1;
                }
 
        //Вывод первого списка
        cout << "Исходный стек №1: " << endl;
        elem = head;
        while (elem != 0)
        {
                cout << (*elem).symbol << " ";
                elem = (*elem).next;
        }
    cout << endl;
        //Вывод второго списка
        cout << "Исходный стек №2: " << endl;
                        elem1 = head1;
                        while (elem1 != 0)
                        {
                                cout << (*elem1).symbol << " ";
                                elem1 = (*elem1).next;
                        }
                        cout << endl;
 
                        //Присоединение стека номер 1
                        head3 = 0;
                                                elem = head;
                                                while (elem != 0)
                                                {
                                                    node*elem3 = new(node);
                                                    (*elem3).symbol = (*elem).symbol;
                                                    (*elem3).next = head3;
                                                    head3 = elem3;
                                                    elem = (*elem).next;
                                                }
 
 
 
 
 
 
                        //Присоединение стека номер 2
 
                        elem1 = head1;
                        while (elem1 != 0)
                        {
                            node*elem3 = new(node);
                            (*elem3).symbol = (*elem1).symbol;
                            (*elem3).next = head3;
                            head3 = elem3;
                            elem1 = (*elem1).next;
                        }
 
 
 
                        //Вывод третьего слепленного стека
                                cout << "Полученный стек №3: " << endl;
                                                elem3 = head3;
                                                while (elem3 != 0)
                                                {
                                                        cout << (*elem3).symbol << " ";
                                                        elem3 = (*elem3).next;
                                                }
 
                                                
                      
return 0;
 
}
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
06.11.2011, 13:32
Цитата Сообщение от Rancorous_1942
Никаких тут конечных автоматов не надо. Сам я написал слияние.
Цитата Сообщение от Rancorous_1942
Объединить два упорядоченных связанных списка в один через функцию merge(функцию написать самому).
зачем сообщается, что списки упорядочены ?
это может быть нужно только для получения из них упорядоченного списка

из списков 1 2 3 4 5 и 2 4 6 должен получиться список 1 2 2 3 4 4 5 6
0
2 / 2 / 1
Регистрация: 18.10.2010
Сообщений: 59
07.11.2011, 18:55  [ТС]
Упорядоченность списков - здесь формальность. И вы не правы. Мы работает со стеками, которые обрабатываются сзади(и именно так написано в учебнике "Как программировать на С++" Дейтеля.

Поэтому, из списков(например):

2 3 4 5 0
-1 12 0

, где 0 - признак конца ввода(согласно моему коду), должно получится:

-1 12 2 3 4 5

А мне требуется написать просто функцию merge, только я не знаю как.
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
07.11.2011, 19:13
Цитата Сообщение от Rancorous_1942
Упорядоченность списков - здесь формальность.
если списки нужно просто соединить, то нет разницы, упорядочены они или нет

Цитата Сообщение от Rancorous_1942
Мы работает со стеками, которые обрабатываются сзади
для обработки сзади нужно иметь указатель tail, чтобы не прокручивать список каждый раз до конца

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

Цитата Сообщение от Rancorous_1942
C++
1
    (*elem).symbol = x;
C++
1
    elem->symbol = x;
0
2 / 2 / 1
Регистрация: 18.10.2010
Сообщений: 59
08.11.2011, 09:40  [ТС]
Вы можете просто написать, а не давать мне откровенно ненужные в данный момент советы?) Я же написал, что код полностью рабочий, можете сами проверить, у меня лишь проблема с организацией функции и все! Меня не волнует, зря я прокручиваю список сзади или нет, как написано в учебнике - я так и сделал. Если не можете помочь, то скажите, я не буду зря питать надежд.
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
08.11.2011, 09:59
Цитата Сообщение от Rancorous_1942
Я же написал, что код полностью рабочий
этот код любой новичок может написать
просто я не думаю, что Дейтел просто так написал, что списки упорядоченные
и для развития полезно их слить в упорядоченный список
0
2 / 2 / 1
Регистрация: 18.10.2010
Сообщений: 59
08.11.2011, 16:35  [ТС]
Я итак новичок. Значит, помочь вы не в силах? Понял, спасибо.
0
2 / 2 / 1
Регистрация: 18.10.2010
Сообщений: 59
10.11.2011, 18:04  [ТС]
Тут может кто-нибудь помочь?
0
2 / 2 / 1
Регистрация: 18.10.2010
Сообщений: 59
14.11.2011, 18:42  [ТС]
Всем "знатокам" "спасибо". Никто ничем так и не помог, кроме ненужных "советов". Я решил все сам.
0
 Аватар для Nikcharn
71 / 53 / 10
Регистрация: 31.07.2009
Сообщений: 149
08.02.2013, 02:10
Цитата Сообщение от Rancorous_1942 Посмотреть сообщение
Всем "знатокам" "спасибо". Никто ничем так и не помог, кроме ненужных "советов". Я решил все сам.
Дельные советы у людей были, а у Вас код и правда корявый. Если Вы планируете дальше заниматься программированием, то советую вдумываться в то, что говорят.
Например:
C++
1
2
3
4
5
6
7
8
9
10
11
struct node                 //Описание первого списка
{
    int symbol;
    node *next;
};
 
struct node1                //Описание второго списка
{
    int symbol1;
    node1 *next1;
};
Можно же написать так:
C++
1
2
3
4
5
struct node        
{
    int symbol;
    node *next;
};
И потом объявлять скажем указатель:
C++
1
2
3
4
int main() {
    node *head1, *elem1;
    node *head2, *elem2;
}
Дублировать код необязательно...
0
08.02.2013, 02:18

Не по теме:

прошло полтора года

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
08.02.2013, 02:18
Помогаю со студенческими работами здесь

Списки: реализовать слияние трёх списков в один
Подскажите пожалуйста, как реализовать слияние трёх списков в один.

Слияние двух файлов по алгоритму: цифра вставляется после двух символов
#include &lt;iostream&gt; #include &lt;io.h&gt; #include &lt;stdio.h&gt; #include &lt;windows.h&gt; #include &lt;string.h&gt; #include &lt;conio.h&gt; using...

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

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

Слияние двух векторов
Дано два одномерных массива A и B. Помогите, пожалуйста с кодом: нужно соединить их в один массив C.


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru