Visualizzazione dei risultati da 1 a 4 su 4

Discussione: Pascal: liste

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

    Pascal: liste

    PROBLEMA 1

    codice:
    type
      puntatore=^elemento;
            elemento= record
            info: integer;
            next: puntatore;
            end;
    var
    lis: puntatore; //puntatore alla testa della lista

    Salve a tutti, sto lavorando con le liste, ho qualche difficoltà ad implementare una procedura che cancelli il massimo da una lista. Ipotizziamo che la lista sia lis->7->2->15->8->NIL
    Io avevo pensato di inizializzare fuori dalla procedura:

    massimo:= -MAXINT-1;

    La procedura pensavo potesse funzionare così: Confronto il primo elemento della lista con il massimo (lis^.info > massimo), nella figura significa che 7 è sicuramente maggiore di -MAXINT-1, dovrei memorizzare da qualche parte che adesso il nuovo max è 7 e passare avanti scandendo la lista, il nuovo elemento è 2, minore dell'attuale max (quindi non si fa nulla e si passa avanti), adesso il nuovo elemento ha il campo info etichettato con 15 che è maggiore di 7 (dunque il nuovo max è 15)...Andiamo avanti fino all'ultimo elemento (cioè 8<15).
    Alla fine la nuova lista dovrebbe essere lis->7->2->8->NIL. Abbiamo eliminato il max. Il problema è implementare questa procedura in pascal ;) Dovrei utilizzare 2 puntatori, uno che mi scandisca la lista ed uno che mi punti al max attuale e che si aggiorni ogni volta che scoprimo un nuovo max?
    Mi date una mano?

    PROBLEMA 2

    codice:
    type
      puntatore=^elemento;
            elemento= record
            info: char;
            next: puntatore;
            end;
    Ho implementato in questo modo una procedura che cancelli tutte le vocali da una lista di lettere. Esempio:
    INPUT: ls->F->O->R->U->M->NIL
    OUTPUT:ls->F->R->M->NIL

    codice:
    Procedure CancellaTutteVocali(var p_testa:puntatore);
    var
      paux: puntatore;
      warning:string;
    begin
    if p_testa=NIL then warning:='Lista vuota'
    else
    if p_testa<>NIL then
      if (p_testa^.info='a')OR(p_testa^.info='e')OR(p_testa^.info='i')OR
          (p_testa^.info='o')OR(p_testa^.info='u') then
          begin
          paux:=p_testa;
          p_testa:=p_testa^.next;
          dispose(paux);
          CancellaTutteVocali(p_testa);
          end
       else CancellaTutteVocali(p_testa^.next);
    end;
    Ho tentato di sostituire quel poco elegante controllo dato da tutti quegli OR con qualcosa di simile
    if p_testa^.info in [a,e,i,o,u] then ...

    dove volevo fare
    type
    vocali= set of(a,e,i,o,u)

    Mi viene dato l'errore di tipi incompatibili (char e set). Come potrei eliminare quella serie di OR, è mettere qualcosa di più compatto ed elegante?

  2. #2
    Utente di HTML.it L'avatar di gokan
    Registrato dal
    Feb 2003
    Messaggi
    262
    Per il problema 2 ho risolto così(non mettevo gli apici):
    codice:
    Procedure CancellaTutteVocali(var p_testa:puntatore);
    var
      paux: puntatore;
      warning:string;
    begin
    if p_testa=NIL then warning:='Lista vuota'
    else
    if p_testa in ['a','e','i','o','u']
          begin
          paux:=p_testa;
          p_testa:=p_testa^.next;
          dispose(paux);
          CancellaTutteVocali(p_testa);
          end
       else CancellaTutteVocali(p_testa^.next);
    end;

  3. #3
    Crei un puntatore che punta al indirizzo del elemento massimo della lista e come hai detto, ogni volta fai il confronto con un altro puntatore che scandisce la lista.

    Quando il puntatore che scandisce la lista è NIL, allora la lista è finita, e quindi puoi cancellare l'indirizzo del puntatore che contiene il numero massimo.

    Naturalmente prima devi aggiornare l'elemento della lista precedente e sucessivo a quello che vuoi cancellare.

    Di solito: q ^.prec e q ^.succ

  4. #4
    Utente di HTML.it L'avatar di gokan
    Registrato dal
    Feb 2003
    Messaggi
    262
    Sono riuscito a risolvere il problema in questo modo, la mia intenzione è però non fare uso della funzione locale. Vediamo che posso fare grazie alle tue indicazioni, ciao

    codice:
    Procedure EliminaMax(var lis1: puntatore; max: integer);
    var
      paux: puntatore; //globale ad EliminaMax
    
    (*TrovaMax è una funzione locale ad EliminaMax*)
    Function TrovaMax(lis1: puntatore; max: integer):integer;
    begin
    if lis1<>NIL then
      begin
      if lis1^.info > max then max:=lis1^.info;
    max:=TrovaMax(lis1^.next, max);
      end;
      TrovaMax:=Max;
    end;{Fine della funzione TrovaMax}
    
    (*Da qui in poi implementiamo EliminaMax*)
    begin
    if lis1<>NIL then
      if lis1^.info=TrovaMax(lis1,max) then
         begin
         paux:=lis1;
         lis1:=lis1^.next;
         dispose(paux);
         end
       else
         EliminaMax(lis1^.next,TrovaMax(lis1,max));
    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 © 2025 vBulletin Solutions, Inc. All rights reserved.