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

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

Восстановить пароль Регистрация
 
СергейАС
1 / 1 / 1
Регистрация: 02.02.2012
Сообщений: 73
21.10.2012, 14:45     Списки: реализовать слияние трёх списков в один #1
Подскажите пожалуйста, как реализовать слияние трёх списков в один.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.10.2012, 14:45     Списки: реализовать слияние трёх списков в один
Посмотрите здесь:

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

Но вот что интересно. А как организовать контейнер без использования классов или структур? Это будет некий набор стековых переменных внутри функции? Такое списком можно с трудом назвать.
ExcellencE
20 / 20 / 2
Регистрация: 22.08.2011
Сообщений: 79
23.10.2012, 13:31     Списки: реализовать слияние трёх списков в один #7
Pure, у этой темы есть дубль, только с кодом) структуры он использует, и вроде как на верном пути
СергейАС
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;
}
Покажите пожалуйста на этом примере как это сделать
Pure
 Аватар для 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 - теперь начало объединенного списка
СергейАС
1 / 1 / 1
Регистрация: 02.02.2012
Сообщений: 73
23.10.2012, 13:53  [ТС]     Списки: реализовать слияние трёх списков в один #10
C++
1
F2=merge_list(F2,F3)
Это тогда объединение первых 2-х списков и 3-го?
Pure
 Аватар для 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
 
}
что то ты не хочешь вникать по моему даже в свой код.
СергейАС
1 / 1 / 1
Регистрация: 02.02.2012
Сообщений: 73
23.10.2012, 13:58  [ТС]     Списки: реализовать слияние трёх списков в один #12
И ещё один вопрос: как вывести полученный список?
Pure
 Аватар для 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';

}
сделает это
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.10.2012, 14:14     Списки: реализовать слияние трёх списков в один
Еще ссылки по теме:

Слияние двух отсортированых массивов в один C++
C++ Списки.Создание списков
C++ Линейные списки. Создание списков на основе имеющегося

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

Или воспользуйтесь поиском по форуму:
СергейАС
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; 
}
Yandex
Объявления
23.10.2012, 14:14     Списки: реализовать слияние трёх списков в один
Ответ Создать тему
Опции темы

Текущее время: 12:57. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru