Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2010
    Messaggi
    152

    [C] liste doppiamente concatenate

    Ciao a tutti volevo creare una lista doppiamente concatenata dove posso gestire oltre che a puntatore next a un puntatore prev che ritorna il valore che sta prima di un nodo.
    Il mio problema è che non so come gestire il "prev". Come faccio ad assegnare i valori di prev? Vi mostro cosa ho fatto fin ora

    codice:
    #include <stdio.h>
    
    struct elemento{
           int info;
           struct elemento *next;
           struct elemento *prev;
           };
           
    struct elemento *crealista(){
           struct elemento *p;
           printf("Quanti elementi vuoi agigungere?\n");
           int n;
           scanf("%d",&n);
           printf("Scrivi %d elementi \n",n);
           int i;
           for(i=0; i<n; i++){
                    p=(struct elemento*)calloc(sizeof(struct elemento),sizeof(struct elemento));        
                    printf("scrivi l'elemento %d :",i);
                    scanf("%d",&p->info);
                    p->prev=(&p->info);              //QUA STO TIRANDO A CASO
                    p=p->next;
                    return p;
                    }
                    }

  2. #2
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    codice:
    p->prev=(&p->info);
    &(p->info) è un puntatore a int, p->prev un puntatore a elemento

    Non fare tutto nel main, dividi il problema in sottoproblemi, usa le funzioni.
    Il modo mogliore è di creare un elemento simbolico, la sentinella che è un elemento che non va mai letto, saiq aundo fermarti a leggere la lista quando incontri la sentinella:
    codice:
    elemento *p;
    p=(struct elemento*)malloc(sizeof(struct elemento));
    p->prev=p;
    p->next=p;
    Questa è una lista bidirezionale con sentinella.

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2010
    Messaggi
    152
    ma come fa il metodo a capire che prev è il precedente e che next e il prossimo? in teoria non dovrei fare una procedura del genere:

    p->info salva informazione
    p->next null or continua a interrogare l input
    p->prev salva informazione di p->info solo se p->next!= null

  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2011
    Messaggi
    41
    Non c'è bisogno di tirare a caso

    Direi che ti manca un puntatore all'ultimo elemento creato. Tale puntatore (chiamiamolo pp) deve essere inizializzato a NULL; all'interno del ciclo, dopo aver controllato che pp non sia NULL, valorizzerai pp->next con il nuovo elemento p (ovviamente dopo averlo creato); a questo punto p->prev dovrà essere valorizzato con pp e dopo, soltanto dopo, sempre all'interno del ciclo pp deve essere aggiornato con il valore di p.

    Tutto chiaro?

    Stefano.

  5. #5
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    Non è che "deve essere NULL", dipende da come fai la lista.
    Nelle liste con sentinella per capire quando finire di leggere gli elementi, non si controlla che il puntatore sia NULL.Ma si controlla che non si abbia raggiunto la sentinella.
    La sentinella è un elemento simbolico, che dice quando la lista inizia e finisce (è circolare per cui non si rischia di andare in segmentation fault).
    Esempio:
    codice:
    elemento *sentinella=(struct elemento*)malloc(sizeof(struct elemento));
    sentinella->next=sentinella;
    sentinella->prev=sentinella;
    elemento *ptr=sentinella;
    while(ptr!=sentinella)
        ptr=ptr->next;
    Ovviamente qua la lista è vuota per cui non si entra nemmeno una volta nel corpo del while.
    Per aggiungere elemento allochi una nuova cella.Gli elementi vanno collegati.
    Per capire come funziona bisogna conoscere i puntatori, se questo esempio non ti è chiaro ti consiglio di ripassarti i puntatori.

  6. #6
    Utente di HTML.it
    Registrato dal
    Sep 2011
    Messaggi
    41
    Ramy89,

    non ho bisogno dei tuoi consigli su come si usano i puntatori.

    Innanzitutto la mia risposta, se leggi bene, non era rivolta al tuo post.
    Inoltre le perplessità di keykode20 erano riferite all'assegnazione dell'elemento .prev che è alla base del concetto di "lista doppiamente concatenata", per cui è perfettamente inutile che tu gli faccia ulteriore confusione con tecniche "avanzate" come quella della sentinella (che comunque può essere un metodo pratico per evitare casini).

  7. #7
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    Originariamente inviato da SancheZ
    Ramy89,

    non ho bisogno dei tuoi consigli su come si usano i puntatori.

    Innanzitutto la mia risposta, se leggi bene, non era rivolta al tuo post.
    Inoltre le perplessità di keykode20 erano riferite all'assegnazione dell'elemento .prev che è alla base del concetto di "lista doppiamente concatenata", per cui è perfettamente inutile che tu gli faccia ulteriore confusione con tecniche "avanzate" come quella della sentinella (che comunque può essere un metodo pratico per evitare casini).
    Era per lui il post, non per te.
    Tu stai dando consigli, apriti un libro e studia invece.I consigli li da chi sa fare una cosa, non che uno prova a dire, magari dicendo anche bagiannate, così tanto per fare e poi se erano sbagliati o contorti chissene

  8. #8
    Utente di HTML.it
    Registrato dal
    Sep 2011
    Messaggi
    41
    Originariamente inviato da ramy89
    Era per lui il post, non per te.
    Tu stai dando consigli, apriti un libro e studia invece.I consigli li da chi sa fare una cosa, non che uno prova a dire, magari dicendo anche bagiannate, così tanto per fare e poi se erano sbagliati o contorti chissene
    Credo di aver studiato abbastanza, ma tu questo non puoi saperlo, dato che non mi conosci. E dubito che anche aprendo un libro tu riesca veramente a capire quello che vi sta scritto, visto che non riesci nemmeno ad interpretare quello che viene scritto nei post.

    Sei solo un moccioso presuntuoso e saccente.

  9. #9
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    Ma come ti permetti ? Non c'è paragone, sei una nullità rispetto a me, non sai programmare

    credo di aver studiato abbastanza, ma tu questo non puoi saperlo, dato che non mi conosci
    Dal tuo post non mi sembra che hai studiato abbastanza per poter rispondere
    Tu hai detto questo:

    Originariamente inviato da SancheZ
    Non c'è bisogno di tirare a caso

    Direi che ti manca un puntatore all'ultimo elemento creato. Tale puntatore (chiamiamolo pp) deve essere inizializzato a NULL; all'interno del ciclo, dopo aver controllato che pp non sia NULL, valorizzerai pp->next con il nuovo elemento p (ovviamente dopo averlo creato); a questo punto p->prev dovrà essere valorizzato con pp e dopo, soltanto dopo, sempre all'interno del ciclo pp deve essere aggiornato con il valore di p.

    Tutto chiaro?

    Stefano.
    Fammi vedere cosa scrivi a livello di codice.E spiega perchè nelle liste è obbligatorio finire di leggere gli elementi quando si incontra NULL, e non è possibile utilizzare altri metodi.

  10. #10
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472

    Moderazione

    Mi pare che la discussione sia scaduta in un flame abbastanza sterile e immotivato, per cui suggerisco a tutti di darsi una calmata, e invito l'autore della discussione ad aprirne una nuova, a cui si possono dare suggerimenti evitando di scadere in un dialogo come questo.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

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

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.