В данной статье мы рассмотрим проблему, связанную с выводом списка в обратном порядке при использовании языка программирования Pascal. Мы покажем, как исправить этот порядок и вывести список в правильном, возрастающем порядке.
Проблема
Рассмотрим следующий код на Паскале, который создает список целых чисел и вставляет их в список в порядке возрастания:
program ejListas;
type
Tlista = ^lista;
lista = record
valor: Integer;
sgte: Tlista;
end;
procedure insertarOrdenado(var lista: Tlista; dato: Integer);
var
cursor, listaAux: Tlista;
begin
if (lista <> nil) then
begin
new(listaAux);
listaAux^.valor := dato;
cursor := lista;
while (cursor^.sgte <> nil) and (cursor^.valor < dato) do
cursor := cursor^.sgte;
listaAux^.sgte := cursor^.sgte;
cursor^.sgte := listaAux;
end
else
begin
new(lista);
lista^.valor := dato;
lista^.sgte := nil;
end;
end;
procedure imprimirLista(lista: Tlista);
var
cursor: Tlista;
begin
cursor := lista;
while (cursor <> nil) do
begin
writeln(cursor^.valor);
cursor := cursor^.sgte;
end;
end;
var
vLista: Tlista;
dato: Integer;
begin
readln(dato);
while (dato <> -1) do
begin
insertarOrdenado(vLista, dato);
readln(dato);
end;
imprimirLista(vLista);
end.
При запуске этой программы мы ожидаем, что список будет выведен в возрастающем порядке. Однако, мы получаем список в обратном порядке:
1 - 5 - 58 - 95 - 3 - 0
Ожидаемый результат был следующим:
0 - 1 - 3 - 5 - 58 - 95
Но на самом деле, программа выводит список в таком порядке:
1 - 0 - 5 - 3 - 58 - 95
Проблема заключается в том, что при вставке нового элемента в список, мы ищем место для вставки после текущего элемента, а не перед ним. В результате, последний вставленный элемент оказывается первым в списке, и список выводится в обратном порядке.
Решение
Чтобы исправить порядок вывода списка, нам нужно изменить процедуру insertarOrdenado так, чтобы новые элементы вставлялись перед текущим элементом, а не после него. Вот исправленный код:
procedure insertarOrdenado(var lista: Tlista; dato: Integer);
var
cursor, listaAux: Tlista;
begin
if (lista <> nil) then
begin
new(listaAux);
listaAux^.valor := dato;
cursor := lista;
while (cursor^.sgte <> nil) and (cursor^.sgte^.valor < dato) do
cursor := cursor^.sgte;
if (cursor^.valor > dato) then
begin
listaAux^.sgte := cursor;
lista := listaAux;
end
else
begin
listaAux^.sgte := cursor^.sgte;
cursor^.sgte := listaAux;
end;
end
else
begin
new(lista);
lista^.valor := dato;
lista^.sgte := nil;
end;
end;
Теперь, при вставке нового элемента, мы ищем место для вставки перед текущим элементом, а не после него. В результате, список выводится в правильном, возрастающем порядке.
Заключение
В данной статье мы рассмотрели проблему вывода списка в обратном порядке в Паскале и предложили решение, которое исправляет порядок вывода списка. Мы показали, как изменить процедуру insertarOrdenado, чтобы новые элементы вставлялись перед текущим элементом, а не после него. Таким образом, список выводится в правильном, возрастающем порядке.
В данной статье рассматривается проблема вывода списка в обратном порядке при использовании языка программирования Pascal и предлагается решение, исправляющее порядок вывода списка.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS