我想按升序创建一个列表:
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
read ( dato );
while ( dato <> -1 ) do
begin
insertarOrdenado ( vLista, dato );
read ( dato );
end;
imprimirLista ( vLista );
end.
因此,当我运行程序时,插入的数字是:
1 - 5 - 58 - 95 - 3 - 0
预期结果是:
0 - 1 - 3 - 5 - 58 - 95
但是,当程序写入列表时:
1 - 0 - 5 - 3 - 58 - 95
那么,这里有什么问题?
答案 0 :(得分:3)
基本上是因为你的程序无法在你构建的列表之前插入一个节点,因为你的“Cursor”变量在插入元素之后会从第一个元素开始。
我建议改进程序“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;