Pagina 2 di 2 primaprima 1 2
Visualizzazione dei risultati da 11 a 15 su 15
  1. #11
    Utente di HTML.it L'avatar di gokan
    Registrato dal
    Feb 2003
    Messaggi
    262
    Grazie per le delucidazioni

    Scusa se mi ripeto, ma se la lista è questa:

    pLista-->3-->4-->7-->4-->9-->NIL

    Se io voglio eliminare il 4, la mia lista diventa:

    pLista-->3-->7-->4-->9-->NIL

    Ossia viene eliminato solo il primo 4 incontrato, l'altro(nella penultima posizione) continua a rimanere nella lista.Come posso eliminare anche l'altro 4?


  2. #12
    Utente di HTML.it L'avatar di gokan
    Registrato dal
    Feb 2003
    Messaggi
    262
    Con carta e penna mi sono fatto dei passaggi per un eventuale eliminazione.Per eliminare anche le ricorrenze di un valore non basta mettere
    pAus:=pAus^.pun dopo dispose

    Se infatti eseguo il programmino, mi esce fuori

  3. #13
    Utente di HTML.it L'avatar di gokan
    Registrato dal
    Feb 2003
    Messaggi
    262
    Sono sempre alle prese con degli esercizi sulle liste:)
    Questa volta devo creare due liste fonderle e creare una terza lista.
    Faccio un esempio:

    lista1 B N S I O
    lista2 E I S M !
    lista3 B E N I S S I M O !

    Pensavo finalmente di aver scritto del codice buono invece...
    Perchè non riesco mai a risolvermi un esercizio da solo:cry:

    Ecco la mia funzione di fusion
    codice:
    Function crea_lista3(pLista1,pLista2: puntatore):puntatore;
    var
      pLista3,pAus3: puntatore;
    
    begin
    pAus1:=pLista1;
    pAus2:=pLista2;
    
    if (pLista1=NIL) AND (pLista2=NIL) then pLista3:=NIL
     else begin
    //Creazione del primo elemento
     new(pLista3);
    
     pLista3^.inf:=pLista1^.inf;
     pAus3:=pLista3;
    
    //Creazione del secondo elemento
     new(pAus3^.pun);
    
     pAus3:=pAus3^.pun;
     pAus3^.inf:=pLista2^.inf;
    
       while (pAus1<>NIL) AND (pAus2<>NIL) do begin
    //Creazione degli elementi successivi
       new(pAus3^.pun);
    
       pAus3:=pAus3^.pun;
       pAus1:=pAus1^.pun;
       pAus3^.inf:=pAus1^.inf;
    
       new(pAus3^.pun);
    
       pAus3:=pAus3^.pun;
       pAus2:=pAus2^.pun;
       pAus3^.inf:=pAus2^.inf;
    
                                              end;
     paus3^.pun:=NIL;    //Marca di fine lista
          end;
    
    crea_lista3:=pLista3;
    end;
    Commento quello che penso di aver scritto...
    Alla funzione crea_lista3 passo i puntatori alla testa della lista1 e lista2.
    pLista1,pLista2,pAus1,pAus2 le dichiaro variabili globali perchè ovviamente le devo usare in crea_lista3.
    Inizializzo:
    pAus1:=pLista1;
    pAus2:=pLista2;

    Poi mi faccio un controllo sulle due liste per vedere se non sono vuote,poi passo alla creazione del primo elemento (a cui passo pLista1), nel mio esempio è la B.
    Poi creo il secondo elemento passando new(pAus3^.pun) (a cui passo pLista2), nel mio esempio è la E.
    Proseguo alla creazione degli altri elementi servendomi del ciclo while che si blocca appena una delle 2 liste si conclude........

    Ho controllato più volte il codice passo-passo, perchè non riesco ad auto-debuggare da solo?

    Mi scoccia chiedere aiuto sempre ad Alka
    :quipy:, visto che ci siamo ormai helpatemi!!!

    :)

  4. #14
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,483
    Non so dirti perchè non riesci a fare il debug da solo...

    Secondo il mio modesto parere, ti scoccia anche un po' farlo...

    Se esegui il tuo programma passo passo, ti accorgerai che il percorso delle istruzioni non segue il filo logico mentale del processo corretto di fusione delle liste.

    Ad esempio: perchè crei subito due elementi? Se ho una lista con un elemento e la seconda è vuota, dovrei ottenere una lista risultante di un solo elemento, non di due...mentre con la tua implementazione ciò non avviene e ho sempre almeno due elementi.

    A mio avviso, non ti poni il problema della fusione della lista da un punto di osservazione puramente algoritmico: devi schematizzare il processo prima di scrivere codice...devi avere ben chiaro qual è il procedimento con cui si fondono due liste, scriverlo in qualsiasi forma tu voglia (vi hanno sicuramente insegnato anche i diagrammi) e, successivamente, codificarlo in Pascal.

    Ad esempio, io analizzerei il tuo esercizio in questo modo:
    l'algoritmo deve scandirsi entrambe le liste da fondere fino alla fine, riportando per ciascuna prima un elemento di una lista, poi quello dell'altra lista, alternativamente, a meno che non siamo arrivati in fondo ad una delle due liste.
    Questo potrebbe tradursi in un
    codice:
    while (pElem1 <> nil) and (pElem2 <> nil) do....
    dove gli identificatori pElem1 e pElem2 vengono aggiornati ad ogni ciclo con l'elemento delle rispettive liste da inserire nella risultante.
    Se ho almeno un elemento a disposizione, quindi viene rispettata la condizione di cui sopra, creo un nuovo elemento per pElem1 nella lista risultante se esso è diverso da nil, e/o per pElem2 se esso è diverso da nil, successivamente.
    Ad ogni ciclo, devo fare in modo che l'elemento inserito precedentemente contenga un riferimento al nuovo elemento che vado a creare, pertanto occorre mantenere aggiornato un puntatore apposito così come avveniva in fase di creazione (vedi problema nei messaggi precedenti).

    Hai fatto queste considerazioni? Secondo me, il tuo problema è che non esegui un ragionamento di analisi sul quesito...devi progettare prima mentalmente l'algoritmo, analizzando come creare i nodi e come mantenerli aggiornati, quali riferimenti tenere ad ogni ciclo e in che ordine inserirli, nonchè fino a quando proseguire nell'operazione. Una volta che hai ben chiaro il processo, scrivi il codice corrispondente. Se non funziona nella testa o sulla carta, non funziona anche a PC.

    Se codifichi direttamente in Pascal, esegui il tuo programma passo per passo e vedrai *esattamente* perchè l'algoritmo non funziona: monitorizzando lo stato delle variabili e le operazioni che vengono eseguite, noterai anche direttamente quali passaggi vengono saltati e cosa manca affinchè tutto funzioni nel modo corretto.

    Spero di averti dato indicazioni utili.

    Purtroppo non ho sempre il tempo di risolvere i quesiti e scrivere il codice sorgente. :quipy:

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

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

  5. #15
    Utente di HTML.it L'avatar di gokan
    Registrato dal
    Feb 2003
    Messaggi
    262
    Originariamente inviato da alka
    Non so dirti perchè non riesci a fare il debug da solo...

    Secondo il mio modesto parere, ti scoccia anche un po' farlo...
    Il fatto che fornisco sempre il codice delle mie funzioni non significa certo che lo butto lì e poi voglio che tu mi faccia il debug


    Purtroppo non ho sempre il tempo di risolvere i quesiti e scrivere il codice sorgente. :quipy:

    Ciao!
    E' giusto che tu non scriva sempre del codice per noi, non è questo il modo di imparare a programmare.
    Purtroppo devo dire che hai ragione qundo dici che ancora non so analizzare un problema dal punto di vista algoritmico.
    Di fronte un problema un buon programmatore (io non lo sono) ha già in testa quello che deve fare, non necessariamente buttando giù del codice, ma analizzando passo-passo il problema....Azz più facile a dirsi che a farsi

    I tuoi consigli restano comunque ben accetti.

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 © 2026 vBulletin Solutions, Inc. All rights reserved.