codice:
#include<stdio.h>
#include<malloc.h>
struct ele{
int val;
struct ele *next;
};
int menu (void);
struct ele *crea_lista(void);
void stampa_lista(struct ele *punt_lista);
struct ele * canc_testa(struct ele *a);
void canc_coda(struct ele *a);
struct ele* ins_testa(struct ele *a,int val);
struct ele* ins_coda(struct ele*a,int val);
int main(){
struct ele *punt_lista;
punt_lista=NULL; // è bene inizializzare altrimenti non riconosce che se la lista è vuota non c'è nulla da cancellare!
int valore; //PUNTATORE ALLA LISTA
int scelta;
while(scelta=menu()){
switch(scelta){
case 1:
system("CLS");
printf("***INSERIMENTO DATI***\n");
punt_lista=crea_lista();
break;
case 2:
system("CLS");
printf("***CANCELLAZIONE ELEMENTO IN TESTA***\n");
punt_lista=canc_testa(punt_lista);
break;
case 3:
system("CLS");
printf("***STAMPA LISTA***\n");
stampa_lista(punt_lista);
break;
case 4:
system("CLS");
printf("***RICERCA DATI***\n");
break;
case 5:
system("CLS");
printf("***INSERIMENTO ELEMENTO IN TESTA***\n");
printf("Inserisci ora l'elemento nuovo: ");
scanf("%d",&valore);
punt_lista=ins_testa(punt_lista,valore);
break;
case 6:
system("CLS");
printf("***INSERIMENTO ELEMENTO CODA***\n");
printf("Inserisci ora l'elemento nuovo: ");
scanf("%d",&valore);
punt_lista=ins_coda(punt_lista,valore);
break;
case 7:
system("CLS");
printf("***CANCELLAZIONE ELEMENTO IN CODA***\n");
canc_coda(punt_lista);
break;
case 0:
return 0;
}
}
return 0;
}
int menu (void){
int x;
printf("\nSELEZIONA LA TUA SCELTA\n");
printf("1.Per inserire \n");
printf("2.Per cancellare elemento in testa \n");
printf("3.Per stampare la lista \n");
printf("4.Per cercare un elemento \n");
printf("5.Per inserire elemento in testa \n");
printf("6.Per inserire elemento in coda\n ");
printf("7.Per cancellare elemento in coda\n ");
printf("0.Per uscire \n\n");
printf("Digita ora la scelta: ");
scanf("%d",&x);
while(x<0 || x>7){
printf("Hai sbagliato a digitare!\n\n");
printf("Fai la scelta giusta!: ");
scanf("%d",&x);
}
return x;
}
struct ele * crea_lista (void){
struct ele *p,*paus;
int x,i;
printf("quanti valori vuoi inserire nella lista? \n\n");
scanf("%d",&x);
if(x==0)
p=NULL;
else{
p=(struct ele*)malloc(sizeof(struct ele)); //INIZIALIZZO IL PUNTATORE
printf("Inserisci il primo elemento della lista: ");
scanf("%d",&p->val);
paus=p;
for(i=2;i<=x;i++){
paus->next=(struct ele*)malloc(sizeof(struct ele));
paus=paus->next;
printf("Inserisci l'elemento numero %d : ",i);
scanf("%d",&paus->val);
}
paus->next=NULL; //marca di fine lista,è importante perchè in fase di compilazione
// non da errore ma se compili va avanti fino ad esaurimento memoria,penso.
}
return p;
}
void stampa_lista(struct ele *punt_lista){
printf("punt_lista---->");
while(punt_lista!=NULL){
printf(" %d ",punt_lista->val);
printf("---->");
punt_lista=punt_lista->next;
}
printf("NULL\n");
}
struct ele* canc_testa(struct ele *a){
struct ele *tmp;
if(a==NULL)
printf("Non c'e' NULLA da cancellare\n");
else{
tmp=a;
a=tmp->next;
free(tmp);
}
return a;
}
void canc_coda(struct ele *a){
struct ele*tmp;
if (a==NULL)
printf("Non c'e' niente da cancellare!\n");
else{
while(a!=NULL)
a=a->next;
}
tmp=a;
free(tmp);
}
struct ele* ins_testa(struct ele *a,int val){
struct ele *tmp;
tmp=a;
a=(struct ele *)malloc(sizeof(struct ele));
a->val=val;
a->next=tmp;
return a;
}
struct ele* ins_coda(struct ele*a,int val){
if(a==NULL){
a=(struct ele *)malloc(sizeof(struct ele));
a->val=val;
a->next=NULL;
}
else{
a=ins_coda(a->next,val);
}
return a;
}
Il problema lo trovo proprio nell'inserimento in coda; mi spiego meglio, se nello switch scelgo di inserire in coda, dopo aver effettuato l'inserimento, visualizzo correttamente la mia mia inserzione richiamando la funzione stampa. Se vado a richiedere di inserire in coda il nuovo valore che passo da tastiera si sovrascrive al valore che precedentemente avevo inserito, pertanto non ha memoria.
Inoltre se nello switch invoco prima la funzione crea lista con una un numero predeterminato di elementi, e successivamente a ciò chiedo di inserire in coda, il valore che passo da tastiera non viene attaccato alla lista, anzi, si sovrascrive ai dati già inseriti, mentre se invoco la funzione di inserimento in testa, questa ha memoria, quindi funziona.
Ora, io credo che l'errore sia nel valore di ritorno della funzione "ins_coda" e "crea_lista", però non sono così sicuro, vorrei una dritta per capire l'errore.
Oppure potrebbe essre un problema di collegamento fra loro? Cioè fra le due funzioni in questione.
Grazie, Luca