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

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

28.10.2011, 21:25. Показов 20071. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru