Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 31, средняя оценка - 4.65
Rancorous_1942
2 / 2 / 0
Регистрация: 18.10.2010
Сообщений: 59
#1

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

28.10.2011, 21:25. Просмотров 4606. Ответов 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.10.2011, 21:25
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Слияние двух списков(срочно!) (C++):

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

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

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

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

Слияние двух файлов по алгоритму: цифра вставляется после двух символов - C++
#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...

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Сыроежка
Заблокирован
28.10.2011, 21:39 #2
Цитата Сообщение от 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
Rancorous_1942
2 / 2 / 0
Регистрация: 18.10.2010
Сообщений: 59
29.10.2011, 07:18  [ТС] #3
А вы можете, пожалуйста, написать саму функцию слияния двух списков на основании моей программы? А то у меня уже голова не работает, 4-ый час сижу, в списках разбираюсь.

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

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

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

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

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

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

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

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

Я читал, что стек обрабатывается сзади, поэтому и вывод соответствующий.
0
accept
4822 / 3243 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
30.10.2011, 08:34 #7
не, 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
Rancorous_1942
2 / 2 / 0
Регистрация: 18.10.2010
Сообщений: 59
01.11.2011, 01:21  [ТС] #8
а подробнее, пожалуйста?
0
accept
4822 / 3243 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
01.11.2011, 02:33 #9
похоже, тут конечный автомат нужен
один из стеков может закончиться в то время, когда во втором стеке есть ещё элементы
если просто на флажках делать, получается запутанный код

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
Rancorous_1942
2 / 2 / 0
Регистрация: 18.10.2010
Сообщений: 59
06.11.2011, 12:44  [ТС] #10
Никаких тут конечных автоматов не надо. Сам я написал слияние. Теперь такой вопрос, как сам процесс слияния сделать функцией? Только напишите, пожалуйста, готовую программу(правильно переделанную из моей).


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
accept
4822 / 3243 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
06.11.2011, 13:32 #11
Цитата Сообщение от Rancorous_1942
Никаких тут конечных автоматов не надо. Сам я написал слияние.
Цитата Сообщение от Rancorous_1942
Объединить два упорядоченных связанных списка в один через функцию merge(функцию написать самому).
зачем сообщается, что списки упорядочены ?
это может быть нужно только для получения из них упорядоченного списка

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

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

2 3 4 5 0
-1 12 0

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

-1 12 2 3 4 5

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

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

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

Цитата Сообщение от Rancorous_1942
C++
1
    (*elem).symbol = x;
C++
1
    elem->symbol = x;
0
Rancorous_1942
2 / 2 / 0
Регистрация: 18.10.2010
Сообщений: 59
08.11.2011, 09:40  [ТС] #14
Вы можете просто написать, а не давать мне откровенно ненужные в данный момент советы?) Я же написал, что код полностью рабочий, можете сами проверить, у меня лишь проблема с организацией функции и все! Меня не волнует, зря я прокручиваю список сзади или нет, как написано в учебнике - я так и сделал. Если не можете помочь, то скажите, я не буду зря питать надежд.
0
accept
4822 / 3243 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
08.11.2011, 09:59 #15
Цитата Сообщение от Rancorous_1942
Я же написал, что код полностью рабочий
этот код любой новичок может написать
просто я не думаю, что Дейтел просто так написал, что списки упорядоченные
и для развития полезно их слить в упорядоченный список
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.11.2011, 09:59
Привет! Вот еще темы с ответами:

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

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

Слияние двух строк - C++
Как соединить (конкатенировать) две строки на С? Помогите, пожалуйста

Слияние двух динамических массивов… - C++
Приветствую Вас!:) Задача такая: Даны два массива: A и B (числовые), упорядоченные по неубыванию. Слить их в один упорядоченный...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
08.11.2011, 09:59
Ответ Создать тему
Опции темы

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