Visualizzazione dei risultati da 1 a 5 su 5

Discussione: Pascal:lista ordinata

  1. #1
    Utente di HTML.it L'avatar di gokan
    Registrato dal
    Feb 2003
    Messaggi
    262

    Pascal:lista ordinata

    Seguendo il mio libro ho scritto questo programmino che a volte non svolge a dovere il suo lavoro; sicuramente dovrei aggiustare qualcosa
    nella funzione per la creazione della lista.Avete qualche consiglio?

    {Il programma accetta in ingresso dei valori interi e li ordina direttamente in
    ordine crescente(con insertion sort).L'immissione termina con il valore zero.
    La lista creata viene visualizzata.}

    program lista_ordin;
    {$APPTYPE CONSOLE}
    uses SysUtils;

    type
    puntatore= ^elemento;
    //Struttura degli elemnti della lista
    elemento=record
    inf:integer;
    pun:puntatore;
    end;

    //Funzione per la creazione della lista ord.Restituisce il puntatore alla testa
    Function crea_lista_ordin: puntatore;
    var
    p,q: puntatore;
    paus: puntatore; //puntatore ausiliario
    x: integer; //contiene il valore da inserire

    begin
    p:=NIL; //Inizializzazione lista vuota

    writeln;
    write('Inserire primo elemento della lista(0 per terminare): ');
    readln(x);
    //Creazione del primo elemento della lista:quello in testa
    if x<>0 then begin
    new(p);
    p^.inf:=x;
    p^.pun:=NIL;
    write('Inserire un altro elemento nella lista(0 per terminare): ');
    readln(x);
    end;

    //Ciclo per la creazione degli elementi successivi
    while x<>0 do begin
    //Creazione nuovo spazio di memoria
    new(paus);
    paus^.inf:=x;

    //Inserimento nella lista
    if x<p^.inf then begin //Se il valore immesso è minore di quello che c'era
    paus^.pun:=p; //in testa allora, il puntatore alla testa viene
    paus:=p; //aggiornato (paus^.pun:=p) in maniera tale che paus
    end //punti adesso pure alla testa (p:=paus)
    else begin

    //Ricerca del punto di inserimento
    q:=p;
    while ((q^.pun)<>NIL) AND ((q^.pun)^.inf<x) do
    q:=q^.pun;
    //Inserimento elemento interno nella lista
    paus^.pun:=q^.pun;
    q^.pun:=paus;
    end;

    //Lettura nuovo elemento
    write('Inserire altro elemento nella lista(0 per terminare): ');
    readln(x);
    end;

    crea_lista_ordin:=p;
    end;

    (*Procedura iterativa per la visualizzazione della lista*)
    Procedure visualizza_lista(p:puntatore);
    begin
    writeln;
    write('punt_lista--> ');

    (*Ciclo di scansione della lista*)
    while p<>NIL do begin
    write(p^.inf); //visualizza il campo informazione
    write('---> ');
    p:=p^.pun; //scorri di un elemento in avanti
    end;
    write ('NIL');
    end;

    (*Main*)
    var
    punt_lista:puntatore; //ci servirà da parametro attuale
    begin
    punt_lista:=crea_lista_ordin; //Chiam. dellq funz.per creare la lista
    visualizza_lista(punt_lista); //Chiam. della proc. per visualiz. la lista
    readln;

    end.

  2. #2
    Utente di HTML.it L'avatar di gokan
    Registrato dal
    Feb 2003
    Messaggi
    262
    Ad esempio se inserisco in serie i seguenti valori, ecco l'output:

    Inserire primo elemento della lista(0 per terminare): 234
    Inserire un altro elemento nella lista(0 per terminare): 45
    Inserire altro elemento nella lista(0 per terminare): 7
    Inserire altro elemento nella lista(0 per terminare): 3
    Inserire altro elemento nella lista(0 per terminare): 0

    punt_lista--> 234---> NIL

    Se invece:

    Inserire primo elemento della lista(0 per terminare): 3
    Inserire un altro elemento nella lista(0 per terminare): 7
    Inserire altro elemento nella lista(0 per terminare): 4
    Inserire altro elemento nella lista(0 per terminare): 2
    Inserire altro elemento nella lista(0 per terminare): 1
    Inserire altro elemento nella lista(0 per terminare): 0

    punt_lista--> 3---> 4---> 7---> NIL



    Il problema secondo me è in questo pezzo di codice:
    //////////////////////////////////////////////////////////////////
    writeln;
    write('Inserire primo elemento della lista(0 per terminare): ');
    readln(x);
    //Creazione del primo elemento della lista:quello in testa
    if x<>0 then begin
    new(p);
    p^.inf:=x;
    p^.pun:=NIL;
    write('Inserire un altro elemento nella lista(0 per terminare): ');
    readln(x);
    end;
    ////////////////////////////////////////////////////////////////////



  3. #3
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,296
    E' un po' difficoltoso interpretare correttamente il tuo codice, dato che nel forum non viene formattato e non viene indentato.

    Prova ad aiutarti eseguendo il programma passo per passo, controllando ciò che avviene per ogni singola istruzione.

    Copiare programmi da libri di testo senza ragionarci su non è molto utile, poichè rischi di commettere degli errori spesso dovuti ad una errata battitura di cui poi non riesci a comprendere la natura.

    Ho notato la clausola {$APPTYPE CONSOLE}: forse ti conviene scrivere [DELPHI] se fai uso di questo ambiente di sviluppo, poichè il linguaggio sul quale si appoggia (Object Pascal) è una naturale evoluzione del linguaggio Pascal che però si differenzia da quello considerato dai programmatori come "Pascal standard".
    Te lo dico solo perchè qualcuno, in un thread di qualche tempo fa, ha fatto notare questa distinzione nella considerazione dei linguaggi.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  4. #4
    Utente di HTML.it L'avatar di gokan
    Registrato dal
    Feb 2003
    Messaggi
    262
    Originariamente inviato da alka
    E' un po' difficoltoso interpretare correttamente il tuo codice, dato che nel forum non viene formattato e non viene indentato.

    Prova ad aiutarti eseguendo il programma passo per passo, controllando ciò che avviene per ogni singola istruzione.

    Copiare programmi da libri di testo senza ragionarci su non è molto utile, poichè rischi di commettere degli errori spesso dovuti ad una errata battitura di cui poi non riesci a comprendere la natura.

    Ho notato la clausola {$APPTYPE CONSOLE}: forse ti conviene scrivere [DELPHI] se fai uso di questo ambiente di sviluppo, poichè il linguaggio sul quale si appoggia (Object Pascal) è una naturale evoluzione del linguaggio Pascal che però si differenzia da quello considerato dai programmatori come "Pascal standard".
    Te lo dico solo perchè qualcuno, in un thread di qualche tempo fa, ha fatto notare questa distinzione nella considerazione dei linguaggi.

    Ciao!
    Ok, la prossima volta specifico che uso Delphi.
    Il codice che ho riportato non è semplicemente copiato, provo sempre gli esempi del mio libro e poi vedo di fare programmini simili per vedere se imparo correttamente, inoltre ho preso abitudine a commentare bene quelle righe di codice che sono meno immediate.

  5. #5
    Utente di HTML.it L'avatar di gokan
    Registrato dal
    Feb 2003
    Messaggi
    262
    Se così può essere più chiaro:
    codice:
    {Il programma accetta in ingresso dei valori interi e li ordina direttamente in
    ordine crescente(con insertion sort).L'immissione termina con il valore zero.
    La lista creata viene visualizzata.}
    
    program lista_ordin;
    {$APPTYPE CONSOLE}
    uses SysUtils;
    
    type
      puntatore= ^elemento;
    //Struttura degli elemnti della lista
      elemento=record
         inf:integer;
         pun:puntatore;
       end;
    
    //Funzione per la creazione della lista ord.Restituisce il puntatore alla testa
    Function crea_lista_ordin: puntatore;
    var
      p,q: puntatore;
      paus: puntatore;  //puntatore ausiliario
      x: integer;       //contiene il valore da inserire
    
    begin
    p:=NIL;            //Inizializzazione lista vuota
    
    writeln;
    write('Inserire primo elemento della lista(0 per terminare): ');
    readln(x);
    //Creazione del primo elemento della lista:quello in testa
     if x<>0 then begin
     new(p);
     p^.inf:=x;
     p^.pun:=NIL;
    write('Inserire un altro elemento nella lista(0 per terminare): ');
    readln(x);
     end;
    
    //Ciclo per la creazione degli elementi successivi
    while x<>0 do begin
    //Creazione nuovo spazio di memoria
    new(paus);
    paus^.inf:=x;
    
    //Inserimento nella lista
    if x<p^.inf then begin      //Se il valore immesso è minore di quello che c'era
    paus^.pun:=p;               //in testa allora, il puntatore alla testa viene
    paus:=p;                    //aggiornato (paus^.pun:=p) in maniera tale che paus
    end                         //punti adesso pure alla testa (p:=paus)
    else begin
    
    //Ricerca del punto di inserimento
    q:=p;
     while ((q^.pun)<>NIL) AND ((q^.pun)^.inf<x) do
     q:=q^.pun;
    //Inserimento elemento interno nella lista
    paus^.pun:=q^.pun;
    q^.pun:=paus;
     end;
    
    //Lettura nuovo elemento
    write('Inserire altro elemento nella lista(0 per terminare): ');
    readln(x);
                   end;
    
    crea_lista_ordin:=p;
    end;
    
    (*Procedura iterativa per la visualizzazione della lista*)
    Procedure visualizza_lista(p:puntatore);
    begin
     writeln;
     write('punt_lista--> ');
    
    (*Ciclo di scansione della lista*)
    while p<>NIL do begin
     write(p^.inf);   //visualizza il campo informazione
     write('---> ');
     p:=p^.pun;       //scorri di un elemento in avanti
     end;
    write ('NIL');
    end;
    
    (*Main*)
    var
     punt_lista:puntatore;   //ci servirà da parametro attuale
    begin
    punt_lista:=crea_lista_ordin;     //Chiam. dellq funz.per creare la lista
    visualizza_lista(punt_lista);     //Chiam. della proc. per visualiz. la lista
    readln;
    
    end.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.