Объединить исходные списки, поместив все элементы первого списка после данного элемента А второго - PascalABC.NET
Формулировка задачи:
Даны два непустых двусвязных списка из элементов типа integer. Объединить исходные списки, поместив все элементы первого списка (в том же порядке) после данного элемента А второго списка.
На данный момент написал инициализацию списков. Как осуществить вставку одного списка в другой после данного элемента?
Инициализация списков
P.S. почему если просто запустить программу, то элементы списков выводятся одинаковые, а если пронажимать ф8 то разные?
Решение задачи: «Объединить исходные списки, поместив все элементы первого списка после данного элемента А второго»
textual
Листинг программы
type
TElem = integer;//тип данных
PNode = ^Node;//тип, описывающий указатель на элемент
Node = record
Element: TElem; //поле данных
pNext: PNode; //прямой указатель
pPrev: PNode; //обратный указатель
End;
///Начальная инициализация и заполнение списков случайными числами
procedure Create(var pBegin: PNode; {var -- после процедуры должно быть начальное значение } a: byte);
var
pAux: PNode;
x: TElem;
begin
New(pBegin); // Заглавный элемент
pAux := pBegin;
pAux^.Element := random(100);
///pAux^.pNext := nil; -- сразу не нужен. Мы же не по одному элеименту добавляем.
pAux^.pPrev := nil;
///write(pAux^.Element:4);
while a - 1 > 0 do
begin
dec(a);
New(pAux^.pNext);
pAux^.pNext^.pPrev := pAux;
pAux := pAux^.pNext;
pAux^.Element := random(100);
///write(pAux^.Element:4);
///pAux^.pNext := nil;
end;
pAux^.pNext := nil; /// -- а вот за последним ни кого не будет!
end;
procedure OutList(List : PNode);
begin
if List = nil then
begin
WriteLn('пусто');
Exit;
end;
repeat
Print(List^.Element);
List := List^.pNext;
until List = nil;
WriteLn;
end;
var
len1, len2: byte;//длины первого и второго списков
pBegin1, pBegin2: PNode;// Ссылка на первый элемент
begin
Randomize; /// -- Достаточно одного раза
len1 := 4; create(pbegin1, len1); /// Заполнение первого списка
len2 := 5; create(pbegin2, len2); /// Заполнение второго списка
/// Вывод списков
writeln('Элементы первого списка:'); OutList(pBegin1);
writeln('Элементы второго списка:'); OutList(pBegin2);
/// ---------- Здесь реализуем вставку ----------
var A := ReadLnInteger('Введите номер элемента второго списка, после которого поместить в него первый: A =');
if (A < 1) or (A > len2) then
begin
WriteLn('Во втором списке нет элемента с номером ', A);
Halt;
end;
/// Ищем указанный номер от начала второго списка
var i := A;
var Cur : PNode := pBegin2;
while (i > 1) and (Cur <> nil) do
begin
i -= 1; Cur := Cur^.pNext;
end;
/// Ищем „хвост“ первого списка
var Last : PNode := pBegin1;
if Last = nil then
begin
WriteLn('Первый список пуст. Вставлять не чего!');
Halt;
end;
while Last^.pNext <> nil do Last := Last^.pNext;
/// Произведём вставку в разрыв между Cur и следющим:
if Cur^.pNext <> nil then
begin
Cur^.pNext^.pPrev := Last; /// Предыдущий в разрыве - это хвост первого
Last^.pNext := Cur^.pNext; /// Следующий за хвостом первого - следующий в разрыве
end;
Cur^.pNext := pBegin1; /// За разрывом - голова первого
pBegin1^.pPrev := Cur; /// Перед головой первого - текущий в разрыве
len2 += len1;
len1 := 0; pBegin1 := nil; /// Первый исчез
WriteLn('Произведена вставка первого списка после элемента ', A, ' второго.');
/// Вывод результата
writeln('Элементы первого списка:'); OutList(pBegin1);
writeln('Элементы второго списка:'); OutList(pBegin2);
end.
Объяснение кода листинга программы
- Объявлены типы данных: TElem (тип элементов списка), PNode (тип, описывающий указатель на элемент), Node (тип элемента списка).
- Инициализированы переменные: len1, len2 (длины первого и второго списков), pBegin1, pBegin2 (ссылка на первый элемент).
- Заполнение первого списка: процедура Create вызывает функцию random для заполнения списка случайными числами.
- Заполнение второго списка: аналогично первому.
- Вывод списков на экран.
- Пользователю предлагается ввести номер элемента второго списка, после которого нужно вставить первый список.
- Проверка корректности введенного номера: если номер меньше 1 или больше длины второго списка, выводится сообщение об ошибке.
- Поиск указанного номера в структуре второго списка.
- Поиск
хвостапервого списка. - Вставка первого списка после указанного элемента второго списка:
- Если второй список пуст, выводится сообщение об ошибке.
- Иначе, происходит вставка в разрыв между текущим элементом второго списка и следующим за ним.
- Первый список при этом исчезает, его длина обнуляется.
- Вывод обновленных списков на экран.