Объединить исходные списки, поместив все элементы первого списка после данного элемента А второго - PascalABC.NET

Узнай цену своей работы

Формулировка задачи:

Даны два непустых двусвязных списка из элементов типа integer. Объединить исходные списки, поместив все элементы первого списка (в том же порядке) после данного элемента А второго списка. На данный момент написал инициализацию списков. Как осуществить вставку одного списка в другой после данного элемента? Инициализация списков
Листинг программы
  1. type
  2. TElem = integer;//тип данных
  3. PNode = ^Node;//тип, описывающий указатель на элемент
  4. Node = record
  5. Element: TElem; //поле данных
  6. pNext: PNode; //прямой указатель
  7. pPrev: PNode; //обратный указатель
  8. End;
  9. ///Начальная инициализация и заполнение списков случайными числами
  10. procedure Create(var pBegin: PNode; var a: byte);
  11. var
  12. pAux: PNode;
  13. x: TElem;
  14. begin
  15. randomize;
  16. New(pBegin); // Заглавный элемент
  17. pAux := pBegin;
  18. pAux^.Element := random(100);
  19. pAux^.pNext := nil;
  20. pAux^.pPrev := nil;
  21. write(pAux^.Element:4);
  22. while a - 1 > 0 do
  23. begin
  24. dec(a);
  25. New(pAux^.pNext);
  26. pAux^.pNext^.pPrev := pAux;
  27. pAux := pAux^.pNext;
  28. pAux^.Element := random(100);
  29. write(pAux^.Element:4);
  30. pAux^.pNext := nil;
  31. end;
  32. end;
  33. var
  34. len1, len2: byte;//длины первого и второго списков
  35. pBegin1, pBegin2: PNode;// Ссылка на первый элемент
  36. begin
  37. len1 := 4;
  38. len2 := 5;
  39. writeln('Элементы первого списка:');
  40. create(pbegin1, len1);
  41. writeln;
  42. writeln('Элементы второго списка:');
  43. create(pbegin2, len2);
  44. end.
P.S. почему если просто запустить программу, то элементы списков выводятся одинаковые, а если пронажимать ф8 то разные?

Решение задачи: «Объединить исходные списки, поместив все элементы первого списка после данного элемента А второго»

textual
Листинг программы
  1. type
  2.   TElem = integer;//тип данных
  3.   PNode = ^Node;//тип, описывающий указатель на элемент
  4.   Node = record
  5.     Element: TElem; //поле данных
  6.     pNext: PNode; //прямой указатель
  7.     pPrev: PNode; //обратный указатель
  8.   End;
  9.  
  10. ///Начальная инициализация и заполнение списков случайными числами
  11. procedure Create(var pBegin: PNode; {var -- после процедуры должно быть начальное значение } a: byte);
  12. var
  13.   pAux: PNode;
  14.   x: TElem;
  15. begin
  16.   New(pBegin);  // Заглавный элемент
  17.   pAux := pBegin;
  18.   pAux^.Element := random(100);
  19.   ///pAux^.pNext := nil; -- сразу не нужен. Мы же не по одному элеименту добавляем.
  20.   pAux^.pPrev := nil;
  21.   ///write(pAux^.Element:4);
  22.   while a - 1 > 0 do
  23.     begin
  24.       dec(a);
  25.       New(pAux^.pNext);
  26.       pAux^.pNext^.pPrev := pAux;
  27.       pAux := pAux^.pNext;
  28.       pAux^.Element := random(100);
  29.       ///write(pAux^.Element:4);
  30.       ///pAux^.pNext := nil;
  31.     end;
  32.   pAux^.pNext := nil; /// -- а вот за последним ни кого не будет!
  33. end;
  34.  
  35. procedure OutList(List : PNode);
  36. begin
  37.   if List = nil then
  38.     begin
  39.       WriteLn('пусто');
  40.       Exit;
  41.     end;
  42.    
  43.   repeat
  44.     Print(List^.Element);
  45.     List := List^.pNext;
  46.   until List = nil;
  47.   WriteLn;
  48. end;
  49.  
  50. var
  51.   len1, len2: byte;//длины первого и второго списков
  52.   pBegin1, pBegin2: PNode;// Ссылка на первый элемент
  53.  
  54. begin
  55.   Randomize; /// -- Достаточно одного раза
  56.  
  57.   len1 := 4; create(pbegin1, len1); /// Заполнение первого списка
  58.   len2 := 5; create(pbegin2, len2); /// Заполнение второго списка
  59.  
  60.   /// Вывод списков
  61.   writeln('Элементы первого списка:'); OutList(pBegin1);
  62.   writeln('Элементы второго списка:'); OutList(pBegin2);
  63.  
  64.   /// ---------- Здесь реализуем вставку ----------
  65.   var A := ReadLnInteger('Введите номер элемента второго списка, после которого поместить в него первый: A =');
  66.   if (A < 1) or (A > len2) then
  67.     begin
  68.       WriteLn('Во втором списке нет элемента с номером ', A);
  69.       Halt;
  70.     end;
  71.  
  72.   /// Ищем указанный номер от начала второго списка
  73.   var i := A;
  74.   var Cur : PNode := pBegin2;
  75.   while (i > 1) and (Cur <> nil) do
  76.     begin
  77.       i -= 1; Cur := Cur^.pNext;
  78.     end;
  79.    
  80.   /// Ищем „хвост“ первого списка
  81.   var Last : PNode := pBegin1;
  82.   if Last = nil then
  83.     begin
  84.       WriteLn('Первый список пуст. Вставлять не чего!');
  85.       Halt;
  86.     end;
  87.   while Last^.pNext <> nil do Last := Last^.pNext;
  88.  
  89.   /// Произведём вставку в разрыв между Cur и следющим:
  90.   if Cur^.pNext <> nil then
  91.     begin
  92.       Cur^.pNext^.pPrev := Last; /// Предыдущий в разрыве - это хвост первого
  93.       Last^.pNext := Cur^.pNext; /// Следующий за хвостом первого - следующий в разрыве
  94.     end;
  95.   Cur^.pNext := pBegin1; /// За разрывом - голова первого
  96.   pBegin1^.pPrev := Cur; /// Перед головой первого - текущий в разрыве
  97.  
  98.   len2 += len1;
  99.   len1 := 0; pBegin1 := nil; /// Первый исчез
  100.   WriteLn('Произведена вставка первого списка после элемента ', A, ' второго.');
  101.  
  102.   /// Вывод результата
  103.   writeln('Элементы первого списка:'); OutList(pBegin1);
  104.   writeln('Элементы второго списка:'); OutList(pBegin2);
  105. end.

Объяснение кода листинга программы

  1. Объявлены типы данных: TElem (тип элементов списка), PNode (тип, описывающий указатель на элемент), Node (тип элемента списка).
  2. Инициализированы переменные: len1, len2 (длины первого и второго списков), pBegin1, pBegin2 (ссылка на первый элемент).
  3. Заполнение первого списка: процедура Create вызывает функцию random для заполнения списка случайными числами.
  4. Заполнение второго списка: аналогично первому.
  5. Вывод списков на экран.
  6. Пользователю предлагается ввести номер элемента второго списка, после которого нужно вставить первый список.
  7. Проверка корректности введенного номера: если номер меньше 1 или больше длины второго списка, выводится сообщение об ошибке.
  8. Поиск указанного номера в структуре второго списка.
  9. Поиск хвоста первого списка.
  10. Вставка первого списка после указанного элемента второго списка:
    • Если второй список пуст, выводится сообщение об ошибке.
    • Иначе, происходит вставка в разрыв между текущим элементом второго списка и следующим за ним.
    • Первый список при этом исчезает, его длина обнуляется.
  11. Вывод обновленных списков на экран.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 3.571 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы