Объединить исходные списки, поместив все элементы первого списка после данного элемента А второго - PascalABC.NET
Формулировка задачи:
Даны два непустых двусвязных списка из элементов типа integer. Объединить исходные списки, поместив все элементы первого списка (в том же порядке) после данного элемента А второго списка.
На данный момент написал инициализацию списков. Как осуществить вставку одного списка в другой после данного элемента?
Инициализация списков
P.S. почему если просто запустить программу, то элементы списков выводятся одинаковые, а если пронажимать ф8 то разные?
Листинг программы
- 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
- randomize;
- 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;
- end;
- var
- len1, len2: byte;//длины первого и второго списков
- pBegin1, pBegin2: PNode;// Ссылка на первый элемент
- begin
- len1 := 4;
- len2 := 5;
- writeln('Элементы первого списка:');
- create(pbegin1, len1);
- writeln;
- writeln('Элементы второго списка:');
- create(pbegin2, len2);
- end.
Решение задачи: «Объединить исходные списки, поместив все элементы первого списка после данного элемента А второго»
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 или больше длины второго списка, выводится сообщение об ошибке.
- Поиск указанного номера в структуре второго списка.
- Поиск
хвоста
первого списка. - Вставка первого списка после указанного элемента второго списка:
- Если второй список пуст, выводится сообщение об ошибке.
- Иначе, происходит вставка в разрыв между текущим элементом второго списка и следующим за ним.
- Первый список при этом исчезает, его длина обнуляется.
- Вывод обновленных списков на экран.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д