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![]()

Rispondi quotando
