1 / 1 / 1
Регистрация: 29.05.2014
Сообщений: 6
1

Слейте два упорядоченных по невозрастанию списка в один

30.05.2014, 16:42. Показов 3405. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Слейте два упорядоченных по невозрастанию списка в один (также упорядоченный по невозрастанию), построив новый список. Делается в динамической памяти с указателями.
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
30.05.2014, 16:42
Ответы с готовыми решениями:

Объединить два упорядоченных списка в один, тоже упорядоченный
Program spisoc1; Type spis=^spisoc; spisoc=record inf:integer; link:spis; end;...

Объединить два упорядоченных по неубыванию списка М1 и М2 в один упорядоченный
Написать программу, содержащую процедуру, которая объединяет два упорядоченных по неубыванию списка...

Два упорядоченных по убыванию списка объединить в один, не нарушив порядка
два упорядоченных по убыванию списка объединить в один не нарушив порядка.

Списки. Два упорядоченных по возрастанию списка целых чисел объединить в один
Доброго времени суток, ребята. Нужна помощь в написание программы. Два списка упорядоченных по...

2
13107 / 5888 / 1707
Регистрация: 19.09.2009
Сообщений: 8,808
01.06.2014, 01:39 2
Лучший ответ Сообщение было отмечено Aramaz как решение

Решение

Если слияние выполняется на некотором списке, то перед слиянием только этот список должен быть упорядочен. А упорядоченность в других списках не имеет никакого значения. В добавок, в формулировке задачи сказано, что слияние нужно проводить на новом списке. Т. е., в этом случае начальная упорядоченность вообще никакой роли не играет.
Слияние с сохранением упорядоченности реализуется с помощью специальной процедуры вставки элемента в список. Эта процедура должна находить положение в списке, где при вставке нового элемента упорядоченность не нарушится.
И раз уж в задаче требуется начальная упорядоченность списков, тогда просто заполнять эти списки нужно через эту самую специальную процедуру вставки.
Решение может выглядеть так:
Pascal
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
program Project1;
 
type
  {Тип основных данных.}
  TData = Integer;
  {Тип, описывающий указатель на элемент.}
  TPElem = ^TElem;
  {Тип, описывающий элемент списка.}
  TElem = record
    Data : TData;
    PNext : TPElem; {Указатель на следующий элемент.}
  end;
  {Тип, описывающий список.}
  TDList = record
    PFirst, PLast : TPElem; {Указатели на первый и на последний элементы списка.}
  end;
 
{Процедуры для работы со списком.}
 
{Начальная инициализация списка. Внимание! Эту процедуру можно выполнять
только в отношении пустого списка. Иначе будут утечки памяти.}
procedure Init(var aL : TDList);
begin
  aL.PFirst := nil;
  aL.PLast := nil;
end;
 
{Освобождение памяти, занятой для элементов списка и инициализация.}
procedure LFree(var aL : TDList);
var
  P, PDel : TPElem;
begin
  P := aL.PFirst; {Указатель на первый элемент списка.}
  while P <> nil do
  begin
    PDel := P; {Запоминаем указатель на текущий элемент.}
    P := P^.PNext; {Получаем указатель на следующий элемент.}
    Dispose(PDel); {Освобождаем память, занятую текущим элементом списка.}
  end;
  Init(aL);
end;
 
{Добавление элемента в список согласно сортировочному правилу - по невозрастанию,
в данном случае.}
procedure AddDesc(var aL : TDList; const aData : TData);
var
  PNew, PCur, PPrev : TPElem;
begin
  New(PNew); {Выделяем паямять для элемента.}
  PNew^.Data := aData; {Записываем данные.}
  {Ищем элемент, который меньше или равен новому - перед ним следует вставить
  новый элемент.}
  PCur := aL.PFirst;{Указатель на текущий элемент.}
  {Указатель на предыдущий элемент. Этот указатель мы должны знать для того,
  чтобы мы могли вставить новый элемент между PPrev и PCur.}
  PPrev := nil;
  while (PCur <> nil) and (PCur^.Data > aData) do
  begin
    PPrev := PCur;
    PCur := PCur^.PNext;
  end;
  {Теперь, в зависимости от результатов поиска выполняем вставку нового элемента
  в нужное место списка.}
  PNew^.PNext := PCur;
  if PPrev <> nil then {Добавление между PPrev и PCur, либо - в конец списка.}
    PPrev^.PNext := PNew
  else {Добавление в начало списка.}
    aL.PFirst := PNew;
  if PNew^.PNext = nil then {Если новый элемент стал последним элементом в списке.}
    aL.PLast := PNew;
end;
 
{Распечатка списка.}
procedure LWriteln(const aL : TDList);
var
  P : TPElem;
begin
  P := aL.PFirst; {Указатель на первый элемент списка.}
  if P <> nil then
  repeat
    {Если это не первый элемент, то в распечатке ставим перед ним запятую.}
    if P <> aL.PFirst then
      Write(', ');
    Write(P^.Data); {Распечатываем данные текущего элемента.}
    P := P^.PNext; {Получаем указатель на следующий элемент.}
  until P = nil
  else
    Write('Список пуст.');
  Writeln;
end;
 
const
  M = 5; {Количество элементов, которые мы будем добавлять в списки.}
var
  L1, L2, L3 : TDList;
  P : TPElem;
  i : Integer;
  S : String;
begin
  {Начальная инициализация списков.}
  Init(L1);
  Init(L2);
  Init(L3);
 
  repeat
    {Создаём исходные списки.}
    Randomize; {Инициализируем генератор случайных чисел.}
    for i := 1 to M do
    begin
      AddDesc(L1, Random(100)); {Случайные целые числа из диапазона: 0..99.}
      AddDesc(L2, Random(100));
    end;
    Writeln('Заданы списки: ');
    LWriteln(L1);
    LWriteln(L2);
 
    {Выполняем слияние исходных списков в результирующий.}
    {Слияние первого списка.}
    P := L1.PFirst;
    while P <> nil do
    begin
      AddDesc(L3, P^.Data);
      P := P^.PNext;
    end;
    {Слияние второго списка.}
    P := L2.PFirst;
    while P <> nil do
    begin
      AddDesc(L3, P^.Data);
      P := P^.PNext;
    end;
 
    {Ответ.}
    Writeln('Результат слияния:');
    LWriteln(L3);
 
    {Освобождение памяти, занятой для элементов списков.}
    LFree(L1);
    LFree(L2);
    LFree(L3);
    Writeln('Память, выделенная для списков - освобождена.');
 
    Writeln('Повторить - Enter, выход - любой символ + Enter.');
    Readln(S);
  until S <> '';
end.
0
1 / 1 / 1
Регистрация: 29.05.2014
Сообщений: 6
01.06.2014, 17:02  [ТС] 3
Mawrat, спасибо, буду разбираться
0
01.06.2014, 17:02
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
01.06.2014, 17:02
Помогаю со студенческими работами здесь

Описать функцию, которая объединяет два упорядоченных по возрастанию списка в один
2)Описать функцию, которая объединяет два упорядоченных по возрастанию списка в один. не знаю...

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

Объединить два упорядоченных списка целых значений в один, и сохранить их в третьем списке
Добрый час! Есть задача: Напишите программу, которая объединяет два объекта упорядоченного списка...

Объединить два упорядоченных по неубыванию списка в один упорядоченный по неубыванию
Помогите описать процедуру, которая объединяет два упорядоченных по неубыванию списка X1 и X2 в...


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

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

Новые блоги и статьи
Как преобразовать список списков в простой список в Python
bytestream 22.01.2025
При работе с Python разработчики часто сталкиваются с необходимостью обработки сложных структур данных, среди которых особое место занимают вложенные списки. Эти структуры представляют собой списки,. . .
Что такое GUID / UUID и как их создать
bytestream 22.01.2025
В мире разработки программного обеспечения существует постоянная потребность в уникальной идентификации объектов, записей и ресурсов. Эта задача становится особенно актуальной в распределенных. . .
Как добавить пустую директорию в репозиторий Git
bytestream 22.01.2025
При работе с системой контроля версий Git разработчики часто сталкиваются с ситуацией, когда необходимо сохранить пустую директорию в репозитории. Данная задача может показаться простой на первый. . .
Как валидировать адрес email в JavaScript
bytestream 22.01.2025
JavaScript, как основной язык веб-разработки, предоставляет разработчикам множество инструментов для реализации эффективной валидации email-адресов. От простых встроенных решений до сложных. . .
Как заменить все вхождения подстроки в JavaScript
bytestream 22.01.2025
Строки в JavaScript представляют собой неизменяемые последовательности символов, что делает их обработку особенно интересной с точки зрения оптимизации и выбора правильного подхода к решению задач. . . .
Управление версиями пакетов в Node.js. В чем разница между тильдой (~) и кареткой (^) в package.json
bytestream 22.01.2025
В современной разработке программного обеспечения управление версиями пакетов играет ключевую роль в обеспечении стабильности и надежности проектов. Node. js, как одна из самых популярных платформ для. . .
Аутентификация на сайте с помощью формы
bytestream 21.01.2025
В современном цифровом мире безопасная аутентификация становится краеугольным камнем защиты веб-приложений и пользовательских данных. Каждый день миллионы людей используют различные онлайн-сервисы,. . .
Как получить индекс в цикле for в Python
bytestream 21.01.2025
При работе с коллекциями данных в Python часто возникает необходимость не только получить доступ к элементам последовательности, но и знать их позицию в процессе итерации. Индексация в циклах. . .
Как определить адрес, из которого локальный репозиторий Git был клонирован
bytestream 21.01.2025
В современной разработке программного обеспечения система контроля версий Git стала неотъемлемой частью рабочего процесса. При работе с Git разработчики часто сталкиваются с необходимостью. . .
Какая разница между операторами == и === в сравнениях в JavaScript
bytestream 21.01.2025
В мире веб-разработки JavaScript занимает особое место как динамический язык программирования, предоставляющий разработчикам широкий набор инструментов для создания интерактивных веб-приложений. . . .
Из чего и как собрать свой домашний кинотеатр
bt_guru 21.01.2025
Создание домашнего кинотеатра: от идеи до реализации В современном мире домашний кинотеатр стал неотъемлемой частью комфортного жилого пространства, предоставляя возможность наслаждаться. . .
Ошибки стиральных машин
bt_guru 21.01.2025
Современные стиральные машины представляют собой сложные электронные устройства, оснащенные множеством датчиков и систем контроля. Они способны самостоятельно определять вес загруженного белья,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru