Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2013
    residenza
    Bologna
    Messaggi
    31

    Programmazione [C] liste doppiamente linkate

    Ciao a tutti ragazzi,
    sto provando ad implementare le liste doppiamente puntate in C. Ho soltanto un piccolo problema per quanto riguarda il puntatore all'elemento precedente; mi spiego: una volta che ho implementato tutto il codice e scorro la lista nel suo ordine naturale, tutto fila liscio e riesco a stampare i dati. Nel momento in cui provo a stampare la lista nell'ordine inverso, il programma va in crash. Ora, sono quasi certamente sicuro che questo avviene perché la mia sentinella viene utilizzata in modo errato o , almeno, è quello che credo. Questa, infatti, la sto passando alla funzione inserisciInTesta per valore, poiché se provo a passarla per indirizzo, il compilatore fa le bizze: vi faccio vedere:

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    
    
    typedef struct EL ElemLista;
    typedef ElemLista *PElemLista;
    
    
    //DICHIARO LA STRUTTURA DELLA LISTA A DOPPIO PUNTATORE (HO L'INFORMAZIONE DELL'ELEMENTO PRECEDENTE E SUCCESSIVO)
    struct EL{
    //RAPPRESENTA L'INFORMAZIONE
    int Info;
    //PUNTATORE ALL'ELEMENTO PRECEDENTE
    PElemLista Prec;
    //PUNTATORE ALL'ELEMENTO SUCCESSIVO
    PElemLista Next;
    };
    
    
    
    
    //INIZIALIZZAZIONE LISTA
    void inizializzaLista(PElemLista *P){
        *P=NULL;
    }
    
    
    //INSERIMENTO IN TESTA
    void inserisciInTesta(PElemLista *p, PElemLista Sentinella){
        int i, val, n;
        PElemLista q,h,l;
    
    
        //INSERISCO IL PRIMO ELEMENTO
        printf("INDICA IL NUMERO DI ELEMENTI DA INSERIRE: ");
        scanf("%d", &n);
    
    
        for(i=0; i<n; i++){
            if(i==0){
                q =(PElemLista)malloc(sizeof(ElemLista));
                printf("INSERISCI IL VALORE DELL'ELEMENTO %d^ : ", i+1);
                scanf("%d", &val);
                q->Info = val;
                *p=q;
                q->Next = NULL;
                q->Prec = *p;
                Sentinella = *p;
                Sentinella->Next = NULL;
                //PULISCO IL PUNTATORE PER RIUTILIZZARLO IN UN NUOVO INSERIMENTO
                q = NULL;
            }else{
                q = (PElemLista)malloc(sizeof(ElemLista));
                printf("INSERISCI IL VALORE DELL'ELEMENTO %d^ : ", i+1);
                scanf("%d", &val);
                q->Info = val;
                q->Next = *p;
                *p = q;
                q->Prec = *p;
            }
        }
        //UNA VOLTA INSERITI TUTTI GLI ELEMENTI, ESEGUO UN CICLO CHE COLLEGA TUTTI I PUNTATORI AL'ELEMENTO PRECEDENTE
        //COSI' DA RICREARE IL DOPPIO PUNTAMENTO
        for(h=*p; h!=NULL; h = h->Next){
            l = h->Next;
            if(l != NULL){
                l->Prec = h;
            }
        }
    }
    
    
    //STAMPO TUTTI GLI ELEMENTI DELLA LISTA IN ORDINE DI INSERIMENTO - DALL'ULTIMO INSERITO AL PRIMO
    void stampaLista(PElemLista p){
        PElemLista q;
        q = p;
        printf("ELEMETI DELLA LISTA IN ORDINE DI INSERIMENTO....\n");
        while(q!=NULL){
            printf("- %d - ", q->Info);
            q = q->Next;
        }
        printf("\n");
    }
    
    
    //STAMPO TUTTI GLI ELEMENTI DELLA LISTA IN ORDINE INVERSO - DAL PRIMO INSERITO ALL'ULTIMO
    void stampaListaInversa(PElemLista p, PElemLista Sentinella){
        PElemLista q, h;
        q = p;
        h = Sentinella;
         printf("ELEMETI DELLA LISTA IN ORDINE INVERSO RISPETTO L'INSERIMENTO....\n");
        while(q != h){
            printf("- %d - ", h->Info);
            h = h->Prec;
        }
    }
    
    
    int main(){a
        //DICHIARO LA TESTA DELLA LISTA
        PElemLista *Head;
        //DICHIARO LA SENTINELLA
        PElemLista *Sentinella;
        //INIZIALIZZO LA LISTA
        inizializzaLista(&Head);
        //INSERIMENTO IN TESTA
        inserisciInTesta(&Head, Sentinella);
        //STAMPO LA LISTA IN ORDINE DI INSERIMENTO
        stampaLista(Head);
        //STAMPO LA LISTA IN ORDINE INVERSO - DA CUI SI DENOTA L'UTILIZZO DEL DOPPIO PUNTATORE
        stampaListaInversa(Head, Sentinella);
        return 0;

    Se provo, invece, a passare la sentinella per indirizzo, quindi inserisciInTesta(&Head, &Sentinella), così che questa abbia sempre, realmente, l'indirizzo dell'ultimo elemento inserito, il compilatore mi dice:
    codice:
    c\main.c|46|error: request for member `Next' in something not a structure or union|
    ||=== Build failed: 1 error(s), 7 warning(s) (0 minute(s), 0 second(s)) ===|

    RIPORTO L'IMMAGINE: Senza titolo-2.jpg


    Grazie mille
    Ultima modifica di gmac; 13-06-2016 a 13:40 Motivo: INSERITO PEZZO DI CODICE MANCANTE

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    Sentinella è dichiarato come puntatore a PElemLista

    PElemLista *Sentinella;

    ma poi viene usato come se fosse

    PElemLista Sentinella;
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2013
    residenza
    Bologna
    Messaggi
    31
    Quote Originariamente inviata da oregon Visualizza il messaggio
    Sentinella è dichiarato come puntatore a PElemLista

    PElemLista *Sentinella;

    ma poi viene usato come se fosse

    PElemLista Sentinella;
    Ciao Oregon, grazie mille per avermi risposto

    Quindi dovrei dichiararla come variabile globale, magari? Cosa ne dici? Potrebbe essere quello il problema?

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    Non è questo il problema. Devi riflettere sul perché c'è questa differenza e capire quale delle due usare, correggendo la parte sbagliata.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it
    Registrato dal
    Dec 2013
    residenza
    Bologna
    Messaggi
    31
    Grazie del consiglio; tu hai già capito dove potrebbe essere il problema?

  6. #6
    Utente di HTML.it
    Registrato dal
    Dec 2013
    residenza
    Bologna
    Messaggi
    31
    Ok, ho capito che Sentinella va dichiarata come ElemLista *Sentinella e non come PElemLista *Sentinella, ma dopodiché continuo problemi nello stampare i dati in ordine inverso; qualcuno ha idee?

  7. #7
    Utente di HTML.it
    Registrato dal
    Dec 2013
    residenza
    Bologna
    Messaggi
    31
    Va bene nessuno ha idea del perché.

    Grazie lo stesso!!!!!!

Tag per questa discussione

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.