2013-10-19 106 views
0

我想創建升序排列的列表:創建升序排列的列表

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

那麼,這裏有什麼問題?

回答

3

基本上這是因爲你的程序不能在你構建的列表之前插入一個節點,因爲你的「光標」變量,在你插入元素之後,從第一個元素開始。

我的程序 「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;