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