С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
СергейАС
1 / 1 / 1
Регистрация: 02.02.2012
Сообщений: 73
#1

Списки: реализовать слияние трёх списков в один - C++

21.10.2012, 14:45. Просмотров 762. Ответов 13
Метки нет (Все метки)

Подскажите пожалуйста, как реализовать слияние трёх списков в один.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.10.2012, 14:45
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Списки: реализовать слияние трёх списков в один (C++):

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

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

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

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

Списки.Создание списков - C++
Помогите с программой ,пожалуйста)Нужно составить список.Я вроде все правильно делаю а компилятор ругается на какую то фигню( #include...

Сбой данных. Списки списков. - C++
В общем вот код. #include <iostream> #include <locale> #include <string> #include <conio.h> #include <math.h> using...

13
ExcellencE
20 / 20 / 2
Регистрация: 22.08.2011
Сообщений: 79
23.10.2012, 13:01 #2
Элементарно! Кидаешь указатель с начала третьего списка в конец второго, а с начала второго в конец первого
0
СергейАС
1 / 1 / 1
Регистрация: 02.02.2012
Сообщений: 73
23.10.2012, 13:11  [ТС] #3
Т.е. например, если у меня есть списки L и P, то чтобы их слить нужно L->next=P?
0
Pure
228 / 49 / 2
Регистрация: 13.03.2012
Сообщений: 453
Записей в блоге: 7
23.10.2012, 13:14 #4
воспользоваться стандартными средствами языка С++, таким как splice. STL это такая вещь, которую каждый С++ программист знать просто обязан, поэтому лучше изучить стандарнтные вещи и использовать их
0
СергейАС
1 / 1 / 1
Регистрация: 02.02.2012
Сообщений: 73
23.10.2012, 13:16  [ТС] #5
Но мне нужно это сделать без классов
0
Pure
228 / 49 / 2
Регистрация: 13.03.2012
Сообщений: 453
Записей в блоге: 7
23.10.2012, 13:21 #6
СергейАС, принцип будет таков

1. определить конец первого списка - концом должен быть пустой элемент следующий за последним несущим информацию.
2. присвоить этому указателю - указатель на начало второго списка L1->end = L2->begin;
3. определить конец второго списка
4. присвоить этому указателю укзатель на начало третьего списка. L2->end = L3->begin;

Но вот что интересно. А как организовать контейнер без использования классов или структур? Это будет некий набор стековых переменных внутри функции? Такое списком можно с трудом назвать.
0
ExcellencE
20 / 20 / 2
Регистрация: 22.08.2011
Сообщений: 79
23.10.2012, 13:31 #7
Pure, у этой темы есть дубль, только с кодом) структуры он использует, и вроде как на верном пути
0
СергейАС
1 / 1 / 1
Регистрация: 02.02.2012
Сообщений: 73
23.10.2012, 13:33  [ТС] #8
Ну вот я ввожу 3 списка:
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
140
141
142
143
144
145
146
147
148
149
150
151
#include "stdafx.h"
#include <list>
#include "iostream"
#include <stdio.h>
#include <conio.h>
#include<iostream>
#include<cmath>
 
using namespace System;
 
struct list
{
    int inf;
    list* next;
};
 
list* sp1_create();
list* sp2_create();
list* sp3_create();
list* sp4_create();
void print(list*L);
list* del(list*L);
 
int main()
{
    int n;
    list* F1;
    list* F2;
    list* F3;
    list* p;
    F1=sp1_create();
    F2=sp2_create();
    F3=sp3_create();
    Console::WriteLine(L"Полученные списки: ");
    print(F1);
    print(F2);
    print(F3);
    p=del(F1);
    p=del(F2);
    p=del(F3);
    system("Pause");
    return 0;
}
 
list* sp1_create()
{
 
   list *start,*new_link1,*new_link2,*new_link3,*end;
    int n;
    Console::WriteLine(L"Введите размер списка 1: ");
    scanf("%d",&n);
    end = start = NULL;
    for (int i = 0; i < n; i++)
    {
        new_link1 = new list();
        Console::WriteLine(L"Введите элемент списка:");
        scanf("%d",&new_link1->inf);
        if(new_link1->inf->start<new_link1->inf->end)
            Console::WriteLine(L"Упорядоченный");
        else
            Console::WriteLine(L"Неупорядоченный");
        if (!i)
            start = end = new_link1;
        else
        {
            end->next = new_link1;
            end = end->next;
        }
    }
     end->next = NULL;
     end = end->next;
    return start;
}
 
list* sp2_create()
{
 
   list *start,*new_link1,*new_link2,*new_link3,*end;
    int n;
    Console::WriteLine(L"Введите размер списка 2: ");
    scanf("%d",&n);
    end = start = NULL;
    for (int i = 0; i < n; i++)
    {
        new_link2 = new list();
        Console::WriteLine(L"Введите элемент списка:");
        scanf("%d",&new_link2->inf);
        if(new_link2->inf->start<new_link2->inf->end)
            Console::WriteLine(L"Упорядоченный");
        else
            Console::WriteLine(L"Неупорядоченный");
        if (!i)
            start = end = new_link2;
        else
        {
            end->next = new_link2;
            end = end->next;
        }
    }
     end->next = NULL;
     end = end->next;
    return start;
}
 
list* sp3_create()
{
 
   list *start,*new_link1,*new_link2,*new_link3,*end;
    int n;
    Console::WriteLine(L"Введите размер списка 3: ");
    scanf("%d",&n);
    end = start = NULL;
    for (int i = 0; i < n; i++)
    {
        new_link3 = new list();
        Console::WriteLine(L"Введите элемент списка:");
        scanf("%d",&new_link3->inf);
        if(new_link3->inf->start<new_link3->inf->end)
            Console::WriteLine(L"Упорядоченный");
        else
            Console::WriteLine(L"Неупорядоченный");
        if (!i)
            start = end = new_link3;
        else
        {
            end->next = new_link3;
            end = end->next;
        }
    }
     end->next = NULL;
     end = end->next;
    return start;
}
 
void print(list *L)
{ 
    for (; L; L=L->next)
    std::cout <<L->inf << ' ';
  std::cout << '\n';
 
}
list* del(list*L)
{ 
    list*p;
    for (int i=1; L; L=L->next,i++)
    {
        if(i==3)
            p=L;
    }
    return p;
}
Покажите пожалуйста на этом примере как это сделать
0
Pure
228 / 49 / 2
Регистрация: 13.03.2012
Сообщений: 453
Записей в блоге: 7
23.10.2012, 13:49 #9
C++
1
2
3
4
5
6
7
8
9
void merge_list(list *start, list *lst)
{
list* end = start;
while(end)
end = end->next; //находим конец первого списка
end = lst; //этому указателю, который ==0,
//присваиваем указатель lst, указывающий на начало второго списка
 
}

C++
1
2
3
4
int main()
{
merge_list(F1,F2);
}
F1 - теперь начало объединенного списка
0
СергейАС
1 / 1 / 1
Регистрация: 02.02.2012
Сообщений: 73
23.10.2012, 13:53  [ТС] #10
C++
1
F2=merge_list(F2,F3)
Это тогда объединение первых 2-х списков и 3-го?
0
Pure
228 / 49 / 2
Регистрация: 13.03.2012
Сообщений: 453
Записей в блоге: 7
23.10.2012, 13:55 #11
СергейАС,

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void merge_list(list *start, list *lst)
{
list* end = start;
while(end)
end = end->next; //находим конец первого списка
end = lst; //этому указателю, который ==0,
//присваиваем указатель lst, указывающий на начало второго списка
 
}
 
int main()
{
merge_list(F1,F2); //1+2
merge_list(F1,F3);//1+3
//F1 = (F1+F2) + F3
 
}
что то ты не хочешь вникать по моему даже в свой код.
0
СергейАС
1 / 1 / 1
Регистрация: 02.02.2012
Сообщений: 73
23.10.2012, 13:58  [ТС] #12
И ещё один вопрос: как вывести полученный список?
0
Pure
228 / 49 / 2
Регистрация: 13.03.2012
Сообщений: 453
Записей в блоге: 7
23.10.2012, 14:00 #13
СергейАС, твой код

void print(list *L)
{
for (; L; L=L->next)
std::cout <<L->inf << ' ';
std::cout << '\n';

}
сделает это
1
СергейАС
1 / 1 / 1
Регистрация: 02.02.2012
Сообщений: 73
23.10.2012, 14:14  [ТС] #14
Код в конечном виде будет таким?
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
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
// lab3.cpp: главный файл проекта.
/*Создать новый список из элементов трёх списков так, чтобы
получился упорядоченный список(выполнить слияние списков)*/
 
#include "stdafx.h"
#include <list>
#include "iostream"
#include <stdio.h>
#include <conio.h>
#include<iostream>
#include<cmath>
 
using namespace System;
 
struct list
{
    int inf;
    list* next;
};
 
list* sp1_create();
list* sp2_create();
list* sp3_create();
void print(list*L);
void merge_list(list *start, list *lst);
list* del(list*L);
 
int main()
{
    int n;
    list* F1;
    list* F2;
    list* F3;
    list* p;
    F1=sp1_create();
    F2=sp2_create();
    F3=sp3_create();
    Console::WriteLine(L"Полученные списки: ");
    print(F1);
    print(F2);
    print(F3);
    merge_list(F1,F2);
    merge_list(F1,F3);
    Console::WriteLine(L"Полученный список: ");
    print(F1);
    p=del(F1);
    p=del(F2);
    p=del(F3);
    system("Pause");
    return 0;
}
 
list* sp1_create()
{
 
   list *start,*new_link1,*new_link2,*new_link3,*end;
    int n;
    Console::WriteLine(L"Введите размер списка 1: ");
    scanf("%d",&n);
    end = start = NULL;
    for (int i = 0; i < n; i++)
    {
        new_link1 = new list();
        Console::WriteLine(L"Введите элемент списка:");
        scanf("%d",&new_link1->inf);
        if (!i)
            start = end = new_link1;
        else
        {
            end->next = new_link1;
            end = end->next;
        }
    }
     end->next = NULL;
     end = end->next;
    return start;
}
 
list* sp2_create()
{
 
   list *start,*new_link1,*new_link2,*new_link3,*end;
    int n;
    Console::WriteLine(L"Введите размер списка 2: ");
    scanf("%d",&n);
    end = start = NULL;
    for (int i = 0; i < n; i++)
    {
        new_link2 = new list();
        Console::WriteLine(L"Введите элемент списка:");
        scanf("%d",&new_link2->inf);
        if (!i)
            start = end = new_link2;
        else
        {
            end->next = new_link2;
            end = end->next;
        }
    }
     end->next = NULL;
     end = end->next;
    return start;
}
 
list* sp3_create()
{
 
   list *start,*new_link1,*new_link2,*new_link3,*end;
    int n;
    Console::WriteLine(L"Введите размер списка 3: ");
    scanf("%d",&n);
    end = start = NULL;
    for (int i = 0; i < n; i++)
    {
        new_link3 = new list();
        Console::WriteLine(L"Введите элемент списка:");
        scanf("%d",&new_link3->inf);
        if (!i)
            start = end = new_link3;
        else
        {
            end->next = new_link3;
            end = end->next;
        }
    }
     end->next = NULL;
     end = end->next;
    return start;
}
 
void print(list *L)
{ 
    for (; L; L=L->next)
    std::cout <<L->inf << ' ';
  std::cout << '\n';
 
}
list* del(list*L)
{ 
    list*p;
    for (int i=1; L; L=L->next,i++)
    {
        if(i==3)
            p=L;
    }
    return p;
}
void merge_list(list *start, list *lst)
{
    list* end = start;
    while(end)
        end = end->next;
    end = lst; 
}
0
23.10.2012, 14:14
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.10.2012, 14:14
Привет! Вот еще темы с ответами:

Кольцевые списки на базе двунаправленных списков - C++
Всем привет! Помогите решить задачу: Пусть L обозначает кольцевой двунаправленный список с включенным заглавным звеном. Написать функцию...

Слияние из двух массивов в один общий - C++
Требуется соединить два массива в один есть сложность что они считаны с файла... помогите объединить два массива в один и вывести его на...

Слияние двух отсортированых массивов в один - C++
задание: Задано два массива. Массив А состоит из N элементов и отсортированный по увеличению . Массив В состоит из N элементов и...

Линейные списки. Создание списков на основе имеющегося - C++
Всем привет! Есть задача: используя линейные списки создать функции: 1. Создания списка, элементы которого будут вводиться с клавиатуры...


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

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

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